diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2015-04-05 20:32:57 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2015-04-05 20:32:57 +0300 |
commit | 776bfa64a53191b6f6aba107449be9353b7a2bee (patch) | |
tree | 86d3149974beb90b55999004d57bbb1049fa5b43 /source | |
parent | af23e8d44a6c70ce98a15d0aa2721c152c578dae (diff) |
Stickies: Don't send extra event on KM_CLICK
Just add KM_CLICK to the already sent KM_RELEASE, don't send a new one
for this.
This might help us to get rid of quite some glitches and workarounds \o/
(why didn't this come earlier to my mind? :S)
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 15 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 15 |
2 files changed, 18 insertions, 12 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 8c013eb7cd4..0a8da1df233 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2994,7 +2994,7 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi * - #KM_PRESS && time since first #KM_PRESS > U.click_timeout --> send #KM_HOLD * - #KM_PRESS after a #KM_RELEASE && time since previous #KM_PRESS < U.dbl_click_time --> send #KM_DBL_CLICK * - * \note: only #KM_DBL_CLICK is handled here, rest in #wm_window_event_clicktype_init (wm_window.c) + * \note: only #KM_DBL_CLICK and #KM_CLICK are handled here, #KM_HOLD in #wm_window_event_clicktype_init (wm_window.c) */ static void wm_event_clicktype_init(wmWindow *win, wmEvent *event, wmEvent *event_state) { @@ -3025,6 +3025,19 @@ static void wm_event_clicktype_init(wmWindow *win, wmEvent *event, wmEvent *even } } + if ((PIL_check_seconds_timer() - event->click_time) * 1000 <= U.click_timeout) { + /* for any reason some X11 systems send two release events triggering two KM_CLICK events + * - making the rules more strict by checking for prevval resolves this (not needed for mouse) */ + if (event->val == KM_RELEASE && + (ISMOUSE(event->type) || event->prevval != KM_RELEASE)) + { + click_type = KM_CLICK; + if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS)) { + printf("%s Send click event\n", __func__); + } + } + } + if (click_type != event->click_type) { event_state->click_type = event->click_type = click_type; } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 5c05d86da57..1af20e6036d 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -1098,9 +1098,9 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr } /** - * #KM_DBL_CLICK is set in wm_event_clicktype_init (wm_event_system.c) - * Normally, this should be there too, but for #KM_CLICK/#KM_HOLD, we need a - * time precision of a few milliseconds, which we can't get from there + * #KM_DBL_CLICK and #KM_CLICK are set in wm_event_clicktype_init (wm_event_system.c) + * Normally, #KM_HOLD should be there too, but we need a time precision of a few + * milliseconds for it, which we can't get from there */ static void wm_window_event_clicktype_init(const bContext *C) { @@ -1141,14 +1141,7 @@ static void wm_window_event_clicktype_init(const bContext *C) /* the actual test */ if ((PIL_check_seconds_timer() - event->click_time) * 1000 <= U.click_timeout) { - /* for any reason some X11 systems send two release events triggering two KM_CLICK - * events - making the rules more strict by checking for prevval resolves this */ - if (event->val == KM_RELEASE && event->prevval != KM_RELEASE) { - click_type = KM_CLICK; - if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS)) { - printf("%s Send click event\n", __func__); - } - } + /* sending of KM_CLICK is handled in wm_event_clicktype_init (wm_event_system.c) */ } else if (event->is_key_pressed) { click_type = KM_HOLD; |