[Bf-blender-cvs] [4e2228525fc] blender2.8: Workspaces: add main and child windows.

Brecht Van Lommel noreply at git.blender.org
Wed Jul 4 18:41:19 CEST 2018


Commit: 4e2228525fc9bbcff58e315c5e3bbc193cd63a0b
Author: Brecht Van Lommel
Date:   Tue Jul 3 15:34:26 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB4e2228525fc9bbcff58e315c5e3bbc193cd63a0b

Workspaces: add main and child windows.

* Main windows show a topbar and statusbar, and select a workspace and
  scene. They are created with Window > New Main Window.

* Child windows do not show a topbar or statusbar. These follow the
  workspace and scene of their parent main window. Created with Window >
  New Window or View > Duplicate Area into New Window.

* The purpose of this change is to support multi monitor setups where you
  just want to put more editors on the other monitors. Without multiple
  topbars and statusbars, working within a single workspace and scene.
  Creating multiple main windows is intended to be a concious choice to
  do different tasks in different workspaces and scenes.

* Note these changes do not currently affect how the operating system
  treats the windows.

* When changing the workspace, the layout in all child windows changes.
  This makes sense if we consider child windows to be just a way to
  extend the main window across more monitors. In some case it may be
  useful to keep the same layout though, we can add an option for this
  depending on user feedback.

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

M	release/scripts/startup/bl_ui/space_topbar.py
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/include/ED_scene.h
M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/scene/scene_edit.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/editors/screen/screen_ops.c
M	source/blender/editors/screen/workspace_edit.c
M	source/blender/editors/space_outliner/outliner_select.c
M	source/blender/editors/space_outliner/outliner_tools.c
M	source/blender/makesdna/DNA_windowmanager_types.h
M	source/blender/makesrna/intern/rna_main_api.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm.c
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/intern/wm_stereo.c
M	source/blender/windowmanager/intern/wm_window.c
M	source/blender/windowmanager/wm_window.h

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

diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py
index beb59d2c512..5cf28578217 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -465,6 +465,10 @@ class INFO_MT_window(Menu):
         layout = self.layout
 
         layout.operator("wm.window_new")
+        layout.operator("wm.window_new_main")
+
+        layout.separator()
+
         layout.operator("wm.window_fullscreen_toggle", icon='FULLSCREEN_ENTER')
 
         layout.separator()
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index a38384f8f2b..1b309d76f61 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -906,7 +906,7 @@ Object *BKE_scene_object_find_by_name(Scene *scene, const char *name)
 /**
  * Sets the active scene, mainly used when running in background mode (``--scene`` command line argument).
  * This is also called to set the scene directly, bypassing windowing code.
- * Otherwise #WM_window_change_active_scene is used when changing scenes by the user.
+ * Otherwise #WM_window_set_active_scene is used when changing scenes by the user.
  */
 void BKE_scene_set_background(Main *bmain, Scene *scene)
 {
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 2a48bf8fc5a..4fa897bb689 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6926,9 +6926,11 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
 	link_list(fd, &wm->windows);
 
 	for (win = wm->windows.first; win; win = win->next) {
-		WorkSpaceInstanceHook *hook = win->workspace_hook;
+		win->parent = newdataadr(fd, win->parent);
 
+		WorkSpaceInstanceHook *hook = win->workspace_hook;
 		win->workspace_hook = newdataadr(fd, hook);
+
 		/* we need to restore a pointer to this later when reading workspaces, so store in global oldnew-map */
 		oldnewmap_insert(fd->globmap, hook, win->workspace_hook, 0);
 
diff --git a/source/blender/editors/include/ED_scene.h b/source/blender/editors/include/ED_scene.h
index 9b48187e541..116d9bd24fc 100644
--- a/source/blender/editors/include/ED_scene.h
+++ b/source/blender/editors/include/ED_scene.h
@@ -31,10 +31,7 @@ enum eSceneCopyMethod;
 
 struct Scene *ED_scene_add(struct Main *bmain, struct bContext *C, struct wmWindow *win, enum eSceneCopyMethod method) ATTR_NONNULL();
 bool ED_scene_delete(struct bContext *C, struct Main *bmain, struct wmWindow *win, struct Scene *scene) ATTR_NONNULL();
-void ED_scene_change_update(
-        struct Main *bmain, struct bContext *C,
-        struct wmWindow *win, const struct bScreen *screen,
-        struct Scene *scene_old, struct Scene *scene_new) ATTR_NONNULL();
+void ED_scene_change_update(struct Main *bmain, struct Scene *scene, struct ViewLayer *layer) ATTR_NONNULL();
 bool ED_scene_view_layer_delete(
         struct Main *bmain, struct Scene *scene, struct ViewLayer *layer,
         struct ReportList *reports) ATTR_NONNULL(1, 2, 3);
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 1fdbd46bacf..cc80108e20c 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -184,10 +184,7 @@ void    ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
 void    ED_screen_ensure_updated(struct wmWindowManager *wm, struct wmWindow *win, struct bScreen *screen);
 void    ED_screen_do_listen(struct bContext *C, struct wmNotifier *note);
 bool    ED_screen_change(struct bContext *C, struct bScreen *sc);
-void    ED_screen_update_after_scene_change(
-        const struct bScreen *screen,
-        struct Scene *scene_new,
-        struct ViewLayer *view_layer);
+void    ED_screen_scene_change(struct bContext *C, struct wmWindow *win, struct Scene *scene);
 void    ED_screen_set_active_region(struct bContext *C, struct wmWindow *win, const int xy[2]);
 void    ED_screen_exit(struct bContext *C, struct wmWindow *window, struct bScreen *screen);
 void    ED_screen_animation_timer(struct bContext *C, int redraws, int refresh, int sync, int enable);
diff --git a/source/blender/editors/scene/scene_edit.c b/source/blender/editors/scene/scene_edit.c
index 677fc0a068e..0ebbd770c9f 100644
--- a/source/blender/editors/scene/scene_edit.c
+++ b/source/blender/editors/scene/scene_edit.c
@@ -80,7 +80,7 @@ Scene *ED_scene_add(Main *bmain, bContext *C, wmWindow *win, eSceneCopyMethod me
 		}
 	}
 
-	WM_window_change_active_scene(bmain, C, win, scene_new);
+	WM_window_set_active_scene(bmain, C, win, scene_new);
 
 	WM_event_add_notifier(C, NC_SCENE | ND_SCENEBROWSE, scene_new);
 
@@ -102,7 +102,7 @@ bool ED_scene_delete(bContext *C, Main *bmain, wmWindow *win, Scene *scene)
 	else
 		return false;
 
-	WM_window_change_active_scene(bmain, C, win, scene_new);
+	WM_window_set_active_scene(bmain, C, win, scene_new);
 
 	BKE_libblock_remap(bmain, scene, scene_new, ID_REMAP_SKIP_INDIRECT_USAGE | ID_REMAP_SKIP_NEVER_NULL_USAGE);
 
@@ -114,43 +114,17 @@ bool ED_scene_delete(bContext *C, Main *bmain, wmWindow *win, Scene *scene)
 	return true;
 }
 
-static ViewLayer *scene_change_get_new_view_layer(const WorkSpace *workspace, const Scene *scene_new)
+/* Depsgraph updates after scene becomes active in a window. */
+void ED_scene_change_update(Main *bmain, Scene *scene, ViewLayer *layer)
 {
-	ViewLayer *layer_new = BKE_workspace_view_layer_exists(workspace, scene_new);
-	return layer_new ? layer_new : BKE_view_layer_default_view(scene_new);
-}
+	Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, layer, true);
 
-void ED_scene_change_update(
-        Main *bmain, bContext *C,
-        wmWindow *win, const bScreen *screen, Scene *UNUSED(scene_old), Scene *scene_new)
-{
-	WorkSpace *workspace = CTX_wm_workspace(C);
-	ViewLayer *layer_new = scene_change_get_new_view_layer(workspace, scene_new);
-	Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene_new, layer_new, true);
-	Object *obact_new = OBACT(layer_new);
-	UNUSED_VARS(obact_new);
-
-#if 0
-	/* mode syncing */
-	eObjectMode object_mode_old = workspace->object_mode;
-	ViewLayer *layer_old = BKE_view_layer_from_workspace_get(scene_old, workspace);
-	Object *obact_old = OBACT(layer_old);
-	UNUSED_VARS(obact_old, object_mode_old);
-#endif
-
-	win->scene = scene_new;
-	CTX_data_scene_set(C, scene_new);
-	BKE_workspace_view_layer_set(workspace, layer_new, scene_new);
-	BKE_scene_set_background(bmain, scene_new);
-	DEG_graph_relations_update(depsgraph, bmain, scene_new, layer_new);
+	BKE_scene_set_background(bmain, scene);
+	DEG_graph_relations_update(depsgraph, bmain, scene, layer);
 	DEG_on_visible_update(bmain, false);
 
-	ED_screen_update_after_scene_change(screen, scene_new, layer_new);
 	ED_render_engine_changed(bmain);
 	ED_update_for_newframe(bmain, depsgraph);
-
-	/* complete redraw */
-	WM_event_add_notifier(C, NC_WINDOW, NULL);
 }
 
 static bool view_layer_remove_poll(
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 6bc8a6c10cf..50609815168 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -477,8 +477,8 @@ void ED_screens_initialize(Main *bmain, wmWindowManager *wm)
 	wmWindow *win;
 
 	for (win = wm->windows.first; win; win = win->next) {
-		if (WM_window_get_active_workspace(win) == NULL) {
-			WM_window_set_active_workspace(win, bmain->workspaces.first);
+		if (BKE_workspace_active_get(win->workspace_hook) == NULL) {
+			BKE_workspace_active_set(win->workspace_hook, bmain->workspaces.first);
 		}
 
 		if (BLI_listbase_is_empty(&win->global_areas.areabase)) {
@@ -792,11 +792,19 @@ static void screen_global_statusbar_area_create(wmWindow *win)
 
 void ED_screen_global_areas_create(wmWindow *win)
 {
+	/* Don't create global areas for child windows. */
+	if (win->parent) {
+		return;
+	}
+
+	/* Don't create global area for temporary windows. */
 	bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
-	if (screen->temp == 0) {
-		screen_global_topbar_area_create(win);
-		screen_global_statusbar_area_create(win);
+	if (screen->temp) {
+		return;
 	}
+
+	screen_global_topbar_area_create(win);
+	screen_global_statusbar_area_create(win);
 }
 
 
@@ -936,13 +944,40 @@ static void screen_set_3dview_camera(Scene *scene, ViewLayer *view_layer, ScrAre
 	}
 }
 
-void ED_screen_update_after_scene_change(const bScreen *screen, Scene *scene_new, ViewLayer *view_layer)
+static ViewLayer *scene_change_get_new_view_layer(const WorkSpace *workspace, const Scene *scene_new)
+{
+	ViewLayer *layer_new = BKE_workspace_view_layer_exists(workspace, scene_new);
+	return layer_new ? layer_new : BKE_view_layer_default_view(scene_new);
+}
+
+void ED_screen_scene_change(bContext *C, wmWindow *win, Scene *scene)
 {
+	const bScreen *screen = WM_window_get_active_screen(win);
+	WorkSpace *workspace = CTX_wm_workspace(C);
+	ViewLayer *view_layer = scene_change_get_new_view_layer(workspace, scene);
+
+#if 0
+	/* mode syncing */
+	Object *obact_new = OBACT(view_layer);
+	UNUSED_VARS(obact_new);
+	eObjectMode object_mode_old = workspace->object_mode;
+	ViewLayer *layer_old = BKE_view_layer_from_workspace_get(scene_old, workspace);
+	Object *obact_old = OBACT(layer_old);
+	UNUSED_VARS(obact_old, object_mode_old);
+#endif
+
+	BKE_workspace_view_layer_set(workspace, view_layer, scene);
+
+	win->scene = scene;
+	if (CTX_wm_window(C) == win) {
+		CTX_data_scene_set(C, scene);
+	}
+
 	for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
 		for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
 			if (sl->spacetype == SPACE_VIEW3D) {
 				View3D *v3d = (View3D *)sl;
-				screen_set_3dview_camera(scene_new, view_layer, sa, v3d);
+				screen_set_3dview_camera(scene, view_layer, sa, v3d);
 			}
 		}
 	}
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index a0e8357b8f3..ab0fbfacf93 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1130,7 +1130,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list