Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-10-18 04:25:32 +0400
committerCampbell Barton <ideasman42@gmail.com>2010-10-18 04:25:32 +0400
commit433f871f0f6bc68fbb1fffbdac42ef1bb8b5d019 (patch)
treef6a920d95309bfd69865ee942829f72ea4e3157c /source
parentc7c128f03b1a5bd95946ef5b2d1f9e46abd76ce7 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/interface/interface_icons.c17
-rw-r--r--source/blender/editors/mesh/editmesh_add.c6
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c21
-rw-r--r--source/blender/windowmanager/wm_event_system.h1
4 files changed, 26 insertions, 19 deletions
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 39e062a13aa..0ade3e6199f 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -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);
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index 525867d74c0..89991015419 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -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);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index f2b880bd0d5..47ca4314cc7 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -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);
}
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 8fd650fb184..4888f9aced3 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -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);