[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