Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-07-07 15:30:19 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-07-07 15:35:52 +0300
commit9e12d762a27f0c23a7cea426cd9910ef275b152c (patch)
tree7df71e87a961b3aeec6472fb22ec1615db6efdc8 /source
parent414875ce96508fca71f3fac14cab88bfa647d745 (diff)
Fix crash running an operator from a popup,
Cell fracture redraw option was crashing. Change operator popup behavior to close the UI before executing since the operator may perform operations which change/remove the UI.
Diffstat (limited to 'source')
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 63ca46e05c6..e8c55486dfe 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -1151,38 +1151,27 @@ typedef struct wmOpPopUp {
/* Only invoked by OK button in popups created with wm_block_dialog_create() */
static void dialog_exec_cb(bContext *C, void *arg1, void *arg2)
{
- wmOpPopUp *data = arg1;
- uiBlock *block = arg2;
+ wmOperator *op;
+ {
+ /* Execute will free the operator.
+ * In this case, wm_operator_ui_popup_cancel wont run. */
+ wmOpPopUp *data = arg1;
+ op = data->op;
+ MEM_freeN(data);
+ }
+ uiBlock *block = arg2;
/* Explicitly set UI_RETURN_OK flag, otherwise the menu might be canceled
* in case WM_operator_call_ex exits/reloads the current file (T49199). */
- UI_popup_menu_retval_set(block, UI_RETURN_OK, true);
-
- WM_operator_call_ex(C, data->op, true);
- /* let execute handle freeing it */
- // data->free_op = false;
- // data->op = NULL;
-
- /* in this case, wm_operator_ui_popup_cancel wont run */
- MEM_freeN(data);
+ UI_popup_menu_retval_set(block, UI_RETURN_OK, true);
/* Get context data *after* WM_operator_call_ex
* which might have closed the current file and changed context. */
- wmWindowManager *wm = CTX_wm_manager(C);
wmWindow *win = CTX_wm_window(C);
+ UI_popup_block_close(C, win, block);
- /* check window before 'block->handle' incase the
- * popup execution closed the window and freed the block. see T44688.
- */
- /* Post 2.78 TODO: Check if this fix and others related to T44688 are still
- * needed or can be improved now that requesting context data has been corrected
- * (see above). We're close to release so not a good time for experiments.
- * -- Julian
- */
- if (BLI_findindex(&wm->windows, win) != -1) {
- UI_popup_block_close(C, win, block);
- }
+ WM_operator_call_ex(C, op, true);
}
/* Dialogs are popups that require user verification (click OK) before exec */