diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-06-07 03:54:17 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-06-07 04:08:43 +0300 |
commit | 6bc761a12e523b1c3c583b5519fb5faa3f84e408 (patch) | |
tree | df70a0e2475d5bf221e485b4da7da1039a7c383f /source/blender/windowmanager | |
parent | 29526504d7f7fec7969a79cf7389d3d61d39e326 (diff) |
Fix T65479: Gizmo drag unusable with tools that activate on press
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 63 |
1 files changed, 59 insertions, 4 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index e38d8723e06..632b0131191 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -88,6 +88,20 @@ #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" +/** + * When a gizmo is highlighted and uses click/drag events, + * this prevents mouse button press events from being passed through to other key-maps + * which would obscure those events. + * + * This allows gizmos that only use drag to co-exist with tools that use click. + * + * Without tools using press events which would prevent click/drag events getting to the gizmos. + * + * This is not a fool proof solution since since it's possible the gizmo operators would pass + * through thse events when called, see: T65479. + */ +#define USE_GIZMO_MOUSE_PRIORITY_HACK + static void wm_notifier_clear(wmNotifier *note); static void update_tablet_data(wmWindow *win, wmEvent *event); @@ -2578,14 +2592,17 @@ static int wm_handlers_do_keymap_with_gizmo_handler( /* Additional. */ wmGizmoGroup *gzgroup, wmKeyMap *keymap, - const bool do_debug_handler) + const bool do_debug_handler, + bool *r_keymap_poll) { int action = WM_HANDLER_CONTINUE; + bool keymap_poll = false; wmKeyMapItem *kmi; PRINT("%s: checking '%s' ...", __func__, keymap->idname); if (WM_keymap_poll(C, keymap)) { + keymap_poll = true; PRINT("pass\n"); for (kmi = keymap->items.first; kmi; kmi = kmi->next) { if (wm_eventmatch(event, kmi)) { @@ -2623,6 +2640,11 @@ static int wm_handlers_do_keymap_with_gizmo_handler( else { PRINT("fail\n"); } + + if (r_keymap_poll) { + *r_keymap_poll = keymap_poll; + } + return action; } @@ -2772,16 +2794,49 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers } /* Don't use from now on. */ - const bool is_event_handle_all = gz && (gz->flag & WM_GIZMO_EVENT_HANDLE_ALL); + bool is_event_handle_all = gz && (gz->flag & WM_GIZMO_EVENT_HANDLE_ALL); if (handle_keymap) { /* Handle highlight gizmo. */ if (gz != NULL) { + bool keymap_poll = false; wmGizmoGroup *gzgroup = gz->parent_gzgroup; wmKeyMap *keymap = WM_keymap_active(wm, gz->keymap ? gz->keymap : gzgroup->type->keymap); action |= wm_handlers_do_keymap_with_gizmo_handler( - C, event, handlers, handler, gzgroup, keymap, do_debug_handler); + C, event, handlers, handler, gzgroup, keymap, do_debug_handler, &keymap_poll); + +#ifdef USE_GIZMO_MOUSE_PRIORITY_HACK + if (((action & WM_HANDLER_BREAK) == 0) && !is_event_handle_all && keymap_poll) { + if ((event->val == KM_PRESS) && + ELEM(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE)) { + + wmEvent event_test_click = *event; + event_test_click.val = KM_CLICK; + + wmEvent event_test_click_drag = *event; + event_test_click_drag.val = KM_CLICK_DRAG; + + wmEvent event_test_tweak = *event; + event_test_tweak.type = EVT_TWEAK_L + (event->type - LEFTMOUSE); + event_test_tweak.val = KM_ANY; + + for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) { + if ((kmi->flag & KMI_INACTIVE) == 0) { + if (wm_eventmatch(&event_test_click, kmi) || + wm_eventmatch(&event_test_click_drag, kmi) || + wm_eventmatch(&event_test_tweak, kmi)) { + wmOperatorType *ot = WM_operatortype_find(kmi->idname, 0); + if (WM_operator_poll_context(C, ot, WM_OP_INVOKE_DEFAULT)) { + is_event_handle_all = true; + break; + } + } + } + } + } + } +#endif /* USE_GIZMO_MOUSE_PRIORITY_HACK */ } /* Don't use from now on. */ @@ -2795,7 +2850,7 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers if (wm_gizmogroup_is_any_selected(gzgroup)) { wmKeyMap *keymap = WM_keymap_active(wm, gzgroup->type->keymap); action |= wm_handlers_do_keymap_with_gizmo_handler( - C, event, handlers, handler, gzgroup, keymap, do_debug_handler); + C, event, handlers, handler, gzgroup, keymap, do_debug_handler, NULL); if (action & WM_HANDLER_BREAK) { break; } |