Support passing in UserDef for free function
authorCampbell Barton <ideasman42@gmail.com>
Thu, 16 Mar 2017 13:18:20 +0000 (00:18 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 16 Mar 2017 13:18:20 +0000 (00:18 +1100)
Needed so we can load and free non-global user preferences.

source/blender/blenkernel/BKE_blender.h
source/blender/blenkernel/intern/blender.c
source/blender/blenkernel/intern/blendfile.c
source/blender/windowmanager/intern/wm_init_exit.c

index 1fe425b..040df05 100644 (file)
 extern "C" {
 #endif
 
+struct UserDef;
+
 void BKE_blender_free(void);
 
 void BKE_blender_globals_init(void);
 void BKE_blender_globals_clear(void);
-void BKE_blender_version_string(char *version_str, size_t maxncpy, short version, short subversion, bool v_prefix, bool include_subversion);
+void BKE_blender_version_string(
+        char *version_str, size_t maxncpy,
+        short version, short subversion, bool v_prefix, bool include_subversion);
 
-void BKE_blender_userdef_free(void);
+void BKE_blender_userdef_free(struct UserDef *userdef);
 void BKE_blender_userdef_refresh(void);
        
 /* set this callback when a UI is running */
index bb69eac..0180e68 100644 (file)
@@ -154,16 +154,14 @@ static void keymap_item_free(wmKeyMapItem *kmi)
  * When loading a new userdef from file,
  * or when exiting Blender.
  */
-void BKE_blender_userdef_free(void)
+void BKE_blender_userdef_free(UserDef *userdef)
 {
-       wmKeyMap *km;
-       wmKeyMapItem *kmi;
-       wmKeyMapDiffItem *kmdi;
-       bAddon *addon, *addon_next;
-       uiFont *font;
-
-       for (km = U.user_keymaps.first; km; km = km->next) {
-               for (kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) {
+#define U _invalid_access_ /* ensure no accidental global access */
+#ifdef U  /* quiet warning */
+#endif
+
+       for (wmKeyMap *km = userdef->user_keymaps.first; km; km = km->next) {
+               for (wmKeyMapDiffItem *kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) {
                        if (kmdi->add_item) {
                                keymap_item_free(kmdi->add_item);
                                MEM_freeN(kmdi->add_item);
@@ -174,14 +172,15 @@ void BKE_blender_userdef_free(void)
                        }
                }
 
-               for (kmi = km->items.first; kmi; kmi = kmi->next)
+               for (wmKeyMapItem *kmi = km->items.first; kmi; kmi = kmi->next) {
                        keymap_item_free(kmi);
+               }
 
                BLI_freelistN(&km->diff_items);
                BLI_freelistN(&km->items);
        }
-       
-       for (addon = U.addons.first; addon; addon = addon_next) {
+
+       for (bAddon *addon = userdef->addons.first, *addon_next; addon; addon = addon_next) {
                addon_next = addon->next;
                if (addon->prop) {
                        IDP_FreeProperty(addon->prop);
@@ -190,18 +189,20 @@ void BKE_blender_userdef_free(void)
                MEM_freeN(addon);
        }
 
-       for (font = U.uifonts.first; font; font = font->next) {
+       for (uiFont *font = userdef->uifonts.first; font; font = font->next) {
                BLF_unload_id(font->blf_id);
        }
 
        BLF_default_set(-1);
 
-       BLI_freelistN(&U.autoexec_paths);
+       BLI_freelistN(&userdef->autoexec_paths);
+
+       BLI_freelistN(&userdef->uistyles);
+       BLI_freelistN(&userdef->uifonts);
+       BLI_freelistN(&userdef->themes);
+       BLI_freelistN(&userdef->user_keymaps);
 
-       BLI_freelistN(&U.uistyles);
-       BLI_freelistN(&U.uifonts);
-       BLI_freelistN(&U.themes);
-       BLI_freelistN(&U.user_keymaps);
+#undef U
 }
 
 /**
index 354f392..8b47224 100644 (file)
@@ -227,7 +227,7 @@ static void setup_app_data(
        if (bfd->user) {
 
                /* only here free userdef themes... */
-               BKE_blender_userdef_free();
+               BKE_blender_userdef_free(&U);
 
                U = *bfd->user;
 
@@ -436,7 +436,7 @@ int BKE_blendfile_read_userdef(const char *filepath, ReportList *reports)
                        retval = BKE_BLENDFILE_READ_OK_USERPREFS;
 
                        /* only here free userdef themes... */
-                       BKE_blender_userdef_free();
+                       BKE_blender_userdef_free(&U);
 
                        U = *bfd->user;
                        MEM_freeN(bfd->user);
index 4b2369a..227e62d 100644 (file)
@@ -572,7 +572,7 @@ void WM_exit_ext(bContext *C, const bool do_python)
        ED_file_exit(); /* for fsmenu */
 
        UI_exit();
-       BKE_blender_userdef_free();
+       BKE_blender_userdef_free(&U);
 
        RNA_exit(); /* should be after BPY_python_end so struct python slots are cleared */