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
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-09-12 13:31:31 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-09-13 15:44:36 +0300
commite082fc7c77235e46a3782e81a255be644a089e7d (patch)
tree6e068f109a19ee4fc942a3957839e11aa0606c4d /source
parent80f083f993d4f62a7e9c35ab946e031ca70b09cd (diff)
Workspaces: reference count screens, otherwise they are never freed.
They are not directly accessible in the UI anymore, it's the workspaces that we always keep until they are manually deleted now.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/library_query.c2
-rw-r--r--source/blender/blenkernel/intern/workspace.c4
-rw-r--r--source/blender/blenloader/intern/readfile.c11
-rw-r--r--source/blender/blenloader/intern/writefile.c17
-rw-r--r--source/blender/makesdna/DNA_workspace_types.h2
5 files changed, 19 insertions, 17 deletions
diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c
index c569f43e7f4..27f0b653347 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -950,7 +950,7 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
/* CALLBACK_INVOKE expects an actual pointer, not a variable holding the pointer.
* However we can't acess layout->screen here since we are outside the workspace project. */
- CALLBACK_INVOKE(screen, IDWALK_CB_NOP);
+ CALLBACK_INVOKE(screen, IDWALK_CB_USER);
/* allow callback to set a different screen */
BKE_workspace_layout_screen_set(layout, screen);
}
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index a5e93c8d765..2829708391f 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -243,6 +243,7 @@ WorkSpaceLayout *BKE_workspace_layout_add(
UNUSED_VARS(bmain);
#endif
layout->screen = screen;
+ id_us_plus(&layout->screen->id);
workspace_layout_name_set(workspace, layout, name);
BLI_addtail(&workspace->layouts, layout);
@@ -253,7 +254,8 @@ void BKE_workspace_layout_remove(
Main *bmain,
WorkSpace *workspace, WorkSpaceLayout *layout)
{
- BKE_libblock_free(bmain, BKE_workspace_layout_screen_get(layout));
+ id_us_min(&layout->screen->id);
+ BKE_libblock_free(bmain, layout->screen);
BLI_freelinkN(&workspace->layouts, layout);
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 810bc466275..b774bb8d1f6 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2949,15 +2949,13 @@ static void lib_link_workspaces(FileData *fd, Main *bmain)
id_us_ensure_real(id);
for (WorkSpaceLayout *layout = layouts->first, *layout_next; layout; layout = layout_next) {
- bScreen *screen = newlibadr(fd, id->lib, BKE_workspace_layout_screen_get(layout));
+ layout->screen = newlibadr_us(fd, id->lib, layout->screen);
layout_next = layout->next;
- if (screen) {
- BKE_workspace_layout_screen_set(layout, screen);
-
+ if (layout->screen) {
if (ID_IS_LINKED(id)) {
- screen->winid = 0;
- if (screen->temp) {
+ layout->screen->winid = 0;
+ if (layout->screen->temp) {
/* delete temp layouts when appending */
BKE_workspace_layout_remove(bmain, workspace, layout);
}
@@ -7251,7 +7249,6 @@ static void lib_link_screen(FileData *fd, Main *main)
for (bScreen *sc = main->screen.first; sc; sc = sc->id.next) {
if (sc->id.tag & LIB_TAG_NEED_LINK) {
IDP_LibLinkProperty(sc->id.properties, fd);
- id_us_ensure_real(&sc->id);
/* deprecated, but needed for versioning (will be NULL'ed then) */
sc->scene = newlibadr(fd, sc->id.lib, sc->scene);
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 57aa5111add..16bc845a3e9 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -3005,15 +3005,18 @@ static void write_windowmanager(WriteData *wd, wmWindowManager *wm)
static void write_screen(WriteData *wd, bScreen *sc)
{
- /* write LibData */
- /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */
- writestruct(wd, ID_SCRN, bScreen, 1, sc);
- write_iddata(wd, &sc->id);
+ /* Screens are reference counted, only saved if used by a workspace. */
+ if (sc->id.us > 0 || wd->use_memfile) {
+ /* write LibData */
+ /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */
+ writestruct(wd, ID_SCRN, bScreen, 1, sc);
+ write_iddata(wd, &sc->id);
- write_previews(wd, sc->preview);
+ write_previews(wd, sc->preview);
- /* direct data */
- write_area_map(wd, AREAMAP_FROM_SCREEN(sc));
+ /* direct data */
+ write_area_map(wd, AREAMAP_FROM_SCREEN(sc));
+ }
}
static void write_bone(WriteData *wd, Bone *bone)
diff --git a/source/blender/makesdna/DNA_workspace_types.h b/source/blender/makesdna/DNA_workspace_types.h
index ad047a85c18..296fa8a713c 100644
--- a/source/blender/makesdna/DNA_workspace_types.h
+++ b/source/blender/makesdna/DNA_workspace_types.h
@@ -111,7 +111,7 @@ typedef struct bToolRef {
typedef struct WorkSpaceLayout {
struct WorkSpaceLayout *next, *prev;
- struct bScreen *screen DNA_PRIVATE_WORKSPACE;
+ struct bScreen *screen;
/* The name of this layout, we override the RNA name of the screen with this (but not ID name itself) */
char name[64] DNA_PRIVATE_WORKSPACE; /* MAX_NAME */
} WorkSpaceLayout;