[Bf-blender-cvs] [6bc761a12e5] master: Fix T65479: Gizmo drag unusable with tools that activate on press

Campbell Barton noreply at git.blender.org
Fri Jun 7 03:09:01 CEST 2019


Commit: 6bc761a12e523b1c3c583b5519fb5faa3f84e408
Author: Campbell Barton
Date:   Fri Jun 7 10:54:17 2019 +1000
Branches: master
https://developer.blender.org/rB6bc761a12e523b1c3c583b5519fb5faa3f84e408

Fix T65479: Gizmo drag unusable with tools that activate on press

===================================================================

M	source/blender/windowmanager/intern/wm_event_system.c

===================================================================

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



More information about the Bf-blender-cvs mailing list