WM: clear operator memory on file load
authorCampbell Barton <ideasman42@gmail.com>
Tue, 28 Oct 2014 14:47:51 +0000 (15:47 +0100)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 28 Oct 2014 14:47:51 +0000 (15:47 +0100)
Was causing problems when opening scenes with different scale set.

source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_files.c
source/blender/windowmanager/intern/wm_operators.c

index cf9f94aff251cd06a7d505694afb8e36762c2285..a580260c5b093bb5d61062c4165342ce18416e24 100644 (file)
@@ -230,6 +230,7 @@ void                WM_operatortype_append_ptr(void (*opfunc)(struct wmOperatorType *, void *)
 void           WM_operatortype_append_macro_ptr(void (*opfunc)(struct wmOperatorType *, void *), void *userdata);
 void        WM_operatortype_remove_ptr(struct wmOperatorType *ot);
 bool        WM_operatortype_remove(const char *idname);
+void        WM_operatortype_last_properties_clear_all(void);
 
 struct wmOperatorType *WM_operatortype_append_macro(const char *idname, const char *name, const char *description, int flag);
 struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType *ot, const char *idname);
index 7865e09cbe2e0da381bb9c2403a24e42f82692f3..8f0f76466e974aa1e36750b2fe8501d328a82cbf 100644 (file)
@@ -476,6 +476,8 @@ bool WM_file_read(bContext *C, const char *filepath, ReportList *reports)
                BPY_python_reset(C);
 #endif
 
+               WM_operatortype_last_properties_clear_all();
+
                /* important to do before NULL'ing the context */
                BLI_callback_exec(CTX_data_main(C), NULL, BLI_CB_EVT_VERSION_UPDATE);
                BLI_callback_exec(CTX_data_main(C), NULL, BLI_CB_EVT_LOAD_POST);
@@ -668,6 +670,8 @@ int wm_homefile_read(bContext *C, ReportList *reports, bool from_memory, const c
        }
 #endif
 
+       WM_operatortype_last_properties_clear_all();
+
        /* important to do before NULL'ing the context */
        BLI_callback_exec(CTX_data_main(C), NULL, BLI_CB_EVT_VERSION_UPDATE);
        BLI_callback_exec(CTX_data_main(C), NULL, BLI_CB_EVT_LOAD_POST);
index 77f6028dd0657d99f423855e23ece457fd3d91cb..154249a229473fe6bc8c1fb38d93afcca4691bc8 100644 (file)
@@ -494,6 +494,27 @@ bool WM_operatortype_remove(const char *idname)
        return true;
 }
 
+/**
+ * Remove memory of all previously executed tools.
+ */
+void WM_operatortype_last_properties_clear_all(void)
+{
+       GHashIterator iter;
+
+       for (WM_operatortype_iter(&iter);
+            (!BLI_ghashIterator_done(&iter));
+            (BLI_ghashIterator_step(&iter)))
+       {
+               wmOperatorType *ot = BLI_ghashIterator_getValue(&iter);
+
+               if (ot->last_properties) {
+                       IDP_FreeProperty(ot->last_properties);
+                       MEM_freeN(ot->last_properties);
+                       ot->last_properties = NULL;
+               }
+       }
+}
+
 /* SOME_OT_op -> some.op */
 void WM_operator_py_idname(char *to, const char *from)
 {