[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