[Bf-blender-cvs] [6b47c1d] workspaces: Move active screen layout into the active workspace

Julian Eisel noreply at git.blender.org
Sat Dec 3 14:45:12 CET 2016


Commit: 6b47c1d90b0c951ef882299a82d1cbf9240b7bf0
Author: Julian Eisel
Date:   Sat Dec 3 12:12:17 2016 +0100
Branches: workspaces
https://developer.blender.org/rB6b47c1d90b0c951ef882299a82d1cbf9240b7bf0

Move active screen layout into the active workspace

Changing the workspace now also changes the layout. Note that there is a drawing issue here so you'll have to move the window to see the change. There is also a crash when closing Blender, need to investigate some more.
This commit also cares for compatibility, we simply create a new workspace for each screen layout of the old file.

I want to avoid any low-level access of workspace related data, instead everything should go through an API. Thus I also added some API functions for workspaces.
To store bScreens (aka layout) using a ListBase in a workspace, I had to add a bScreen wrapper, called WorkSpaceLayout.

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

M	release/scripts/startup/bl_ui/space_info.py
M	source/blender/blenkernel/BKE_workspace.h
M	source/blender/blenkernel/intern/blendfile.c
M	source/blender/blenkernel/intern/context.c
M	source/blender/blenkernel/intern/depsgraph.c
M	source/blender/blenkernel/intern/image.c
M	source/blender/blenkernel/intern/scene.c
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/writefile.c
M	source/blender/depsgraph/intern/depsgraph_tag.cc
M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_eyedropper.c
M	source/blender/editors/interface/interface_regions.c
M	source/blender/editors/object/object_add.c
M	source/blender/editors/render/render_internal.c
M	source/blender/editors/render/render_update.c
M	source/blender/editors/render/render_view.c
M	source/blender/editors/screen/area.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/editors/screen/screen_intern.h
M	source/blender/editors/screen/screen_ops.c
M	source/blender/editors/screen/workspace_edit.c
M	source/blender/editors/sculpt_paint/paint_image.c
M	source/blender/editors/space_clip/clip_editor.c
M	source/blender/editors/space_node/node_edit.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/makesdna/DNA_windowmanager_types.h
M	source/blender/makesrna/intern/rna_screen.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/makesrna/intern/rna_workspace.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm.c
M	source/blender/windowmanager/intern/wm_draw.c
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_files.c
M	source/blender/windowmanager/intern/wm_init_exit.c
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/intern/wm_stereo.c
M	source/blender/windowmanager/intern/wm_subwindow.c
M	source/blender/windowmanager/intern/wm_window.c
M	source/blenderplayer/bad_level_call_stubs/stubs.c
M	source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp

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

diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py
index 84464a6..ef3130f 100644
--- a/release/scripts/startup/bl_ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -28,6 +28,7 @@ class INFO_HT_header(Header):
         layout = self.layout
 
         window = context.window
+        screen = context.screen
         scene = context.scene
         rd = scene.render
 
@@ -36,13 +37,13 @@ class INFO_HT_header(Header):
 
         INFO_MT_editor_menus.draw_collapsible(context, layout)
 
-        if window.screen.show_fullscreen:
+        if screen.show_fullscreen:
             layout.operator("screen.back_to_previous", icon='SCREEN_BACK', text="Back to Previous")
             layout.separator()
         else:
-            layout.template_ID(context.window, "workspace", new="workspace.workspace_new", unlink="workspace.workspace_delete")
-            layout.template_ID_preview(context.window, "screen", new="screen.new", unlink="screen.delete", rows=2, cols=6)
-            layout.template_ID(context.screen, "scene", new="scene.new", unlink="scene.delete")
+            layout.template_ID(window, "workspace", new="workspace.workspace_new", unlink="workspace.workspace_delete")
+            layout.template_ID_preview(window.workspace, "screen", new="screen.new", unlink="screen.delete", rows=2, cols=6)
+            layout.template_ID(screen, "scene", new="scene.new", unlink="scene.delete")
 
         layout.separator()
 
diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index 90981f1..fc80936 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -25,10 +25,36 @@
 #ifndef __BKE_WORKSPACE_H__
 #define __BKE_WORKSPACE_H__
 
+#include "BLI_compiler_attrs.h"
+
+struct bScreen;
 struct WorkSpace;
 
+
+/* -------------------------------------------------------------------- */
+/* Create, delete, init */
+
 struct WorkSpace *BKE_workspace_add(Main *bmain, const char *name);
 struct WorkSpace *BKE_workspace_duplicate(Main *bmain, const struct WorkSpace *from);
 void BKE_workspace_free(struct WorkSpace *ws);
 
+
+/* -------------------------------------------------------------------- */
+/* General Utils */
+
+struct WorkSpaceLayout *BKE_workspace_layout_find(
+        const struct WorkSpace *ws, const struct bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+
+
+/* -------------------------------------------------------------------- */
+/* Getters/Setters */
+
+struct bScreen *BKE_workspace_active_screen_get(const struct WorkSpace *ws) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+void            BKE_workspace_active_screen_set(struct WorkSpace *ws, struct bScreen *screen) ATTR_NONNULL(1);
+struct Scene   *BKE_workspace_active_scene_get(const struct WorkSpace *ws) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+void            BKE_workspace_active_scene_set(struct WorkSpace *ws, struct Scene *scene);
+
+struct bScreen *BKE_workspace_layout_screen_get(
+        struct WorkSpaceLayout *layout) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+
 #endif /* __BKE_WORKSPACE_H__ */
diff --git a/source/blender/blenkernel/intern/blendfile.c b/source/blender/blenkernel/intern/blendfile.c
index 54f709a..a5018ab 100644
--- a/source/blender/blenkernel/intern/blendfile.c
+++ b/source/blender/blenkernel/intern/blendfile.c
@@ -53,6 +53,7 @@
 #include "BKE_report.h"
 #include "BKE_scene.h"
 #include "BKE_screen.h"
+#include "BKE_workspace.h"
 
 #include "BLO_readfile.h"
 #include "BLO_writefile.h"
@@ -91,9 +92,8 @@ static void clean_paths(Main *main)
 
 static bool wm_scene_is_visible(wmWindowManager *wm, Scene *scene)
 {
-	wmWindow *win;
-	for (win = wm->windows.first; win; win = win->next) {
-		if (win->screen->scene == scene) {
+	for (wmWindow *win = wm->windows.first; win; win = win->next) {
+		if (BKE_workspace_active_scene_get(win->workspace) == scene) {
 			return true;
 		}
 	}
@@ -316,12 +316,12 @@ static void setup_app_data(
 		wmWindowManager *wm = G.main->wm.first;
 
 		if (wm) {
-			wmWindow *win;
+			for (wmWindow *win = wm->windows.first; win; win = win->next) {
+				bScreen *screen = BKE_workspace_active_screen_get(win->workspace);
 
-			for (win = wm->windows.first; win; win = win->next) {
-				if (win->screen && win->screen->scene) /* zealous check... */
-					if (win->screen->scene != curscene)
-						BKE_scene_set_background(G.main, win->screen->scene);
+				if (screen && screen->scene) /* zealous check... */
+					if (screen->scene != curscene)
+						BKE_scene_set_background(G.main, screen->scene);
 			}
 		}
 	}
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 41a4808..c55a2a9 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -50,6 +50,7 @@
 #include "BKE_main.h"
 #include "BKE_screen.h"
 #include "BKE_sound.h"
+#include "BKE_workspace.h"
 
 #include "RNA_access.h"
 
@@ -832,7 +833,7 @@ void CTX_wm_manager_set(bContext *C, wmWindowManager *wm)
 void CTX_wm_window_set(bContext *C, wmWindow *win)
 {
 	C->wm.window = win;
-	C->wm.screen = (win) ? win->screen : NULL;
+	C->wm.screen = (win) ? BKE_workspace_active_screen_get(win->workspace) : NULL;
 	if (C->wm.screen)
 		C->data.scene = C->wm.screen->scene;
 	C->wm.area = NULL;
@@ -842,6 +843,10 @@ void CTX_wm_window_set(bContext *C, wmWindow *win)
 void CTX_wm_workspace_set(bContext *C, WorkSpace *ws)
 {
 	C->wm.workspace = ws;
+	if (C->wm.workspace) {
+		C->wm.screen = BKE_workspace_active_screen_get(C->wm.workspace);
+		C->data.scene = C->wm.screen->scene;
+	}
 	C->wm.area = NULL;
 	C->wm.region = NULL;
 }
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 475afb9..49aeca2 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -86,6 +86,7 @@
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 #include "BKE_tracking.h"
+#include "BKE_workspace.h"
 
 #include "GPU_buffers.h"
 
@@ -2262,8 +2263,10 @@ static void dag_current_scene_layers(Main *bmain, ListBase *lb)
 		BKE_main_id_flag_listbase(&bmain->scene, LIB_TAG_DOIT, 1);
 
 		for (win = wm->windows.first; win; win = win->next) {
-			if (win->screen && win->screen->scene->theDag) {
-				Scene *scene = win->screen->scene;
+			bScreen *screen = BKE_workspace_active_screen_get(win->workspace);
+
+			if (screen && screen->scene->theDag) {
+				Scene *scene = screen->scene;
 				DagSceneLayer *dsl;
 
 				if (scene->id.tag & LIB_TAG_DOIT) {
@@ -2272,7 +2275,7 @@ static void dag_current_scene_layers(Main *bmain, ListBase *lb)
 					BLI_addtail(lb, dsl);
 
 					dsl->scene = scene;
-					dsl->layer = BKE_screen_visible_layers(win->screen, scene);
+					dsl->layer = BKE_screen_visible_layers(screen, scene);
 
 					scene->id.tag &= ~LIB_TAG_DOIT;
 				}
@@ -2289,7 +2292,7 @@ static void dag_current_scene_layers(Main *bmain, ListBase *lb)
 					 */
 					for (dsl = lb->first; dsl; dsl = dsl->next) {
 						if (dsl->scene == scene) {
-							dsl->layer |= BKE_screen_visible_layers(win->screen, scene);
+							dsl->layer |= BKE_screen_visible_layers(screen, scene);
 							break;
 						}
 					}
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index a2d94cc..c3fe8c6 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -80,6 +80,7 @@
 #include "BKE_scene.h"
 #include "BKE_node.h"
 #include "BKE_sequencer.h" /* seq_foreground_frame_get() */
+#include "BKE_workspace.h"
 
 #include "BLF_api.h"
 
@@ -2541,8 +2542,9 @@ void BKE_image_walk_all_users(const Main *mainp, void *customdata,
 	/* image window, compo node users */
 	for (wm = mainp->wm.first; wm; wm = wm->id.next) { /* only 1 wm */
 		for (win = wm->windows.first; win; win = win->next) {
-			ScrArea *sa;
-			for (sa = win->screen->areabase.first; sa; sa = sa->next) {
+			const bScreen *screen = BKE_workspace_active_screen_get(win->workspace);
+
+			for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
 				if (sa->spacetype == SPACE_VIEW3D) {
 					View3D *v3d = sa->spacedata.first;
 					BGpic *bgpic;
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index fb6173c..46e0f6b 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -90,6 +90,7 @@
 #include "BKE_sequencer.h"
 #include "BKE_sound.h"
 #include "BKE_unit.h"
+#include "BKE_workspace.h"
 #include "BKE_world.h"
 
 #include "DEG_depsgraph.h"
@@ -1698,9 +1699,9 @@ static bool check_rendered_viewport_visible(Main *bmain)
 	wmWindowManager *wm = bmain->wm.first;
 	wmWindow *window;
 	for (window = wm->windows.first; window != NULL; window = window->next) {
-		bScreen *screen = window->screen;
-		ScrArea *area;
-		for (area = screen->areabase.first; area != NULL; area = area->next) {
+		const bScreen *screen = BKE_workspace_active_screen_get(window->workspace);
+
+		for (ScrArea *area = screen->areabase.first; area != NULL; area = area->next) {
 			View3D *v3d = area->spacedata.first;
 			if (area->spacetype != SPACE_VIEW3D) {
 				continue;
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 0151f9a..c79c8dd 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -25,11 +25,18 @@
 #include "BLI_utildefines.h"
 
 #include "BKE_library.h"
+#include "BLI_listbase.h"
 #include "BKE_main.h"
 #include "BKE_workspace.h"
 
+#include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
 
+#include "MEM_guardedalloc.h"
+
+
+/* -------------------------------------------------------------------- */
+/* Create, delete, init */
 
 WorkSpace *BKE_workspace_add(Main *bmain, const char *name)
 {
@@ -45,5 +52,50 @@ WorkSpace *BKE_workspace_duplicate(Main *bmain, const WorkSpace *from)
 
 void BKE_workspace_free(WorkSpace *ws)
 {
-	UNUSED_VARS(ws);
+	MEM_freeN(ws->act_layout);
+}
+
+
+/* -------------------------------------------------------------------- */
+/* General Utils */
+
+WorkSpaceLay

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list