diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_lib_id.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/blendfile.c | 21 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/lib_id.c | 12 |
3 files changed, 34 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_lib_id.h b/source/blender/blenkernel/BKE_lib_id.h index 9f36798fbd5..0c91ba6231b 100644 --- a/source/blender/blenkernel/BKE_lib_id.h +++ b/source/blender/blenkernel/BKE_lib_id.h @@ -74,6 +74,7 @@ void BKE_libblock_init_empty(struct ID *id) ATTR_NONNULL(1); void BKE_lib_libblock_session_uuid_reset(void); void BKE_lib_libblock_session_uuid_ensure(struct ID *id); +void BKE_lib_libblock_session_uuid_renew(struct ID *id); void *BKE_id_new(struct Main *bmain, const short type, const char *name); void *BKE_id_new_nomain(const short type, const char *name); diff --git a/source/blender/blenkernel/intern/blendfile.c b/source/blender/blenkernel/intern/blendfile.c index 0d5d35e3508..13dcc7b06f6 100644 --- a/source/blender/blenkernel/intern/blendfile.c +++ b/source/blender/blenkernel/intern/blendfile.c @@ -201,6 +201,27 @@ static void setup_app_data(bContext *C, SWAP(ListBase, bmain->workspaces, bfd->main->workspaces); SWAP(ListBase, bmain->screens, bfd->main->screens); + /* In case of actual new file reading without loading UI, we need to regenerate the session + * uuid of the UI-related datablocks we are keeping from previous session, otherwise their uuid + * will collide with some generated for newly read data. */ + if (mode != LOAD_UNDO) { + ID *id; + FOREACH_MAIN_LISTBASE_ID_BEGIN (&bfd->main->wm, id) { + BKE_lib_libblock_session_uuid_renew(id); + } + FOREACH_MAIN_LISTBASE_ID_END; + + FOREACH_MAIN_LISTBASE_ID_BEGIN (&bfd->main->workspaces, id) { + BKE_lib_libblock_session_uuid_renew(id); + } + FOREACH_MAIN_LISTBASE_ID_END; + + FOREACH_MAIN_LISTBASE_ID_BEGIN (&bfd->main->screens, id) { + BKE_lib_libblock_session_uuid_renew(id); + } + FOREACH_MAIN_LISTBASE_ID_END; + } + /* we re-use current window and screen */ win = CTX_wm_window(C); curscreen = CTX_wm_screen(C); diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c index ad2cf078054..fe25016344e 100644 --- a/source/blender/blenkernel/intern/lib_id.c +++ b/source/blender/blenkernel/intern/lib_id.c @@ -1033,6 +1033,18 @@ void BKE_lib_libblock_session_uuid_ensure(ID *id) } /** + * Re-generate a new session-wise uuid for the given \a id. + * + * \warning This has a very specific use-case (to handle UI-related data-blocks that are kept + * across new file reading, when we do keep existing UI). No other usage is expected currently. + */ +void BKE_lib_libblock_session_uuid_renew(ID *id) +{ + id->session_uuid = MAIN_ID_SESSION_UUID_UNSET; + BKE_lib_libblock_session_uuid_ensure(id); +} + +/** * Generic helper to create a new empty data-block of given type in given \a bmain database. * * \param name: can be NULL, in which case we get default name for this ID type. |