From 8f69c914080a7fe9555f7126362f08c368a8069d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 2 Dec 2021 15:46:14 +1100 Subject: 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. --- source/blender/editors/interface/interface_handlers.c | 18 +++++++++++++++--- source/blender/editors/interface/interface_ops.c | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) (limited to 'source/blender/editors/interface') diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index fe540c3624c..14df5ec68ac 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -439,11 +439,11 @@ typedef struct uiHandleButtonData { float ungrab_mval[2]; #endif - /* menu open (watch UI_screen_free_active_but) */ + /* Menu open, see: #UI_screen_free_active_but_highlight. */ uiPopupBlockHandle *menu; int menuretval; - /* search box (watch UI_screen_free_active_but) */ + /* Search box see: #UI_screen_free_active_but_highlight. */ ARegion *searchbox; #ifdef USE_KEYNAV_LIMIT struct uiKeyNavLock searchbox_keynav_state; @@ -11674,8 +11674,20 @@ bool UI_textbutton_activate_but(const bContext *C, uiBut *actbut) /** \name Public Utilities * \{ */ +void UI_region_free_active_but_all(bContext *C, ARegion *region) +{ + LISTBASE_FOREACH (uiBlock *, block, ®ion->uiblocks) { + LISTBASE_FOREACH (uiBut *, but, &block->buttons) { + if (but->active == NULL) { + continue; + } + ui_but_active_free(C, but); + } + } +} + /* is called by notifier */ -void UI_screen_free_active_but(const bContext *C, bScreen *screen) +void UI_screen_free_active_but_highlight(const bContext *C, bScreen *screen) { wmWindow *win = CTX_wm_window(C); diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index e1fd7386408..03422e8f520 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -1408,7 +1408,7 @@ static int editsource_exec(bContext *C, wmOperator *op) int ret; /* needed else the active button does not get tested */ - UI_screen_free_active_but(C, CTX_wm_screen(C)); + UI_screen_free_active_but_highlight(C, CTX_wm_screen(C)); // printf("%s: begin\n", __func__); -- cgit v1.2.3