Commit: cd15a54eafd4fced2e29783fa1a8e5d11f55bb10
Author: Julian Eisel
Date:   Fri Feb 24 00:29:29 2017 +0100
Branches: temp-workspace-multi-window
https://developer.blender.org/rBcd15a54eafd4fced2e29783fa1a8e5d11f55bb10

Add new screen-layouts to all instances of a workspace

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

M       source/blender/blenkernel/BKE_workspace.h
M       source/blender/blenkernel/intern/workspace.c
M       source/blender/editors/include/ED_screen.h
M       source/blender/editors/workspace/screen_edit.c
M       source/blender/editors/workspace/screen_ops.c
M       source/blender/editors/workspace/workspace_edit.c
M       source/blender/editors/workspace/workspace_layout_edit.c
M       source/blender/windowmanager/intern/wm_files.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 547c55bc85..69d4066b3a 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -57,7 +57,7 @@ void BKE_workspace_free(WorkSpace *ws);
 void BKE_workspace_remove(WorkSpace *workspace, struct Main *bmain);
 
 WorkSpaceLayout *BKE_workspace_layout_add_from_type(WorkSpace *workspace, 
WorkSpaceLayoutType *type, struct bScreen *screen) ATTR_NONNULL() 
ATTR_WARN_UNUSED_RESULT;
-WorkSpaceLayoutType *BKE_workspace_layout_type_add(WorkSpace *workspace, 
struct bScreen *screen) ATTR_NONNULL();
+WorkSpaceLayoutType *BKE_workspace_layout_type_add(WorkSpace *workspace, const 
char *name) ATTR_NONNULL();
 WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, struct bScreen 
*screen) ATTR_NONNULL();
 void BKE_workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout 
*layout, struct Main *bmain) ATTR_NONNULL();
 
diff --git a/source/blender/blenkernel/intern/workspace.c 
b/source/blender/blenkernel/intern/workspace.c
index c16b3bc3b6..d3206b9ad3 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -115,11 +115,11 @@ WorkSpaceLayout 
*BKE_workspace_layout_add_from_type(WorkSpace *workspace, WorkSp
        return layout;
 }
 
-WorkSpaceLayoutType *BKE_workspace_layout_type_add(WorkSpace *workspace, 
bScreen *screen)
+WorkSpaceLayoutType *BKE_workspace_layout_type_add(WorkSpace *workspace, const 
char *name)
 {
        WorkSpaceLayoutType *layout_type = MEM_mallocN(sizeof(*layout_type), 
__func__);
 
-       layout_type->name = screen->id.name + 2;
+       layout_type->name = name;
        BLI_addhead(&workspace->layout_types, layout_type);
 
        return layout_type;
@@ -130,7 +130,7 @@ WorkSpaceLayoutType 
*BKE_workspace_layout_type_add(WorkSpace *workspace, bScreen
  */
 WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, bScreen 
*screen)
 {
-       WorkSpaceLayoutType *layout_type = 
BKE_workspace_layout_type_add(workspace, screen);
+       WorkSpaceLayoutType *layout_type = 
BKE_workspace_layout_type_add(workspace, screen->id.name + 2);
        return BKE_workspace_layout_add_from_type(workspace, layout_type, 
screen);
 }
 
diff --git a/source/blender/editors/include/ED_screen.h 
b/source/blender/editors/include/ED_screen.h
index 0641180883..07efdadfdb 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -126,10 +126,10 @@ void    ED_screen_preview_render(const struct bScreen 
*screen, int size_x, int s
 bool ED_workspace_change(struct bContext *C, struct wmWindowManager *wm, 
struct wmWindow *win,
                          struct WorkSpace *ws_new) ATTR_NONNULL();
 struct WorkSpace *ED_workspace_duplicate(struct WorkSpace *workspace_old, 
struct Main *bmain, struct wmWindow *win);
-struct WorkSpaceLayout *ED_workspace_layout_add(struct WorkSpace *workspace, 
struct wmWindow *win, const char *name) ATTR_NONNULL();
+void ED_workspace_layout_add(struct WorkSpace *workspace, ListBase *windows, 
const char *name) ATTR_NONNULL();
 struct WorkSpaceLayout *ED_workspace_layout_duplicate(struct WorkSpace 
*workspace,
                                                       const struct 
WorkSpaceLayout *layout_old,
-                                                      struct wmWindow *win) 
ATTR_NONNULL();
+                                                      struct wmWindowManager 
*wm) ATTR_NONNULL();
 bool ED_workspace_delete(struct Main *bmain, struct bContext *C,
                          struct wmWindowManager *wm, struct wmWindow *win,
                          struct WorkSpace *ws);
diff --git a/source/blender/editors/workspace/screen_edit.c 
b/source/blender/editors/workspace/screen_edit.c
index 2abd275a8b..ea0da00682 100644
--- a/source/blender/editors/workspace/screen_edit.c
+++ b/source/blender/editors/workspace/screen_edit.c
@@ -1515,7 +1515,8 @@ ScrArea *ED_screen_state_toggle(bContext *C, wmWindow 
*win, ScrArea *sa, const s
                oldscreen->state = state;
                BLI_snprintf(newname, sizeof(newname), "%s-%s", 
oldscreen->id.name + 2, "nonnormal");
 
-               layout_new = ED_workspace_layout_add(workspace, win, newname);
+               ED_workspace_layout_add(workspace, &wm->windows, newname);
+               layout_new = BKE_workspace_active_layout_get(workspace);
 
                sc = BKE_workspace_layout_screen_get(layout_new);
                sc->state = state;
diff --git a/source/blender/editors/workspace/screen_ops.c 
b/source/blender/editors/workspace/screen_ops.c
index db818cdf39..a06b3a3163 100644
--- a/source/blender/editors/workspace/screen_ops.c
+++ b/source/blender/editors/workspace/screen_ops.c
@@ -983,6 +983,7 @@ static void SCREEN_OT_area_swap(wmOperatorType *ot)
 /* operator callback */
 static int area_dupli_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
+       wmWindowManager *wm = CTX_wm_manager(C);
        wmWindow *newwin, *win = CTX_wm_window(C);
        Scene *scene;
        WorkSpace *workspace_old = WM_window_get_active_workspace(win);
@@ -1027,7 +1028,8 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, 
const wmEvent *event)
        WM_window_set_active_workspace(newwin, workspace_new);
 
        /* allocs new screen and adds to newly created window, using window 
size */
-       layout_new = ED_workspace_layout_add(workspace_new, newwin, sc->id.name 
+ 2);
+       ED_workspace_layout_add(workspace_new, &wm->windows, sc->id.name + 2);
+       layout_new = BKE_workspace_active_layout_get(workspace_new);
        newsc = BKE_workspace_layout_screen_get(layout_new);
        WM_window_set_active_layout(newwin, layout_new);
 
@@ -3889,12 +3891,12 @@ static void SCREEN_OT_userpref_show(struct 
wmOperatorType *ot)
 
 static int screen_new_exec(bContext *C, wmOperator *UNUSED(op))
 {
-       wmWindow *win = CTX_wm_window(C);
+       wmWindowManager *wm = CTX_wm_manager(C);
        WorkSpace *workspace = CTX_wm_workspace(C);
        WorkSpaceLayout *layout_old = 
BKE_workspace_active_layout_get(workspace);
        WorkSpaceLayout *layout_new;
 
-       layout_new = ED_workspace_layout_duplicate(workspace, layout_old, win);
+       layout_new = ED_workspace_layout_duplicate(workspace, layout_old, wm);
        WM_event_add_notifier(C, NC_WORKSPACE | ND_SCREENBROWSE, layout_new);
 
        return OPERATOR_FINISHED;
diff --git a/source/blender/editors/workspace/workspace_edit.c 
b/source/blender/editors/workspace/workspace_edit.c
index e69b51f0b4..9ec9b5558c 100644
--- a/source/blender/editors/workspace/workspace_edit.c
+++ b/source/blender/editors/workspace/workspace_edit.c
@@ -120,7 +120,7 @@ WorkSpace *ED_workspace_duplicate(WorkSpace *workspace_old, 
Main *bmain, wmWindo
 
        BKE_workspace_layout_iter_begin(layout_old, layouts_old->first)
        {
-               WorkSpaceLayout *layout_new = 
ED_workspace_layout_duplicate(workspace_new, layout_old, win);
+               WorkSpaceLayout *layout_new = 
ED_workspace_layout_duplicate(workspace_new, layout_old, bmain->wm.first);
 
                if (layout_active_old == layout_old) {
                        bScreen *screen_new = 
BKE_workspace_layout_screen_get(layout_new);
diff --git a/source/blender/editors/workspace/workspace_layout_edit.c 
b/source/blender/editors/workspace/workspace_layout_edit.c
index b50dd9f2a0..1dcdcb0089 100644
--- a/source/blender/editors/workspace/workspace_layout_edit.c
+++ b/source/blender/editors/workspace/workspace_layout_edit.c
@@ -43,20 +43,28 @@
 
 
 /**
- * Empty screen, with 1 dummy area without spacedata. Uses window size.
+ * Creates an layout type for \a workspace and layout instances for all 
windows showing this workspace.
+ * Layout instances get an empty screen, with 1 dummy area without spacedata. 
Uses window size.
  */
-WorkSpaceLayout *ED_workspace_layout_add(WorkSpace *workspace, wmWindow *win, 
const char *name)
+void ED_workspace_layout_add(WorkSpace *workspace, ListBase *windows, const 
char *name)
 {
-       const int winsize_x = WM_window_pixels_x(win);
-       const int winsize_y = WM_window_pixels_y(win);
+       WorkSpaceLayoutType *layout_type = 
BKE_workspace_layout_type_add(workspace, name);
 
-       bScreen *screen = screen_add(win, name, winsize_x, winsize_y);
-       WorkSpaceLayout *layout = BKE_workspace_layout_add(workspace, screen);
+       for (wmWindow *win = windows->first; win; win = win->next) {
+               if (win->workspace == workspace) {
+                       const int winsize_x = WM_window_pixels_x(win);
+                       const int winsize_y = WM_window_pixels_y(win);
+                       bScreen *screen = screen_add(win, name, winsize_x, 
winsize_y);
+                       WorkSpaceLayout *layout = 
BKE_workspace_layout_add_from_type(workspace, layout_type, screen);
 
-       return layout;
+                       BLI_addhead(&win->workspace_layouts, layout);
+                       BKE_workspace_active_layout_set(workspace, layout);
+               }
+       }
 }
 
-WorkSpaceLayout *ED_workspace_layout_duplicate(WorkSpace *workspace, const 
WorkSpaceLayout *layout_old, wmWindow *win)
+WorkSpaceLayout *ED_workspace_layout_duplicate(WorkSpace *workspace, const 
WorkSpaceLayout *layout_old,
+                                               wmWindowManager *wm)
 {
        bScreen *screen_old = BKE_workspace_layout_screen_get(layout_old);
        bScreen *screen_new;
@@ -66,7 +74,8 @@ WorkSpaceLayout *ED_workspace_layout_duplicate(WorkSpace 
*workspace, const WorkS
                return NULL; /* XXX handle this case! */
        }
 
-       layout_new = ED_workspace_layout_add(workspace, win, 
screen_old->id.name + 2);
+       ED_workspace_layout_add(workspace, &wm->windows, screen_old->id.name + 
2);
+       layout_new = BKE_workspace_active_layout_get(workspace);
        screen_new = BKE_workspace_layout_screen_get(layout_new);
        screen_data_copy(screen_new, screen_old);
 
diff --git a/source/blender/windowmanager/intern/wm_files.c 
b/source/blender/windowmanager/intern/wm_files.c
index 6d61aa3310..db67a6553d 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -246,10 +246,8 @@ static void wm_window_match_do(bContext *C, ListBase 
*oldwmlist)
 
                        /* when loading without UI, no matching needed */
                        if (!(G.fileflags & G_FILE_NO_UI) && (screen = 
CTX_wm_screen(C))) {
-
                                /* match oldwm to new dbase, only old files */
                                for (wm = oldwmlist->first; wm; wm = 
wm->id.next) {
-                                       
                                        for (win = wm->windows.first; win; win 
= win->next) {
                                                /* all windows get active 
screen from file */
                                                if (screen->winid == 0) {
@@ -258,7 +256,7 @@ static void wm_window_match_do(bContext *C, ListBase 
*oldwmlist)
 

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to