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)
 {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to