[Bf-blender-cvs] [fc719f3] temp_manipulators_core: Avoid bad-level calls to WM_manipulatormap_delete from BKE

Julian Eisel noreply at git.blender.org
Mon Sep 12 17:45:12 CEST 2016


Commit: fc719f3e9a7955fab913e9fd4e34735d702969a6
Author: Julian Eisel
Date:   Mon Sep 12 17:41:58 2016 +0200
Branches: temp_manipulators_core
https://developer.blender.org/rBfc719f3e9a7955fab913e9fd4e34735d702969a6

Avoid bad-level calls to WM_manipulatormap_delete from BKE

===================================================================

M	source/blender/blenkernel/BKE_screen.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/screen.c
M	source/blender/windowmanager/intern/wm_init_exit.c
M	source/blender/windowmanager/manipulators/WM_manipulator_api.h
M	source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
M	source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
M	source/blenderplayer/bad_level_call_stubs/stubs.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 14e978b..1dfef5c 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -284,6 +284,8 @@ void BKE_spacedata_id_unref(struct ScrArea *sa, struct SpaceLink *sl, struct ID
 struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
 void            BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
 void            BKE_screen_area_free(struct ScrArea *sa);
+/* Manipulator-maps of a region need to be freed with the region. Uses callback to avoid low-level call. */
+void BKE_region_free_callback_manipulatormaps_set(void (*callback)(ListBase *list));
 
 struct ARegion *BKE_area_find_region_type(struct ScrArea *sa, int type);
 struct ARegion *BKE_area_find_region_active_win(struct ScrArea *sa);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index b000f91..157c440 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -49,9 +49,6 @@ set(INC
 	../../../intern/smoke/extern
 	../../../intern/atomic
 	../../../intern/libmv
-
-	# XXX - BAD LEVEL CALL WM_api.h
-	../windowmanager
 )
 
 set(INC_SYS
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 419c9cb..45622c6 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -53,10 +53,6 @@
 #include "BKE_idprop.h"
 #include "BKE_screen.h"
 
-/* XXX bad level call */
-#include "WM_api.h"
-#include "WM_types.h"
-
 /* ************ Spacetype/regiontype handling ************** */
 
 /* keep global; this has to be accessible outside of windowmanager */
@@ -293,6 +289,17 @@ void BKE_spacedata_id_unref(struct ScrArea *sa, struct SpaceLink *sl, struct ID
 	}
 }
 
+
+/**
+ * Avoid bad-level calls to #WM_manipulatormap_delete.
+ */
+static void (*region_free_manipulatormaps_callback)(ListBase *) = NULL;
+
+void BKE_region_free_callback_manipulatormaps_set(void (*callback)(ListBase *list))
+{
+	region_free_manipulatormaps_callback = callback;
+}
+
 /* not region itself */
 void BKE_area_region_free(SpaceType *st, ARegion *ar)
 {
@@ -343,11 +350,7 @@ void BKE_area_region_free(SpaceType *st, ARegion *ar)
 		}
 	}
 
-	for (wmManipulatorMap *mmap = ar->manipulator_maps.first, *mmap_tmp; mmap; mmap = mmap_tmp) {
-		mmap_tmp = mmap->next;
-		WM_manipulatormap_delete(mmap); /* XXX shouldn't be in blenkernel */
-	}
-	BLI_listbase_clear(&ar->manipulator_maps);
+	region_free_manipulatormaps_callback(&ar->manipulator_maps);
 	BLI_freelistN(&ar->ui_lists);
 	BLI_freelistN(&ar->ui_previews);
 	BLI_freelistN(&ar->panels_category);
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 776567f..ffb6724 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -171,6 +171,7 @@ void WM_init(bContext *C, int argc, const char **argv)
 	BKE_library_callback_free_notifier_reference_set(WM_main_remove_notifier_reference);   /* library.c */
 	BKE_library_callback_remap_editor_id_reference_set(WM_main_remap_editor_id_reference);   /* library.c */
 	BKE_blender_callback_test_break_set(wm_window_testbreak); /* blender.c */
+	BKE_region_free_callback_manipulatormaps_set(wm_manipulatormap_delete_list);
 	BKE_spacedata_callback_id_remap_set(ED_spacedata_id_remap); /* screen.c */
 	DAG_editors_update_cb(ED_render_id_flush_update,
 	                      ED_render_scene_update,
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
index f17fc59..6109141 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h
@@ -99,7 +99,6 @@ struct wmManipulatorMap *WM_manipulatormap_from_type(
 struct wmManipulatorMap *WM_manipulatormap_find(
         const struct ARegion *ar, const struct wmManipulatorMapType_Params *mmap_params);
 
-void WM_manipulatormap_delete(struct wmManipulatorMap *mmap);
 void WM_manipulatormaptypes_free(void);
 
 void WM_manipulatormap_tag_refresh(struct wmManipulatorMap *mmap);
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
index a98eec4..b3f64ac 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
@@ -112,7 +112,7 @@ void WM_manipulatormap_selected_delete(wmManipulatorMap *mmap)
 	mmap->mmap_context.tot_selected = 0;
 }
 
-void WM_manipulatormap_delete(wmManipulatorMap *mmap)
+static void wm_manipulatormap_delete(wmManipulatorMap *mmap)
 {
 	if (!mmap)
 		return;
@@ -128,6 +128,18 @@ void WM_manipulatormap_delete(wmManipulatorMap *mmap)
 	MEM_freeN(mmap);
 }
 
+/**
+ * Delete all manipulator-maps stored in \a list.
+ */
+void wm_manipulatormap_delete_list(ListBase *list)
+{
+	for (wmManipulatorMap *mmap = list->first, *mmap_next; mmap; mmap = mmap_next) {
+		mmap_next = mmap->next;
+		wm_manipulatormap_delete(mmap);
+	}
+	BLI_listbase_clear(list);
+}
+
 wmManipulatorMap *WM_manipulatormap_find(
         const ARegion *ar, const struct wmManipulatorMapType_Params *mmap_params)
 {
diff --git a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
index b78dc9a..eb1b955 100644
--- a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
+++ b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
@@ -142,6 +142,8 @@ enum {
 /* -------------------------------------------------------------------- */
 /* wmManipulatorMap */
 
+void wm_manipulatormap_delete_list(struct ListBase *list);
+
 void wm_manipulators_keymap(struct wmKeyConfig *keyconf);
 
 bool wm_manipulatormap_is_3d(const struct wmManipulatorMap *mmap);
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index 623f7bc..d8a4ddc 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -336,8 +336,6 @@ void WM_jobs_callbacks(struct wmJob *job,
 void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *job) RET_NONE
 void WM_report(ReportType type, const char *message) RET_NONE
 
-void WM_manipulatormap_delete(struct wmManipulatorMap *wmap) RET_NONE
-
 #ifdef WITH_INPUT_NDOF
     void WM_ndof_deadzone_set(float deadzone) RET_NONE
 #endif




More information about the Bf-blender-cvs mailing list