From 9bcab8050f44e5bd36a0715811ee0355e4b221b6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 28 Jun 2019 18:10:43 +1000 Subject: Fix T63694: Crash using tool gizmos with multiple windows Gizmo group types now store a user count so they aren't unlinked while other tools are using them. The tool system now works with multiple windows. --- .../windowmanager/gizmo/intern/wm_gizmo_map.c | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c') diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c index edf376b1259..be123bee5df 100644 --- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c +++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c @@ -69,8 +69,13 @@ static ListBase gizmomaptypes = {NULL, NULL}; */ /* so operator removal can trigger update */ typedef enum eWM_GizmoFlagGroupTypeGlobalFlag { + /** Initialize by #wmGroupType.type_update_flag. */ WM_GIZMOMAPTYPE_GLOBAL_UPDATE_INIT = (1 << 0), + /** Remove by #wmGroupType.type_update_flag. */ WM_GIZMOMAPTYPE_GLOBAL_UPDATE_REMOVE = (1 << 1), + + /** Remove by #wmGroup.tag_remove. */ + WM_GIZMOTYPE_GLOBAL_UPDATE_REMOVE = (1 << 2), } eWM_GizmoFlagGroupTypeGlobalFlag; static eWM_GizmoFlagGroupTypeGlobalFlag wm_gzmap_type_update_flag = 0; @@ -1257,6 +1262,13 @@ void WM_gizmoconfig_update_tag_group_type_remove(wmGizmoMapType *gzmap_type, wm_gzmap_type_update_flag |= WM_GIZMOMAPTYPE_GLOBAL_UPDATE_REMOVE; } +void WM_gizmoconfig_update_tag_group_remove(wmGizmoMap *gzmap) +{ + gzmap->tag_remove_group = true; + + wm_gzmap_type_update_flag |= WM_GIZMOTYPE_GLOBAL_UPDATE_REMOVE; +} + /** * Run in case new types have been added (runs often, early exit where possible). * Follows #WM_keyconfig_update conventions. @@ -1271,6 +1283,32 @@ void WM_gizmoconfig_update(struct Main *bmain) return; } + if (wm_gzmap_type_update_flag & WM_GIZMOTYPE_GLOBAL_UPDATE_REMOVE) { + for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) { + for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) { + for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { + ListBase *regionbase = (sl == sa->spacedata.first) ? &sa->regionbase : &sl->regionbase; + for (ARegion *ar = regionbase->first; ar; ar = ar->next) { + wmGizmoMap *gzmap = ar->gizmo_map; + if (gzmap != NULL && gzmap->tag_remove_group) { + gzmap->tag_remove_group = false; + + for (wmGizmoGroup *gzgroup = gzmap->groups.first, *gzgroup_next; gzgroup; + gzgroup = gzgroup_next) { + gzgroup_next = gzgroup->next; + if (gzgroup->tag_remove) { + wm_gizmogroup_free(NULL, gzgroup); + ED_region_tag_redraw(ar); + } + } + } + } + } + } + } + wm_gzmap_type_update_flag &= ~WM_GIZMOTYPE_GLOBAL_UPDATE_REMOVE; + } + if (wm_gzmap_type_update_flag & WM_GIZMOMAPTYPE_GLOBAL_UPDATE_REMOVE) { for (wmGizmoMapType *gzmap_type = gizmomaptypes.first; gzmap_type; gzmap_type = gzmap_type->next) { -- cgit v1.2.3