diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-11-22 19:10:58 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-11-22 19:12:00 +0300 |
commit | 326efb431971e668a41d9a331ccc3d11f9fd3e5f (patch) | |
tree | eacd94d8920855df8640f10c4f5995cf0da4cfdb /source/blender/blenkernel | |
parent | d749320e3b10161430bc4cb7dd92edb63712bf8c (diff) |
Fix T53274: Saving template prefs overwrites default prefs
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_blender.h | 13 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_blendfile.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 79 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/blendfile.c | 32 |
4 files changed, 88 insertions, 37 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index ec0bfa6f5fa..647291382ef 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -48,10 +48,17 @@ 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_set_data(struct UserDef *userdef); -void BKE_blender_userdef_free_data(struct UserDef *userdef); +void BKE_blender_userdef_data_swap(struct UserDef *userdef_dst, struct UserDef *userdef_src); +void BKE_blender_userdef_data_set(struct UserDef *userdef); +void BKE_blender_userdef_data_set_and_free(struct UserDef *userdef); -void BKE_blender_userdef_set_app_template(struct UserDef *userdef); +void BKE_blender_userdef_app_template_data_swap(struct UserDef *userdef_dst, struct UserDef *userdef_src); +void BKE_blender_userdef_app_template_data_set(struct UserDef *userdef); +void BKE_blender_userdef_app_template_data_set_and_free(struct UserDef *userdef); + +void BKE_blender_userdef_data_duplicate(struct UserDef *userdef_dst, struct UserDef *userdef_src); + +void BKE_blender_userdef_data_free(struct UserDef *userdef, bool clear_fonts); /* set this callback when a UI is running */ void BKE_blender_callback_test_break_set(void (*func)(void)); diff --git a/source/blender/blenkernel/BKE_blendfile.h b/source/blender/blenkernel/BKE_blendfile.h index 1cf8a78fef3..9ff164f60be 100644 --- a/source/blender/blenkernel/BKE_blendfile.h +++ b/source/blender/blenkernel/BKE_blendfile.h @@ -59,6 +59,7 @@ struct UserDef *BKE_blendfile_userdef_read_from_memory( struct ReportList *reports); bool BKE_blendfile_userdef_write(const char *filepath, struct ReportList *reports); +bool BKE_blendfile_userdef_write_app_template(const char *filepath, struct ReportList *reports); /* partial blend file writing */ void BKE_blendfile_write_partial_tag_ID(struct ID *id, bool set); diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 2624019e63a..fdfb4628d1a 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -150,11 +150,21 @@ static void keymap_item_free(wmKeyMapItem *kmi) MEM_freeN(kmi->ptr); } -void BKE_blender_userdef_set_data(UserDef *userdef) +void BKE_blender_userdef_data_swap(UserDef *userdef_a, UserDef *userdef_b) { - /* only here free userdef themes... */ - BKE_blender_userdef_free_data(&U); - U = *userdef; + SWAP(UserDef, *userdef_a, *userdef_b); +} + +void BKE_blender_userdef_data_set(UserDef *userdef) +{ + BKE_blender_userdef_data_swap(&U, userdef); + BKE_blender_userdef_data_free(userdef, true); +} + +void BKE_blender_userdef_data_set_and_free(UserDef *userdef) +{ + BKE_blender_userdef_data_set(userdef); + MEM_freeN(userdef); } static void userdef_free_keymaps(UserDef *userdef) @@ -201,7 +211,7 @@ static void userdef_free_addons(UserDef *userdef) * When loading a new userdef from file, * or when exiting Blender. */ -void BKE_blender_userdef_free_data(UserDef *userdef) +void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts) { #define U _invalid_access_ /* ensure no accidental global access */ #ifdef U /* quiet warning */ @@ -210,12 +220,13 @@ void BKE_blender_userdef_free_data(UserDef *userdef) userdef_free_keymaps(userdef); userdef_free_addons(userdef); - for (uiFont *font = userdef->uifonts.first; font; font = font->next) { - BLF_unload_id(font->blf_id); + if (clear_fonts) { + for (uiFont *font = userdef->uifonts.first; font; font = font->next) { + BLF_unload_id(font->blf_id); + } + BLF_default_set(-1); } - BLF_default_set(-1); - BLI_freelistN(&userdef->autoexec_paths); BLI_freelistN(&userdef->uistyles); @@ -229,38 +240,50 @@ void BKE_blender_userdef_free_data(UserDef *userdef) * Write U from userdef. * This function defines which settings a template will override for the user preferences. */ -void BKE_blender_userdef_set_app_template(UserDef *userdef) +void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *userdef_b) { /* TODO: * - keymaps * - various minor settings (add as needed). */ -#define LIST_OVERRIDE(id) { \ - BLI_freelistN(&U.id); \ - BLI_movelisttolist(&U.id, &userdef->id); \ -} ((void)0) +#define DATA_SWAP(id) \ + SWAP(userdef_a->id, userdef_b->id); -#define MEMCPY_OVERRIDE(id) \ - memcpy(U.id, userdef->id, sizeof(U.id)); +#define LIST_SWAP(id) { \ + SWAP(ListBase, userdef_a->id, userdef_b->id); \ +} ((void)0) /* for some types we need custom free functions */ - userdef_free_addons(&U); - userdef_free_keymaps(&U); + LIST_SWAP(addons); + LIST_SWAP(user_keymaps); + + LIST_SWAP(uistyles); + LIST_SWAP(uifonts); + LIST_SWAP(themes); + LIST_SWAP(addons); + LIST_SWAP(user_keymaps); + + DATA_SWAP(light); - LIST_OVERRIDE(uistyles); - LIST_OVERRIDE(uifonts); - LIST_OVERRIDE(themes); - LIST_OVERRIDE(addons); - LIST_OVERRIDE(user_keymaps); + DATA_SWAP(font_path_ui); + DATA_SWAP(font_path_ui_mono); - MEMCPY_OVERRIDE(light); +#undef SWAP_TYPELESS +#undef LIST_SWAP +#undef DATA_SWAP +} - MEMCPY_OVERRIDE(font_path_ui); - MEMCPY_OVERRIDE(font_path_ui_mono); +void BKE_blender_userdef_app_template_data_set(UserDef *userdef) +{ + BKE_blender_userdef_app_template_data_swap(&U, userdef); + BKE_blender_userdef_data_free(userdef, true); +} -#undef LIST_OVERRIDE -#undef MEMCPY_OVERRIDE +void BKE_blender_userdef_app_template_data_set_and_free(UserDef *userdef) +{ + BKE_blender_userdef_app_template_data_set(userdef); + MEM_freeN(userdef); } /* ***************** testing for break ************* */ diff --git a/source/blender/blenkernel/intern/blendfile.c b/source/blender/blenkernel/intern/blendfile.c index 99e3769572a..cc992a4a520 100644 --- a/source/blender/blenkernel/intern/blendfile.c +++ b/source/blender/blenkernel/intern/blendfile.c @@ -226,11 +226,9 @@ static void setup_app_data( CTX_data_main_set(C, G.main); if (bfd->user) { - /* only here free userdef themes... */ - BKE_blender_userdef_free_data(&U); - - U = *bfd->user; + BKE_blender_userdef_data_set_and_free(bfd->user); + bfd->user = NULL; /* Security issue: any blend file could include a USER block. * @@ -241,8 +239,6 @@ static void setup_app_data( * enable scripts auto-execution by loading a '.blend' file. */ U.flag |= USER_SCRIPT_AUTOEXEC_DISABLE; - - MEM_freeN(bfd->user); } /* case G_FILE_NO_UI or no screens in file */ @@ -515,6 +511,30 @@ bool BKE_blendfile_userdef_write(const char *filepath, ReportList *reports) return ok; } +/** + * Only write the userdef in a .blend, merging with the existing blend file. + * \return success + * + * \note In the future we should re-evaluate user preferences, + * possibly splitting out system/hardware specific prefs. + */ +bool BKE_blendfile_userdef_write_app_template(const char *filepath, ReportList *reports) +{ + /* if it fails, overwrite is OK. */ + UserDef *userdef_default = BKE_blendfile_userdef_read(filepath, NULL); + if (userdef_default == NULL) { + return BKE_blendfile_userdef_write(filepath, reports); + } + + BKE_blender_userdef_app_template_data_swap(&U, userdef_default); + bool ok = BKE_blendfile_userdef_write(filepath, reports); + BKE_blender_userdef_app_template_data_swap(&U, userdef_default); + BKE_blender_userdef_data_free(userdef_default, false); + MEM_freeN(userdef_default); + return ok; +} + + /** \} */ |