[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32544] trunk/blender: bugfix [#24302] Ctrl+Click Extrude gets old mouse events

Campbell Barton ideasman42 at gmail.com
Mon Oct 18 02:25:32 CEST 2010


Revision: 32544
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32544
Author:   campbellbarton
Date:     2010-10-18 02:25:32 +0200 (Mon, 18 Oct 2010)

Log Message:
-----------
bugfix [#24302] Ctrl+Click Extrude gets old mouse events
double click didnt check mouse distance moved so you could click twice in different areas of the screen very fast and generate a double click event which had old mouse coords copied into it but was sent to an operator set to run on single click (because the double click wasnt handled).

Also added MEM_name_ptr function (included in debug mode only), prints the name of allocated memory.
used for debugging where events came from.

Modified Paths:
--------------
    trunk/blender/intern/guardedalloc/MEM_guardedalloc.h
    trunk/blender/intern/guardedalloc/intern/mallocn.c
    trunk/blender/source/blender/editors/interface/interface_icons.c
    trunk/blender/source/blender/editors/mesh/editmesh_add.c
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
    trunk/blender/source/blender/windowmanager/wm_event_system.h

Modified: trunk/blender/intern/guardedalloc/MEM_guardedalloc.h
===================================================================
--- trunk/blender/intern/guardedalloc/MEM_guardedalloc.h	2010-10-17 23:32:48 UTC (rev 32543)
+++ trunk/blender/intern/guardedalloc/MEM_guardedalloc.h	2010-10-18 00:25:32 UTC (rev 32544)
@@ -150,6 +150,10 @@
 	/*get the peak memory usage in bytes, including mmap allocations*/
 	uintptr_t MEM_get_peak_memory(void);
 
+#ifndef NDEBUG
+const char *MEM_name_ptr(void *vmemh);
+#endif
+	
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/intern/guardedalloc/intern/mallocn.c
===================================================================
--- trunk/blender/intern/guardedalloc/intern/mallocn.c	2010-10-17 23:32:48 UTC (rev 32543)
+++ trunk/blender/intern/guardedalloc/intern/mallocn.c	2010-10-18 00:25:32 UTC (rev 32544)
@@ -856,4 +856,18 @@
 	return _totblock;
 }
 
+#ifndef NDEBUG
+const char *MEM_name_ptr(void *vmemh)
+{
+	if (vmemh) {
+		MemHead *memh= vmemh;
+		memh--;
+		return memh->name;
+	}
+	else {
+		return "MEM_name_ptr(NULL)";
+	}
+}
+#endif
+
 /* eof */

Modified: trunk/blender/source/blender/editors/interface/interface_icons.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_icons.c	2010-10-17 23:32:48 UTC (rev 32543)
+++ trunk/blender/source/blender/editors/interface/interface_icons.c	2010-10-18 00:25:32 UTC (rev 32544)
@@ -864,14 +864,7 @@
 		glPixelTransferf(GL_GREEN_SCALE, rgb[1]);
 		glPixelTransferf(GL_BLUE_SCALE, rgb[2]);
 	}
-	
-	if(is_preview == 0) {
-		/* position */
-		glRasterPos2f(x,y);
-	}
 
-	/* draw */
-
 	/* rect contains image in 'rendersize', we only scale if needed */
 	if(rw!=w && rh!=h) {
 		/* first allocate imbuf for scaling and copy preview into it */
@@ -881,8 +874,14 @@
 		rect= ima->rect;
 	}
 
-	if(is_preview)	glaDrawPixelsSafe(x, y, w, h, w, GL_RGBA, GL_UNSIGNED_BYTE, rect);
-	else			glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+	/* draw */
+	if(is_preview) {
+		glaDrawPixelsSafe(x, y, w, h, w, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+	}
+	else {
+		glRasterPos2f(x, y);
+		glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+	}
 
 	if(ima)
 		IMB_freeImBuf(ima);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_add.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_add.c	2010-10-17 23:32:48 UTC (rev 32543)
+++ trunk/blender/source/blender/editors/mesh/editmesh_add.c	2010-10-18 00:25:32 UTC (rev 32544)
@@ -114,13 +114,9 @@
 	float min[3], max[3];
 	int done= 0;
 	short use_proj;
-	wmWindow *win= CTX_wm_window(C);
-
+printf("%d\n", event->val);
 	em_setup_viewcontext(C, &vc);
 
-	printf("\n%d %d\n", event->x, event->y);
-	printf("%d %d\n", win->eventstate->x, win->eventstate->y);
-
 	use_proj= (vc.scene->toolsettings->snap_flag & SCE_SNAP) &&	(vc.scene->toolsettings->snap_mode==SCE_SNAP_MODE_FACE);
 	
 	invert_m4_m4(vc.obedit->imat, vc.obedit->obmat); 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-10-17 23:32:48 UTC (rev 32543)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-10-18 00:25:32 UTC (rev 32544)
@@ -1452,11 +1452,24 @@
 		wmWindow *win = CTX_wm_window(C);
 
 		if (win && win->eventstate->prevtype == event->type && win->eventstate->prevval == KM_PRESS) {
-			/* test for double click first */
-			if ((PIL_check_seconds_timer() - win->eventstate->prevclicktime) * 1000 < U.dbl_click_time) {
+			/* test for double click first,
+			 * note1: this can be problematic because single click operators can get the
+			 *   double click event but then with old mouse coords which is highly confusing,
+			 *   so check for mouse moves too.
+			 * note2: the first click event will be handled but still used to create a
+			 *   double click event if clicking again quickly.
+			 *   If no double click events are found itwill fallback to a single click.
+			 *   So a double click event can result in 2 successive single click calls
+			 *   if its not handled by the keymap - campbell */
+			if (	(ABS(event->x - win->eventstate->prevclickx)) <= 2 &&
+					(ABS(event->y - win->eventstate->prevclicky)) <= 2 &&
+					((PIL_check_seconds_timer() - win->eventstate->prevclicktime) * 1000 < U.dbl_click_time)
+			) {
 				event->val = KM_DBL_CLICK;
-				event->x = win->eventstate->prevclickx;
-				event->y = win->eventstate->prevclicky;
+				/* removed this because in cases where we're this is used as a single click
+				 * event, this will give old coords, since the distance is checked above, using new coords should be ok. */
+				//   event->x = win->eventstate->prevclickx;
+				//   event->y = win->eventstate->prevclicky;
 				action |= wm_handlers_do(C, event, handlers);
 			}
 

Modified: trunk/blender/source/blender/windowmanager/wm_event_system.h
===================================================================
--- trunk/blender/source/blender/windowmanager/wm_event_system.h	2010-10-17 23:32:48 UTC (rev 32543)
+++ trunk/blender/source/blender/windowmanager/wm_event_system.h	2010-10-18 00:25:32 UTC (rev 32544)
@@ -84,7 +84,6 @@
 
 
 /* wm_event_system.c */
-void		wm_event_add			(wmWindow *win, wmEvent *event_to_add);
 void		wm_event_free_all		(wmWindow *win);
 void		wm_event_free			(wmEvent *event);
 void		wm_event_free_handler	(wmEventHandler *handler);





More information about the Bf-blender-cvs mailing list