[Bf-blender-cvs] [f992b39e38] temp-workspace-multi-window: Don't copy workspace when copying window

Julian Eisel noreply at git.blender.org
Tue Mar 7 20:07:26 CET 2017


Commit: f992b39e38d47ba17b17d543673b3e96bd23fbef
Author: Julian Eisel
Date:   Tue Mar 7 20:03:51 2017 +0100
Branches: temp-workspace-multi-window
https://developer.blender.org/rBf992b39e38d47ba17b17d543673b3e96bd23fbef

Don't copy workspace when copying window

This kinda works, however screens are still completly broken after that
:) But: getting there!

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

M	source/blender/blenkernel/BKE_workspace.h
M	source/blender/blenkernel/intern/workspace.c
M	source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index 99c072a026..3b06bd6ab0 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -116,6 +116,7 @@ WorkSpaceLayout *BKE_workspace_active_layout_get(const struct WorkSpace *ws) GET
 void             BKE_workspace_active_layout_set(WorkSpace *ws, WorkSpaceLayout *layout) SETTER_ATTRS;
 struct bScreen *BKE_workspace_active_screen_get(const WorkSpace *ws) GETTER_ATTRS;
 void            BKE_workspace_active_screen_set(const WorkSpaceHook *hook, struct bScreen *screen) SETTER_ATTRS;
+struct bScreen *BKE_workspace_hook_active_screen_get(const WorkSpaceHook *hook) GETTER_ATTRS;
 enum ObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace) GETTER_ATTRS;
 #ifdef USE_WORKSPACE_MODE
 void            BKE_workspace_object_mode_set(WorkSpace *workspace, const enum ObjectMode mode) SETTER_ATTRS;
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index cb75240e20..9d59023de6 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -299,6 +299,17 @@ void BKE_workspace_active_screen_set(const WorkSpaceHook *hook, bScreen *screen)
 	workspace->act_layout = layout;
 	workspace->act_layout_type = layout->type;
 }
+bScreen *BKE_workspace_hook_active_screen_get(const WorkSpaceHook *hook)
+{
+	/* XXX should be able to get screen from hook directly (no iterating) */
+	for (WorkSpaceLayout *layout = hook->layouts.first; layout; layout = layout->next) {
+		if (layout->type == hook->act_workspace->act_layout_type) {
+			return layout->screen;
+		}
+	}
+
+	return NULL;
+}
 
 #ifdef USE_WORKSPACE_MODE
 ObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace)
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 88671a4743..855f0b98d0 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -253,7 +253,6 @@ wmWindow *wm_window_new(bContext *C)
 /* part of wm_window.c api */
 wmWindow *wm_window_copy(bContext *C, wmWindow *win_src)
 {
-	Main *bmain = CTX_data_main(C);
 	wmWindow *win_dst = wm_window_new(C);
 	WorkSpace *workspace_src = WM_window_get_active_workspace(win_src);
 	Scene *scene = WM_window_get_active_scene(win_src);
@@ -265,7 +264,8 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *win_src)
 	win_dst->sizey = win_src->sizey;
 
 	win_dst->scene = scene;
-	WM_window_set_active_workspace(win_dst, ED_workspace_duplicate(workspace_src, bmain, win_dst));
+	WM_window_set_active_workspace(win_dst, workspace_src);
+	/* the active screen that has been created for this workspace */
 	new_screen = WM_window_get_active_screen(win_dst);
 	BLI_strncpy(win_dst->screenname, new_screen->id.name + 2, sizeof(win_dst->screenname));
 
@@ -1817,7 +1817,7 @@ bScreen *WM_window_get_active_screen(const wmWindow *win)
 {
 	const WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook);
 	/* May be NULL in rare cases like closing Blender */
-	return (LIKELY(workspace != NULL) ? BKE_workspace_active_screen_get(workspace) : NULL);
+	return (LIKELY(workspace != NULL) ? BKE_workspace_hook_active_screen_get(win->workspace_hook) : NULL);
 }
 void WM_window_set_active_screen(wmWindow *win, bScreen *screen)
 {




More information about the Bf-blender-cvs mailing list