diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-02-19 17:37:48 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-02-19 17:37:48 +0400 |
commit | e3b2df5806037d5c466dd01c54ffb3fb53d2ab1c (patch) | |
tree | 08cf3a08051caa955332e35bd8cdaeaef8a88233 /source/blender/windowmanager | |
parent | f7848569063386b5925cb692652b584ea8765572 (diff) |
Fix #34315: memory leak cancelling move to layer operator, after change to make
it not execute immediately when opening the popup.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 9939e6b69ba..357da5c8f4b 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -1243,7 +1243,7 @@ wmOperator *WM_operator_last_redo(const bContext *C) return op; } -static void wm_block_redo_cb(bContext *C, void *arg_op, int UNUSED(arg_event)) +static void wm_block_redo_cb(bContext *C, void *arg_op, int arg_event) { wmOperator *op = arg_op; @@ -1260,6 +1260,15 @@ static void wm_block_redo_cb(bContext *C, void *arg_op, int UNUSED(arg_event)) } } +static void wm_block_redo_cancel_cb(bContext *C, void *arg_op) +{ + wmOperator *op = arg_op; + + /* if operator never got executed, free it */ + if (op != WM_operator_last_redo(C)) + WM_operator_free(op); +} + static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op) { wmOperator *op = arg_op; @@ -1402,7 +1411,7 @@ static uiBlock *wm_operator_ui_create(bContext *C, ARegion *ar, void *userData) return block; } -static void wm_operator_ui_popup_cancel(void *userData) +static void wm_operator_ui_popup_cancel(struct bContext *UNUSED(C), void *userData) { wmOpPopUp *data = userData; if (data->free_op && data->op) { @@ -1452,7 +1461,7 @@ static int wm_operator_props_popup_ex(bContext *C, wmOperator *op, const int do_ if (!(U.uiflag & USER_GLOBALUNDO)) return WM_operator_props_dialog_popup(C, op, 15 * UI_UNIT_X, UI_UNIT_Y); - uiPupBlock(C, wm_block_create_redo, op); + uiPupBlockEx(C, wm_block_create_redo, NULL, wm_block_redo_cancel_cb, op); if (do_call) wm_block_redo_cb(C, op, 0); |