[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