[Bf-blender-cvs] [cd15a54eaf] temp-workspace-multi-window: Add new screen-layouts to all instances of a workspace
Julian Eisel
noreply at git.blender.org
Fri Feb 24 00:33:46 CET 2017
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. @@
More information about the Bf-blender-cvs
mailing list