Commit: ee3c177dd3d54b3b3a500dce392683edfe730586
Author: Campbell Barton
Date:   Tue Jan 22 16:51:31 2019 +1100
Branches: master
https://developer.blender.org/rBee3c177dd3d54b3b3a500dce392683edfe730586

Fix T60112: Smooth crashes w/ multiple views

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

M       source/blender/windowmanager/gizmo/WM_gizmo_api.h
M       source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
M       source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_api.h 
b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
index 4ceb78be227..667646cf601 100644
--- a/source/blender/windowmanager/gizmo/WM_gizmo_api.h
+++ b/source/blender/windowmanager/gizmo/WM_gizmo_api.h
@@ -297,6 +297,9 @@ void WM_gizmomaptype_group_init_runtime_keymap(
 void WM_gizmomaptype_group_init_runtime(
         const struct Main *bmain, struct wmGizmoMapType *gzmap_type,
         struct wmGizmoGroupType *gzgt);
+void WM_gizmomaptype_group_init_runtime_with_region(
+        struct wmGizmoMapType *gzmap_type,
+        struct wmGizmoGroupType *gzgt, struct ARegion *ar);
 void WM_gizmomaptype_group_unlink(
         struct bContext *C, struct Main *bmain, struct wmGizmoMapType 
*gzmap_type,
         const struct wmGizmoGroupType *gzgt);
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c 
b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
index 67b7149c0bd..9999f4034c6 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_group.c
@@ -792,6 +792,11 @@ void WM_gizmomaptype_group_init_runtime(
         const Main *bmain, wmGizmoMapType *gzmap_type,
         wmGizmoGroupType *gzgt)
 {
+       /* Tools add themselves. */
+       if (gzgt->flag & WM_GIZMOGROUPTYPE_TOOL_INIT) {
+               return;
+       }
+
        /* now create a gizmo for all existing areas */
        for (bScreen *sc = bmain->screen.first; sc; sc = sc->id.next) {
                for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) {
@@ -800,11 +805,7 @@ void WM_gizmomaptype_group_init_runtime(
                                for (ARegion *ar = lb->first; ar; ar = 
ar->next) {
                                        wmGizmoMap *gzmap = ar->gizmo_map;
                                        if (gzmap && gzmap->type == gzmap_type) 
{
-                                               
wm_gizmogroup_new_from_type(gzmap, gzgt);
-
-                                               /* just add here, drawing will 
occur on next update */
-                                               
wm_gizmomap_highlight_set(gzmap, NULL, NULL, 0);
-                                               ED_region_tag_redraw(ar);
+                                               
WM_gizmomaptype_group_init_runtime_with_region(gzmap_type, gzgt, ar);
                                        }
                                }
                        }
@@ -812,6 +813,18 @@ void WM_gizmomaptype_group_init_runtime(
        }
 }
 
+void WM_gizmomaptype_group_init_runtime_with_region(
+        wmGizmoMapType *gzmap_type,
+        wmGizmoGroupType *gzgt, ARegion *ar)
+{
+       wmGizmoMap *gzmap = ar->gizmo_map;
+       BLI_assert(gzmap && gzmap->type == gzmap_type);
+
+       wm_gizmogroup_new_from_type(gzmap, gzgt);
+
+       wm_gizmomap_highlight_set(gzmap, NULL, NULL, 0);
+       ED_region_tag_redraw(ar);
+}
 
 /**
  * Unlike #WM_gizmomaptype_group_unlink this doesn't maintain correct state, 
simply free.
diff --git a/source/blender/windowmanager/intern/wm_event_system.c 
b/source/blender/windowmanager/intern/wm_event_system.c
index a2850a7554b..5feacea9666 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2057,7 +2057,12 @@ static int wm_handler_operator_call(bContext *C, 
ListBase *handlers, wmEventHand
                                                wmGizmoGroupType *gzgt = 
WM_gizmogrouptype_find(idname, false);
                                                if (gzgt != NULL) {
                                                        if ((gzgt->flag & 
WM_GIZMOGROUPTYPE_TOOL_INIT) != 0) {
-                                                               
WM_gizmo_group_type_ensure_ptr(gzgt);
+                                                               ARegion *ar = 
CTX_wm_region(C);
+                                                               if (ar != NULL) 
{
+                                                                       
wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(&gzgt->gzmap_params);
+                                                                       
WM_gizmo_group_type_ensure_ptr_ex(gzgt, gzmap_type);
+                                                                       
WM_gizmomaptype_group_init_runtime_with_region(gzmap_type, gzgt, ar);
+                                                               }
                                                        }
                                                }
                                        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to