[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