Support passing in UserDef for free function

Needed so we can load and free non-global user preferences.
This commit is contained in:
Campbell Barton 2017-03-17 00:18:20 +11:00
parent 1cad64900e
commit aad9dd2f1b
4 changed files with 27 additions and 22 deletions

@ -38,13 +38,17 @@
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 */

@ -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;
#define U _invalid_access_ /* ensure no accidental global access */
#ifdef U /* quiet warning */
#endif
for (km = U.user_keymaps.first; km; km = km->next) {
for (kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) {
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(&U.uistyles);
BLI_freelistN(&U.uifonts);
BLI_freelistN(&U.themes);
BLI_freelistN(&U.user_keymaps);
BLI_freelistN(&userdef->uistyles);
BLI_freelistN(&userdef->uifonts);
BLI_freelistN(&userdef->themes);
BLI_freelistN(&userdef->user_keymaps);
#undef U
}
/**

@ -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);

@ -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 */