diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_event_system.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 73 |
1 files changed, 46 insertions, 27 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 48cad9e020b..84fee9ff34c 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -84,6 +84,8 @@ # include "RNA_enum_types.h" #endif +static void update_tablet_data(wmWindow *win, wmEvent *event); + static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports, short context, short poll_only); @@ -94,6 +96,9 @@ void wm_event_add(wmWindow *win, wmEvent *event_to_add) wmEvent *event = MEM_callocN(sizeof(wmEvent), "wmEvent"); *event = *event_to_add; + + update_tablet_data(win, event); + BLI_addtail(&win->queue, event); } @@ -108,6 +113,11 @@ void wm_event_free(wmEvent *event) MEM_freeN(event->customdata); } } + + if (event->tablet_data) { + MEM_freeN(event->tablet_data); + } + MEM_freeN(event); } @@ -2652,9 +2662,12 @@ static void update_tablet_data(wmWindow *win, wmEvent *event) wmtab->Xtilt = td->Xtilt; wmtab->Ytilt = td->Ytilt; - event->custom = EVT_DATA_TABLET; - event->customdata = wmtab; - event->customdatafree = 1; + event->tablet_data = wmtab; + // printf("%s: using tablet %.5f\n", __func__, wmtab->Pressure); + } + else { + event->tablet_data = NULL; + // printf("%s: not using tablet\n", __func__); } } @@ -2747,6 +2760,24 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi return NULL; } +static bool wm_event_is_double_click(wmEvent *event, wmEvent *event_state) +{ + if ((event->type == event_state->prevtype) && + (event_state->prevval == KM_RELEASE) && + (event->val == KM_PRESS)) + { + if ((ISMOUSE(event->type) == false) || ((ABS(event->x - event_state->prevclickx)) <= 2 && + (ABS(event->y - event_state->prevclicky)) <= 2)) + { + if ((PIL_check_seconds_timer() - event_state->prevclicktime) * 1000 < U.dbl_click_time) { + return true; + } + } + } + + return false; +} + /* windows store own event queues, no bContext here */ /* time is in 1000s of seconds, from ghost */ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int UNUSED(time), void *customdata) @@ -2756,7 +2787,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U /* initialize and copy state (only mouse x y and modifiers) */ event = *evt; - + switch (type) { /* mouse move, also to inactive window (X11 does this) */ case GHOST_kEventCursorMove: @@ -2778,7 +2809,6 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U if (lastevent && lastevent->type == MOUSEMOVE) lastevent->type = INBETWEEN_MOUSEMOVE; - update_tablet_data(win, &event); wm_event_add(win, &event); /* also add to other window if event is there, this makes overdraws disappear nicely */ @@ -2791,7 +2821,6 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U oevent.y = owin->eventstate->y = event.y; oevent.type = MOUSEMOVE; - update_tablet_data(owin, &oevent); wm_event_add(owin, &oevent); } @@ -2823,7 +2852,6 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U event.prevx = event.x - pd->deltaX; event.prevy = event.y - (-pd->deltaY); - update_tablet_data(win, &event); wm_event_add(win, &event); break; } @@ -2868,15 +2896,10 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U } /* double click test */ - if (event.type == evt->prevtype && event.val == KM_PRESS) { - if ((ABS(event.x - evt->prevclickx)) <= 2 && - (ABS(event.y - evt->prevclicky)) <= 2 && - ((PIL_check_seconds_timer() - evt->prevclicktime) * 1000 < U.dbl_click_time)) - { - if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS) ) - printf("%s Send double click\n", __func__); - event.val = KM_DBL_CLICK; - } + if (wm_event_is_double_click(&event, evt)) { + if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS) ) + printf("%s Send double click\n", __func__); + event.val = KM_DBL_CLICK; } if (event.val == KM_PRESS) { evt->prevclicktime = PIL_check_seconds_timer(); @@ -2894,11 +2917,9 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U oevent.type = event.type; oevent.val = event.val; - update_tablet_data(owin, &oevent); wm_event_add(owin, &oevent); } else { - update_tablet_data(win, &event); wm_event_add(win, &event); } @@ -2982,15 +3003,10 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U /* double click test */ /* if previous event was same type, and previous was release, and now it presses... */ - if (event.type == evt->prevtype && evt->prevval == KM_RELEASE && event.val == KM_PRESS) { - if ((ABS(event.x - evt->prevclickx)) <= 2 && - (ABS(event.y - evt->prevclicky)) <= 2 && - ((PIL_check_seconds_timer() - evt->prevclicktime) * 1000 < U.dbl_click_time)) - { - if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS) ) - printf("%s Send double click\n", __func__); - evt->val = event.val = KM_DBL_CLICK; - } + if (wm_event_is_double_click(&event, evt)) { + if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS) ) + printf("%s Send double click\n", __func__); + evt->val = event.val = KM_DBL_CLICK; } /* this case happens on holding a key pressed, it should not generate @@ -3100,4 +3116,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U } +#if 0 + WM_event_print(&event); +#endif } |