[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54661] trunk/blender/source/blender: Fix #34315: memory leak cancelling move to layer operator, after change to make
Brecht Van Lommel
brechtvanlommel at pandora.be
Tue Feb 19 14:37:48 CET 2013
Revision: 54661
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54661
Author: blendix
Date: 2013-02-19 13:37:48 +0000 (Tue, 19 Feb 2013)
Log Message:
-----------
Fix #34315: memory leak cancelling move to layer operator, after change to make
it not execute immediately when opening the popup.
Modified Paths:
--------------
trunk/blender/source/blender/editors/include/UI_interface.h
trunk/blender/source/blender/editors/interface/interface_handlers.c
trunk/blender/source/blender/editors/interface/interface_intern.h
trunk/blender/source/blender/editors/interface/interface_regions.c
trunk/blender/source/blender/windowmanager/intern/wm_operators.c
Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h 2013-02-19 13:15:34 UTC (rev 54660)
+++ trunk/blender/source/blender/editors/include/UI_interface.h 2013-02-19 13:37:48 UTC (rev 54661)
@@ -361,7 +361,7 @@
* but allow using all button types and creating an own layout. */
typedef uiBlock * (*uiBlockCreateFunc)(struct bContext *C, struct ARegion *ar, void *arg1);
-typedef void (*uiBlockCancelFunc)(void *arg1);
+typedef void (*uiBlockCancelFunc)(struct bContext *C, void *arg1);
void uiPupBlock(struct bContext *C, uiBlockCreateFunc func, void *arg);
void uiPupBlockO(struct bContext *C, uiBlockCreateFunc func, void *arg, const char *opname, int opcontext);
Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c 2013-02-19 13:15:34 UTC (rev 54660)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c 2013-02-19 13:37:48 UTC (rev 54661)
@@ -7159,7 +7159,7 @@
WM_operator_name_call(C, temp.optype->idname, temp.opcontext, NULL);
}
else if (temp.cancel_func)
- temp.cancel_func(temp.popup_arg);
+ temp.cancel_func(C, temp.popup_arg);
}
else {
/* re-enable tooltips */
Modified: trunk/blender/source/blender/editors/interface/interface_intern.h
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_intern.h 2013-02-19 13:15:34 UTC (rev 54660)
+++ trunk/blender/source/blender/editors/interface/interface_intern.h 2013-02-19 13:37:48 UTC (rev 54661)
@@ -429,7 +429,7 @@
int popup;
void (*popup_func)(struct bContext *C, void *arg, int event);
- void (*cancel_func)(void *arg);
+ void (*cancel_func)(struct bContext *C, void *arg);
void *popup_arg;
struct wmTimer *scrolltimer;
Modified: trunk/blender/source/blender/editors/interface/interface_regions.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_regions.c 2013-02-19 13:15:34 UTC (rev 54660)
+++ trunk/blender/source/blender/editors/interface/interface_regions.c 2013-02-19 13:37:48 UTC (rev 54661)
@@ -2574,7 +2574,7 @@
WM_operator_free(op);
}
-static void confirm_cancel_operator(void *opv)
+static void confirm_cancel_operator(bContext *UNUSED(C), void *opv)
{
WM_operator_free(opv);
}
Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c 2013-02-19 13:15:34 UTC (rev 54660)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c 2013-02-19 13:37:48 UTC (rev 54661)
@@ -1243,7 +1243,7 @@
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_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 @@
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 @@
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);
More information about the Bf-blender-cvs
mailing list