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.
This commit is contained in:
Campbell Barton 2010-10-18 00:25:32 +00:00
parent c7c128f03b
commit 433f871f0f
6 changed files with 44 additions and 19 deletions

@ -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

@ -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 */

@ -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);

@ -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);

@ -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);
}

@ -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);