diff options
author | Campbell Barton <ideasman42@gmail.com> | 2021-12-02 07:46:14 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-12-02 07:53:41 +0300 |
commit | 8f69c914080a7fe9555f7126362f08c368a8069d (patch) | |
tree | a6677403e53ee2a6334e3a3dae9a5bcd8baff6e7 /source/blender/editors/screen | |
parent | 0de1d2e84efe5fb085847328e891fbf0f3f17b4f (diff) |
Fix T93410: Crash hiding a region from Python used by a popover
Close all active buttons when hiding a region as this can be called
from Python a popover is open from that region.
Failure to do this causes the popover to read from the freed button.
Also rename UI_screen_free_active_but to
UI_screen_free_active_but_highlight since it only frees highlighted
buttons.
Diffstat (limited to 'source/blender/editors/screen')
-rw-r--r-- | source/blender/editors/screen/area.c | 6 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_edit.c | 2 |
2 files changed, 7 insertions, 1 deletions
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 0190e7b7cee..dc7cbb96e96 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -2119,6 +2119,12 @@ void ED_region_visibility_change_update(bContext *C, ScrArea *area, ARegion *reg { if (region->flag & RGN_FLAG_HIDDEN) { WM_event_remove_handlers(C, ®ion->handlers); + /* Needed to close any open pop-overs which would otherwise remain open, + * crashing on attempting to refresh. See: T93410. + * + * When #ED_area_init frees buttons via #UI_blocklist_free a NULL context + * is passed, causing the free not to remove menus or their handlers. */ + UI_region_free_active_but_all(C, region); } ED_area_init(CTX_wm_manager(C), CTX_wm_window(C), area); diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 3c8fb2e7446..92151ea01b3 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -955,7 +955,7 @@ void ED_screen_set_active_region(bContext *C, wmWindow *win, const int xy[2]) * because it can undo setting the right button as active due * to delayed notifier handling. */ if (C) { - UI_screen_free_active_but(C, screen); + UI_screen_free_active_but_highlight(C, screen); } } } |