[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