bugfix [#24302] Ctrl+Click Extrude gets old mouse events
authorCampbell Barton <ideasman42@gmail.com>
Mon, 18 Oct 2010 00:25:32 +0000 (00:25 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 18 Oct 2010 00:25:32 +0000 (00:25 +0000)
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.

intern/guardedalloc/MEM_guardedalloc.h
intern/guardedalloc/intern/mallocn.c
source/blender/editors/interface/interface_icons.c
source/blender/editors/mesh/editmesh_add.c
source/blender/windowmanager/intern/wm_event_system.c
source/blender/windowmanager/wm_event_system.h

index 6b78b0b6bdc987ad8ea798f6fe8018bedd6a00c7..dfb8b2db1b1f3b245e21dfb6e461e42d513f0264 100644 (file)
@@ -150,6 +150,10 @@ extern "C" {
        /*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
index 09f2d33a674dee1a7402f56063a3fb620702e553..b213a1c3744d3409a9a317370709d1356107f13b 100644 (file)
@@ -856,4 +856,18 @@ int MEM_get_memory_blocks_in_use(void)
        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 */
index 39e062a13aadb7faa8aa9b96c2293237cfc6143a..0ade3e6199fd16e59ccb88358bf5a4432d3bbb5e 100644 (file)
@@ -864,13 +864,6 @@ static void icon_draw_rect(float x, float y, int w, int h, float UNUSED(aspect),
                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) {
@@ -881,8 +874,14 @@ static void icon_draw_rect(float x, float y, int w, int h, float UNUSED(aspect),
                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);
index 525867d74c01e0fe139dabf32bd74211f4e46bd5..89991015419b9a9457ff1bd08e575b75338975d5 100644 (file)
@@ -114,13 +114,9 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
        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); 
index f2b880bd0d51fb73bfc1e4d206482a38414962b8..47ca4314cc7ee97dd1e004bb93ec393cbc67690e 100644 (file)
@@ -1452,11 +1452,24 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
                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);
                        }
 
index 8fd650fb184acb445ffa5d582a4c7d06255aa2f0..4888f9aced36fde482a4c8bbfcbcdd46c0fde87e 100644 (file)
@@ -84,7 +84,6 @@ enum {
 
 
 /* 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);