Commit: fca739e7317ca60a226b44e7f505c1953d237977
Author: Julian Eisel
Date:   Sat Dec 31 17:38:24 2016 +0100
Branches: workspaces
https://developer.blender.org/rBfca739e7317ca60a226b44e7f505c1953d237977

Remove workspaces/screen-layouts from default startup.blend except of "Default" 
one

This means in the default startup.blend, there's only going to be one workspace 
and one screen-layout, both called "Default" (will be renamed to "General" 
though). Idea is that users will have the option add a pre-configured workspace 
from a menu. This avoids cluttering screen space with workspaces the user won't 
use even.

For compatibility, screen-layouts from old files are still converted to 
workspaces, this only affects the default startup.blend.

===================================================================

M       source/blender/blenkernel/BKE_workspace.h
M       source/blender/blenkernel/intern/workspace.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/versioning_270.c
M       source/blender/blenloader/intern/versioning_defaults.c
M       source/blender/blenloader/intern/writefile.c
M       source/blender/editors/screen/workspace_edit.c
M       source/blender/editors/screen/workspace_layout_edit.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_workspace.h 
b/source/blender/blenkernel/BKE_workspace.h
index 400bf29..48591d8 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -39,6 +39,7 @@ typedef struct WorkSpaceLayout WorkSpaceLayout;
 
 WorkSpace *BKE_workspace_add(Main *bmain, const char *name);
 void BKE_workspace_free(WorkSpace *ws);
+void BKE_workspace_remove(WorkSpace *workspace, Main *bmain);
 
 struct WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, struct 
bScreen *screen) ATTR_NONNULL();
 void BKE_workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout 
*layout, Main *bmain) ATTR_NONNULL();
@@ -47,16 +48,21 @@ void BKE_workspace_layout_remove(WorkSpace *workspace, 
WorkSpaceLayout *layout,
 /* -------------------------------------------------------------------- */
 /* General Utils */
 
-#define BKE_workspace_iter(_workspace, _start_workspace) \
-       for (WorkSpace *_workspace = _start_workspace; _workspace; _workspace = 
BKE_workspace_next_get(_workspace))
+#define BKE_workspace_iter_begin(_workspace, _start_workspace) \
+       for (WorkSpace *_workspace = _start_workspace, *_workspace##_next; 
_workspace; _workspace = _workspace##_next) { \
+               _workspace##_next = BKE_workspace_next_get(_workspace); /* 
support removing workspace from list */
+#define BKE_workspace_iter_end } (void)0
 
 WorkSpaceLayout *BKE_workspace_layout_find(const WorkSpace *ws, const struct 
bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 WorkSpaceLayout *BKE_workspace_layout_find_exec(const WorkSpace *ws, const 
struct bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 
-#define BKE_workspace_layout_iter(_layout, _start_layout) \
-       for (WorkSpaceLayout *_layout = _start_layout; _layout; _layout = 
BKE_workspace_layout_next_get(_layout))
-#define BKE_workspace_layout_iter_backwards(_layout, _start_layout) \
-       for (WorkSpaceLayout *_layout = _start_layout; _layout; _layout = 
BKE_workspace_layout_prev_get(_layout))
+#define BKE_workspace_layout_iter_begin(_layout, _start_layout) \
+       for (WorkSpaceLayout *_layout = _start_layout, *_layout##_next; 
_layout; _layout = _layout##_next) { \
+               _layout##_next = BKE_workspace_layout_next_get(_layout); /* 
support removing layout from list */
+#define BKE_workspace_layout_iter_backwards_begin(_layout, _start_layout) \
+       for (WorkSpaceLayout *_layout = _start_layout, *_layout##_prev; 
_layout; _layout = _layout##_prev) {\
+               _layout##_prev = BKE_workspace_layout_prev_get(_layout); /* 
support removing layout from list */
+#define BKE_workspace_layout_iter_end } (void)0
 
 WorkSpaceLayout *BKE_workspace_layout_iter_circular(const WorkSpace 
*workspace, WorkSpaceLayout *start,
                                                     bool (*callback)(const 
WorkSpaceLayout *layout, void *arg),
diff --git a/source/blender/blenkernel/intern/workspace.c 
b/source/blender/blenkernel/intern/workspace.c
index ea99842..5564e3a 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -55,6 +55,17 @@ void BKE_workspace_free(WorkSpace *ws)
        BLI_freelistN(&ws->layouts);
 }
 
+void BKE_workspace_remove(WorkSpace *workspace, Main *bmain)
+{
+       BKE_workspace_layout_iter_begin(layout, workspace->layouts.first)
+       {
+               BKE_workspace_layout_remove(workspace, layout, bmain);
+       }
+       BKE_workspace_layout_iter_end;
+
+       BKE_libblock_free(bmain, workspace);
+}
+
 
 /**
  * Add a new layout to \a workspace for \a screen.
@@ -73,8 +84,7 @@ WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace 
*workspace, bScreen *screen)
 void BKE_workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout 
*layout, Main *bmain)
 {
        BKE_libblock_free(bmain, BKE_workspace_layout_screen_get(layout));
-       BLI_remlink(&workspace->layouts, layout);
-       MEM_freeN(layout);
+       BLI_freelinkN(&workspace->layouts, layout);
 }
 
 
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index 73810b3..9ddc9a6 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2746,19 +2746,23 @@ static void lib_link_workspaces(FileData *fd, Main 
*bmain)
        /* Note the NULL pointer checks for result of newlibadr. This is needed 
for reading old files from before the
         * introduction of workspaces (in do_versioning code we already created 
workspaces for screens of old file). */
 
-       BKE_workspace_iter(workspace, bmain->workspaces.first) {
+       BKE_workspace_iter_begin(workspace, bmain->workspaces.first)
+       {
                ID *id = BKE_workspace_id_get(workspace);
                ListBase *layouts = BKE_workspace_layouts_get(workspace);
 
                id_us_ensure_real(id);
 
-               BKE_workspace_layout_iter(layout, layouts->first) {
+               BKE_workspace_layout_iter_begin(layout, layouts->first)
+               {
                        bScreen *screen = newlibadr(fd, id->lib, 
BKE_workspace_layout_screen_get(layout));
                        if (screen) {
                                BKE_workspace_layout_screen_set(layout, screen);
                        }
                }
+               BKE_workspace_layout_iter_end;
        }
+       BKE_workspace_iter_end;
 }
 
 static void direct_link_workspace(FileData *fd, WorkSpace *ws)
@@ -6876,19 +6880,21 @@ static void lib_link_workspace_layout_restore(struct 
IDNameLib_Map *id_map, Main
  */
 void blo_lib_link_restore(Main *newmain, wmWindowManager *curwm, Scene 
*curscene)
 {
-       wmWindow *win;
-
        struct IDNameLib_Map *id_map = BKE_main_idmap_create(newmain);
 
-       BKE_workspace_iter(workspace, newmain->workspaces.first) {
+       BKE_workspace_iter_begin(workspace, newmain->workspaces.first)
+       {
                ListBase *layouts = BKE_workspace_layouts_get(workspace);
 
-               BKE_workspace_layout_iter(layout, layouts->first) {
+               BKE_workspace_layout_iter_begin(layout, layouts->first)
+               {
                        lib_link_workspace_layout_restore(id_map, newmain, 
layout);
                }
+               BKE_workspace_layout_iter_end;
        }
+       BKE_workspace_iter_end;
 
-       for (win = curwm->windows.first; win; win = win->next) {
+       for (wmWindow *win = curwm->windows.first; win; win = win->next) {
                Scene *oldscene = win->scene;
                WorkSpace *workspace = restore_pointer_by_name(id_map, (ID 
*)win->workspace, USER_REAL);
 
diff --git a/source/blender/blenloader/intern/versioning_270.c 
b/source/blender/blenloader/intern/versioning_270.c
index bf9dfbf..0f87f21 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -201,6 +201,8 @@ static void do_version_bones_super_bbone(ListBase *lb)
  *
  * Adds a workspace for each screen of the old file and adds the needed 
workspace-layout to wrap the screen.
  * Rest of the conversion is done in #do_version_workspaces_after_lib_link.
+ *
+ * Note that some of the created workspaces might be deleted again in case of 
reading the default startup.blend.
  */
 static void do_version_workspaces_before_lib_link(Main *main)
 {
diff --git a/source/blender/blenloader/intern/versioning_defaults.c 
b/source/blender/blenloader/intern/versioning_defaults.c
index 99d9e14..54d4ad7 100644
--- a/source/blender/blenloader/intern/versioning_defaults.c
+++ b/source/blender/blenloader/intern/versioning_defaults.c
@@ -43,6 +43,7 @@
 #include "BKE_brush.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
+#include "BKE_workspace.h"
 
 #include "BLO_readfile.h"
 
@@ -71,6 +72,24 @@ void BLO_update_defaults_userpref_blend(void)
 }
 
 /**
+ * New workspace design: Remove all screens except of "Default" one.
+ * For compatibility, a new workspace has been created for each screen of old 
files,
+ * we only want one workspace and one screen in the default startup file 
however.
+ */
+static void update_defaults_startup_workspaces(Main *bmain)
+{
+       BKE_workspace_iter_begin(workspace, bmain->workspaces.first)
+       {
+               if (STREQ(BKE_workspace_name_get(workspace), "Default")) {
+               }
+               else {
+                       BKE_workspace_remove(workspace, bmain);
+               }
+       }
+       BKE_workspace_iter_end;
+}
+
+/**
  * Update defaults in startup.blend, without having to save and embed the file.
  * This function can be emptied each time the startup.blend is updated. */
 void BLO_update_defaults_startup_blend(Main *bmain)
@@ -166,20 +185,18 @@ void BLO_update_defaults_startup_blend(Main *bmain)
                linestyle->chain_count = 10;
        }
 
-       for (bScreen *screen = bmain->screen.first; screen; screen = 
screen->id.next) {
-               ScrArea *area;
-               for (area = screen->areabase.first; area; area = area->next) {
-                       SpaceLink *space_link;
-                       ARegion *ar;
+       update_defaults_startup_workspaces(bmain);
 
-                       for (space_link = area->spacedata.first; space_link; 
space_link = space_link->next) {
+       for (bScreen *screen = bmain->screen.first; screen; screen = 
screen->id.next) {
+               for (ScrArea *area = screen->areabase.first; area; area = 
area->next) {
+                       for (SpaceLink *space_link = area->spacedata.first; 
space_link; space_link = space_link->next) {
                                if (space_link->spacetype == SPACE_CLIP) {
                                        SpaceClip *space_clip = (SpaceClip *) 
space_link;
                                        space_clip->flag &= 
~SC_MANUAL_CALIBRATION;
                                }
                        }
 
-                       for (ar = area->regionbase.first; ar; ar = ar->next) {
+                       for (ARegion *ar = area->regionbase.first; ar; ar = 
ar->next) {
                                /* Remove all stored panels, we want to use 
defaults (order, open/closed) as defined by UI code here! */
                                BLI_freelistN(&ar->panels);
 
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index 5802b1d..4f0f15f 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -3904,11 +3904,13 @@ static void write_cachefiles(WriteData *wd, ListBase 
*idbase)
 
 static void write_workspaces(WriteData *wd, ListBase *idbase)
 {
-       BKE_workspace_iter(workspace, idbase->first) {
+       BKE_workspace_iter_begin(workspace, idbase->first)
+       {
                ListBase *layouts = BKE_workspace_layouts_get(workspace);
                writestruct(wd, ID_WS, WorkSpace, 1, workspace);
                writelist(wd, DATA, WorkSpaceLayout, layouts);
        }
+       BKE_workspace_iter_end;
 }
 
 /* Keep it last of write_foodata functions. */
diff --git a/source/blender/editors/screen/workspace_edit.c 
b/source/blender/editors/screen/workspace_edit.c
index ef5375f..b1bcc03 100644
--- a/source/blender/editors/screen/workspace_edit.c
+++ b/source/blender/editors/screen/workspace_edit.c
@@ -86,7 +86,8 @@ WorkSpace *ED_worksp

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to