[Bf-blender-cvs] [5f8a1a40b7] workspaces: Fix new window always duplicating active window instead of selected one

Julian Eisel noreply at git.blender.org
Fri Mar 17 12:02:37 CET 2017


Commit: 5f8a1a40b71f1917334a29a050b543c14821e790
Author: Julian Eisel
Date:   Fri Mar 17 12:01:56 2017 +0100
Branches: workspaces
https://developer.blender.org/rB5f8a1a40b71f1917334a29a050b543c14821e790

Fix new window always duplicating active window instead of selected one

Also removed wrong assert.

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

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

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

diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 7da4aa701c..d20736c81d 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -145,7 +145,6 @@ WorkSpaceInstanceHook *BKE_workspace_instance_hook_create(const Main *bmain)
 	/* set an active screen-layout for each possible window/workspace combination */
 	BKE_workspace_iter_begin(workspace_iter, bmain->workspaces.first)
 	{
-		BLI_assert(BLI_listbase_count(&workspace_iter->layouts) == 1);
 		BKE_workspace_active_layout_set_for_workspace(hook, workspace_iter, workspace_iter->layouts.first);
 	}
 	BKE_workspace_iter_end;
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index da919d745c..27b6b35c93 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -772,7 +772,7 @@ int wm_window_close_exec(bContext *C, wmOperator *UNUSED(op))
 	return OPERATOR_FINISHED;
 }
 
-static bScreen *wm_window_new_find_screen(wmOperator *op, WorkSpace *workspace)
+static WorkSpaceLayout *wm_window_new_find_layout(wmOperator *op, WorkSpace *workspace)
 {
 	ListBase *listbase = BKE_workspace_layouts_get(workspace);
 	const int layout_id = RNA_enum_get(op->ptr, "screen");
@@ -781,7 +781,7 @@ static bScreen *wm_window_new_find_screen(wmOperator *op, WorkSpace *workspace)
 	BKE_workspace_layout_iter_begin(layout, listbase->first)
 	{
 		if (i++ == layout_id) {
-			return BKE_workspace_layout_screen_get(layout);
+			return layout;
 		}
 	}
 	BKE_workspace_layout_iter_end;
@@ -795,19 +795,21 @@ int wm_window_new_exec(bContext *C, wmOperator *op)
 {
 	wmWindow *win_src = CTX_wm_window(C);
 	WorkSpace *workspace = WM_window_get_active_workspace(win_src);
-	bScreen *screen = wm_window_new_find_screen(op, workspace);
+	WorkSpaceLayout *layout_new = wm_window_new_find_layout(op, workspace);
+	bScreen *screen_new = BKE_workspace_layout_screen_get(layout_new);
 	wmWindow *win_dst;
 
-	if (screen->winid) {
-		/* Screen is already used, duplicate window and screen */
-		win_dst = wm_window_copy_test(C, win_src, true);
-	}
-	else if ((win_dst = wm_window_new_test(C))) {
+	if ((win_dst = wm_window_new_test(C))) {
+		if (screen_new->winid) {
+			/* layout/screen is already used, duplicate it */
+			layout_new = ED_workspace_layout_duplicate(workspace, layout_new, win_dst);
+			screen_new = BKE_workspace_layout_screen_get(layout_new);
+		}
 		/* New window with a different screen but same workspace */
 		WM_window_set_active_workspace(win_dst, workspace);
-		WM_window_set_active_screen(win_dst, workspace, screen);
+		WM_window_set_active_screen(win_dst, workspace, screen_new);
 		win_dst->scene = win_src->scene;
-		screen->winid = win_dst->winid;
+		screen_new->winid = win_dst->winid;
 		CTX_wm_window_set(C, win_dst);
 		ED_screen_refresh(CTX_wm_manager(C), win_dst);
 	}




More information about the Bf-blender-cvs mailing list