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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to