[Bf-blender-cvs] [f874f6817d1] master: Fix T73727: Invalid event.type for Gizmo.modal callback

Campbell Barton noreply at git.blender.org
Thu Feb 13 03:56:55 CET 2020


Commit: f874f6817d1c793da4fd423a3c8bf0e504ebfa4a
Author: Campbell Barton
Date:   Thu Feb 13 13:52:35 2020 +1100
Branches: master
https://developer.blender.org/rBf874f6817d1c793da4fd423a3c8bf0e504ebfa4a

Fix T73727: Invalid event.type for Gizmo.modal callback

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

M	source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c

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

diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
index 14657bfa6bd..ab38b850ada 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
@@ -547,15 +547,32 @@ static int gizmo_tweak_modal(bContext *C, wmOperator *op, const wmEvent *event)
   /* handle gizmo */
   wmGizmoFnModal modal_fn = gz->custom_modal ? gz->custom_modal : gz->type->modal;
   if (modal_fn) {
+    /* Ugly hack to ensure Python won't get 'EVT_MODAL_MAP' which isn't supported, see T73727.
+     * note that we could move away from wrapping modal gizmos in a modal operator,
+     * since it's causing the need for code like this. */
+    wmEvent *evil_event = (wmEvent *)event;
+    short event_modal_val = 0;
+
+    if (event->type == EVT_MODAL_MAP) {
+      event_modal_val = evil_event->val;
+      evil_event->type = evil_event->prevtype;
+      evil_event->val = evil_event->prevval;
+    }
+
     int modal_retval = modal_fn(C, gz, event, mtweak->flag);
 
+    if (event_modal_val != 0) {
+      evil_event->type = EVT_MODAL_MAP;
+      evil_event->val = event_modal_val;
+    }
+
     if ((modal_retval & OPERATOR_RUNNING_MODAL) == 0) {
       gizmo_tweak_finish(C, op, (modal_retval & OPERATOR_CANCELLED) != 0, true);
       return OPERATOR_FINISHED;
     }
 
     /* Ugly hack to send gizmo events */
-    ((wmEvent *)event)->type = EVT_GIZMO_UPDATE;
+    evil_event->type = EVT_GIZMO_UPDATE;
   }
 
   /* always return PASS_THROUGH so modal handlers



More information about the Bf-blender-cvs mailing list