Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-03-11 16:34:23 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-03-11 16:40:52 +0300
commit2cc5af9c553cfc00b7d4616445ad954597a92d94 (patch)
treeccc0fa74bd5df7ed9d20867832997f1b8d6c82f3 /source/blender/blenkernel/intern/lib_remap.c
parent2cdebf293d4cf925e1cdaf5c4a247b8886c1026e (diff)
Fix T86431: Keep memory location of the window manager on file load
Keep the pointer location from the initial window-manager between file load operations. This is needed as the Python API may hold references to keymaps for e.g. which are transferred to the newly loaded window manager, without their `PointerRNA.owner_id` fields being updated. Since there is only ever one window manager, keep the memory at the same location so the Python ID pointers stay valid. Reviewed By: mont29 Ref D10690
Diffstat (limited to 'source/blender/blenkernel/intern/lib_remap.c')
-rw-r--r--source/blender/blenkernel/intern/lib_remap.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/source/blender/blenkernel/intern/lib_remap.c b/source/blender/blenkernel/intern/lib_remap.c
index 56f7bb0be6f..0218cb913a8 100644
--- a/source/blender/blenkernel/intern/lib_remap.c
+++ b/source/blender/blenkernel/intern/lib_remap.c
@@ -422,15 +422,17 @@ static void libblock_remap_data(
FOREACH_MAIN_ID_END;
}
- /* XXX We may not want to always 'transfer' fake-user from old to new id...
- * Think for now it's desired behavior though,
- * we can always add an option (flag) to control this later if needed. */
- if (old_id && (old_id->flag & LIB_FAKEUSER)) {
- id_fake_user_clear(old_id);
- id_fake_user_set(new_id);
- }
+ if ((remap_flags & ID_REMAP_SKIP_USER_CLEAR) == 0) {
+ /* XXX We may not want to always 'transfer' fake-user from old to new id...
+ * Think for now it's desired behavior though,
+ * we can always add an option (flag) to control this later if needed. */
+ if (old_id && (old_id->flag & LIB_FAKEUSER)) {
+ id_fake_user_clear(old_id);
+ id_fake_user_set(new_id);
+ }
- id_us_clear_real(old_id);
+ id_us_clear_real(old_id);
+ }
if (new_id && (new_id->tag & LIB_TAG_INDIRECT) &&
(r_id_remap_data->status & ID_REMAP_IS_LINKED_DIRECT)) {
@@ -479,12 +481,14 @@ void BKE_libblock_remap_locked(Main *bmain, void *old_idv, void *new_idv, const
skipped_direct = id_remap_data.skipped_direct;
skipped_refcounted = id_remap_data.skipped_refcounted;
- /* If old_id was used by some ugly 'user_one' stuff (like Image or Clip editors...), and user
- * count has actually been incremented for that, we have to decrease once more its user count...
- * unless we had to skip some 'user_one' cases. */
- if ((old_id->tag & LIB_TAG_EXTRAUSER_SET) &&
- !(id_remap_data.status & ID_REMAP_IS_USER_ONE_SKIPPED)) {
- id_us_clear_real(old_id);
+ if ((remap_flags & ID_REMAP_SKIP_USER_CLEAR) == 0) {
+ /* If old_id was used by some ugly 'user_one' stuff (like Image or Clip editors...), and user
+ * count has actually been incremented for that, we have to decrease once more its user
+ * count... unless we had to skip some 'user_one' cases. */
+ if ((old_id->tag & LIB_TAG_EXTRAUSER_SET) &&
+ !(id_remap_data.status & ID_REMAP_IS_USER_ONE_SKIPPED)) {
+ id_us_clear_real(old_id);
+ }
}
if (old_id->us - skipped_refcounted < 0) {