[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