[Bf-committers] Patch- 3d view Object sel menu
Daniel Dunbar
bf-committers@blender.org
Sun, 18 Jul 2004 17:01:26 -0700 (PDT)
I wasn't actually talking about the [512] buffer (although I
generally advocate just using a dynamic string (BLI_dynStr for
example) so you don't have to even think about whether there
is an overflow risk. (Although I agree, currently [512] is
probably safe). However, menuIndexChar will overrun as soon
as you have more than 10 items in a menu.
--- Campbell Barton <cbarton@metavr.com> wrote:
> Wheres the bug? how can I fix it?
> - Cam
>
> Daniel Dunbar wrote:
>
> >This code has a potential bug of overwriting the stack
> >in the string handling code.
> >
> >--- Campbell Barton <cbarton@metavr.com> wrote:
> >
> >
> >>Hi all
> >>This patch pops up a menu of all objects under the mouse and Alt+RMP
> >>I quite like it for large scenes where you have meny objects.
> >>
> >>- Cam
> >>
> >>
> >>>Index: source/blender/src/editview.c
> >>>
> >>>
> >>===================================================================
> >>RCS file: /cvsroot/bf-blender/blender/source/blender/src/editview.c,v
> >>retrieving revision 1.25
> >>diff -u -r1.25 editview.c
> >>--- source/blender/src/editview.c 16 Jul 2004 01:34:19 -0000 1.25
> >>+++ source/blender/src/editview.c 18 Jul 2004 07:52:34 -0000
> >>@@ -539,6 +539,9 @@
> >> }
> >> }
> >>
> >>+/* The max number of menu items in an object select menu */
> >>+#define SEL_MENU_SIZE 22
> >>+
> >> void mouse_select(void)
> >> {
> >> Base *base, *startbase=NULL, *basact=NULL, *oldbasact=NULL;
> >>@@ -546,6 +549,14 @@
> >> int temp, a, dist=100;
> >> short hits, mval[2];
> >>
> >>+ /* menuText should be the initial size of text (22 atm) + ( SEL_MENU_SIZE * 26)
> >>+ 26 being the longest possible length for a menu item */
> >>+ char menuText[512] = "Select Object%t";
> >>+ char menuIndexChar[2];
> >>+ short baseCount = 0;
> >>+ Base *baseList[SEL_MENU_SIZE]; /* baseList is used to store all possible bases to bring up
> a
> >>menu */
> >>+ /*end select menu */
> >>+
> >> /* always start list from basact */
> >> startbase= FIRSTBASE;
> >> if(BASACT && BASACT->next) startbase= BASACT->next;
> >>@@ -589,15 +600,55 @@
> >> if(base->lay & G.vd->lay) {
> >> for(a=0; a<hits; a++) {
> >> /* index was converted */
> >>- if(base->selcol==buffer[ (4 * a) + 3 ]) basact= base;
> >>+ if(base->selcol==buffer[ (4 * a) + 3 ]) {
> >>+
> >>+ /* Generate menu text */
> >>+ if (G.qual & LR_ALTKEY) {
> >>+ if (baseCount < SEL_MENU_SIZE) {
> >>+ baseList[baseCount] = base;
> >>+ strcat(menuText, "|"); /* Seperate menu items */
> >>+ sprintf(menuIndexChar, "%d", baseCount+1); /* Turn Base count into a string */
> >>+ strcat(menuText, base->object->id.name+2); /*Object name*/
> >>+ strcat(menuText, "%x");
> >>+ strcat(menuText, menuIndexChar);
> >>+ baseCount++;
> >>+ } /* end generating menu*/
> >>+ } else { /* no altkey, no menu */
> >>+ basact= base; /* No menu so we need to do this now */
> >>+ }
> >>+ }
> >> }
> >> }
> >>- if(basact) break;
> >>+
> >>+ /* Act normaly if Menu isnt being used */
> >>+ if (!(G.qual & LR_ALTKEY)) {
> >>+ if(basact) break; /* No menu so we need to do this now */
> >>+ }
> >>
> >> base= base->next;
> >> if(base==0) base= FIRSTBASE;
> >> if(base==startbase) break;
> >> }
> >>+
> >>+
> >>+ /* Menu only if the altkey is pressed */
> >>+ if (G.qual & LR_ALTKEY) {
> >>+ /* USE MENU IF MORE THEN 1 ITEM ARE UNDER THE MOUSE*/
> >>+ if (baseCount == 1) { /* Only 1 item, dont bother with a menu */
> >>+ base = baseList[0];
> >>+ basact = base;
> >>+ } else { /* We have more then 1 item under the mouse cursor */
> >>+ baseCount = pupmenu(menuText);
> >>+
> >>+ if (baseCount != -1) { /* If nothing is selected then dont do anything */
> >>+ base = baseList[baseCount-1];
> >>+ basact = base;
> >>+ } else {
> >>+ return; /* No menu item selected so give up now */
> >>+ }
> >>+ }
> >>+ } /*end altkey/menu option*/
> >>+
> >> }
> >> }
> >>
> >>Index: source/blender/src/header_view3d.c
> >>===================================================================
> >>RCS file: /cvsroot/bf-blender/blender/source/blender/src/header_view3d.c,v
> >>retrieving revision 1.59
> >>diff -u -r1.59 header_view3d.c
> >>--- source/blender/src/header_view3d.c 16 Jul 2004 02:10:52 -0000 1.59
> >>+++ source/blender/src/header_view3d.c 18 Jul 2004 07:52:39 -0000
> >>@@ -1041,6 +1041,24 @@
> >> case 4: /* Select Same UV */
> >> get_same_uv();
> >> break;
> >>+ case 5: /* Select Same Material */
> >>+ get_same_mat();
> >>+ break;
> >>+ case 6: /* Select Same Mode */
> >>+ get_same_mode();
> >>+ break;
> >>+ case 7: /* Select Same Normal */
> >>+ get_same_normal();
> >>+ break;
> >>+ case 8: /* Select Same Area */
> >>+ get_same_area();
> >>+ break;
> >>+ case 9: /* Select Same Vert colour */
> >>+ get_same_vcol();
> >>+ break;
> >>+ case 10: /* Select Same Vert colour */
> >>+ get_same_uvco();
> >>+ break;
> >> }
> >> allqueue(REDRAWVIEW3D, 0);
> >> }
> >>@@ -1059,7 +1077,16 @@
> >>
> >> uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20,
> >>menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
> >> uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse", 0, yco-=20,
> menuwidth,
> >>19, NULL, 0.0, 0.0, 1, 3, "");
> >>- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV", 0, yco-=20,
> menuwidth,
> >>19, NULL, 0.0, 0.0, 1, 4, "");
> >>+
> >>+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
> >>+
> >>+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV Image", 0, yco-=20,
> >>menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
> >>+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Material", 0, yco-=20,
> menuwidth,
> >>19, NULL, 0.0, 0.0, 1, 5, "");
> >>+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Mode", 0, yco-=20, menuwidth,
> 19,
> >>NULL, 0.0, 0.0, 1, 6, "");
> >>+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Normal", 0, yco-=20, menuwidth,
> >>19, NULL, 0.0, 0.0, 1, 7, "");
> >>+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Area", 0, yco-=20, menuwidth,
> 19,
> >>NULL, 0.0, 0.0, 1, 8, "");
> >>+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same Vert Col", 0, yco-=20,
> menuwidth,
> >>19, NULL, 0.0, 0.0, 1, 9, "");
> >>+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV Coords", 0, yco-=20,
> >>menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
> >>
> >> if(curarea->headertype==HEADERTOP) {
> >> uiBlockSetDirection(block, UI_DOWN);
> >>@@ -1072,6 +1099,7 @@
> >> uiTextBoundsBlock(block, 50);
> >> return block;
> >> }
> >>+
> >>
> >> void do_view3d_edit_snapmenu(void *arg, int event)
> >> {
> >>
> >>
> >>
> >
> >
> >=====
> >daniel dunbar
> >daniel@zuster.org
> >_______________________________________________
> >Bf-committers mailing list
> >Bf-committers@blender.org
> >http://www.blender.org/mailman/listinfo/bf-committers
> >
> >
> >
>
=== message truncated ===
=====
daniel dunbar
daniel@zuster.org