[Bf-blender-cvs] [6287d254b4] workspaces: Avoid duplicating layout when activating workspace with used layout

Julian Eisel noreply at git.blender.org
Fri Mar 17 12:41:49 CET 2017


Commit: 6287d254b4d299eaf026c3ba93d21d8473e54c0c
Author: Julian Eisel
Date:   Fri Mar 17 12:39:43 2017 +0100
Branches: workspaces
https://developer.blender.org/rB6287d254b4d299eaf026c3ba93d21d8473e54c0c

Avoid duplicating layout when activating workspace with used layout

We now fall-back to the first un-used layout we can find, we only create
a new one if none can be found.

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

M	source/blender/editors/workspace/screen_intern.h
M	source/blender/editors/workspace/workspace_edit.c
M	source/blender/editors/workspace/workspace_layout_edit.c

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

diff --git a/source/blender/editors/workspace/screen_intern.h b/source/blender/editors/workspace/screen_intern.h
index 3193420000..72c6312dd9 100644
--- a/source/blender/editors/workspace/screen_intern.h
+++ b/source/blender/editors/workspace/screen_intern.h
@@ -80,5 +80,8 @@ void	SCREEN_OT_screencast(struct wmOperatorType *ot);
 /* screen_ops.c */
 void	region_blend_start(struct bContext *C, struct ScrArea *sa, struct ARegion *ar);
 
+/* workspace_layout_edit.c */
+bool workspace_layout_set_poll(const struct WorkSpaceLayout *layout);
+
 
 #endif /* __SCREEN_INTERN_H__ */
diff --git a/source/blender/editors/workspace/workspace_edit.c b/source/blender/editors/workspace/workspace_edit.c
index 133c9b43cc..377583d235 100644
--- a/source/blender/editors/workspace/workspace_edit.c
+++ b/source/blender/editors/workspace/workspace_edit.c
@@ -98,6 +98,38 @@ static void workspace_change_update(WorkSpace *workspace_new, const WorkSpace *w
 #endif
 }
 
+static bool workspace_change_find_new_layout_cb(const WorkSpaceLayout *layout, void *UNUSED(arg))
+{
+	/* return false to stop the iterator if we've found a layout that can be activated */
+	return workspace_layout_set_poll(layout) ? false : true;
+}
+
+static WorkSpaceLayout *workspace_change_get_new_layout(
+        WorkSpace *workspace_new, wmWindow *win)
+{
+	/* ED_workspace_duplicate may have stored a layout to activate once the workspace gets activated. */
+	WorkSpaceLayout *layout_temp_store = BKE_workspace_temp_layout_store_get(win->workspace_hook);
+	WorkSpaceLayout *layout_new = layout_temp_store ?
+	                                  layout_temp_store :
+	                                  BKE_workspace_active_layout_get_from_workspace(win->workspace_hook,
+	                                                                                 workspace_new);
+	bScreen *screen_new = BKE_workspace_layout_screen_get(layout_new);
+
+	if (screen_new->winid) {
+		/* screen is already used, try to find a free one */
+		WorkSpaceLayout *layout_temp = BKE_workspace_layout_iter_circular(
+		                                   workspace_new, layout_new, workspace_change_find_new_layout_cb,
+		                                   NULL, false);
+		if (!layout_temp) {
+			/* fallback solution: duplicate layout */
+			layout_temp = ED_workspace_layout_duplicate(workspace_new, layout_new, win);
+		}
+		layout_new = layout_temp;
+	}
+
+	return layout_new;
+}
+
 /**
  * \brief Change the active workspace.
  *
@@ -107,32 +139,22 @@ static void workspace_change_update(WorkSpace *workspace_new, const WorkSpace *w
  * \warning Do NOT call in area/region queues!
  * \returns if workspace changing was successful.
  */
-bool ED_workspace_change(bContext *C, wmWindowManager *wm, wmWindow *win, WorkSpace *workspace_new)
+bool ED_workspace_change(
+        bContext *C, wmWindowManager *wm, wmWindow *win, WorkSpace *workspace_new)
 {
 	Main *bmain = CTX_data_main(C);
 	Scene *scene = CTX_data_scene(C);
 	WorkSpace *workspace_old = WM_window_get_active_workspace(win);
-	bScreen *screen_old = BKE_workspace_active_screen_get(win->workspace_hook);
-	/* ED_workspace_duplicate may have stored a layout to activate once the workspace gets activated. */
-	WorkSpaceLayout *layout_temp_store = BKE_workspace_temp_layout_store_get(win->workspace_hook);
-	WorkSpaceLayout *layout_new = layout_temp_store ?
-	                                  layout_temp_store :
-	                                  BKE_workspace_active_layout_get_from_workspace(win->workspace_hook,
-	                                                                                 workspace_new);
+	WorkSpaceLayout *layout_new = workspace_change_get_new_layout(workspace_new, win);
 	bScreen *screen_new = BKE_workspace_layout_screen_get(layout_new);
+	bScreen *screen_old = BKE_workspace_active_screen_get(win->workspace_hook);
 
+	BKE_workspace_temp_layout_store_set(win->workspace_hook, NULL);
 	if (workspace_old == workspace_new) {
 		/* Could also return true, everything that needs to be done was done (nothing :P), but nothing changed */
 		return false;
 	}
 
-	BKE_workspace_temp_layout_store_set(win->workspace_hook, NULL);
-
-	if (screen_new->winid) {
-		/* screen is already used */
-		layout_new = ED_workspace_layout_duplicate(workspace_new, layout_new, win);
-		screen_new = BKE_workspace_layout_screen_get(layout_new);
-	}
 	screen_new = screen_change_prepare(screen_old, screen_new, bmain, C, win);
 
 	if (screen_new) {
diff --git a/source/blender/editors/workspace/workspace_layout_edit.c b/source/blender/editors/workspace/workspace_layout_edit.c
index f59efe1c49..fbbadd6208 100644
--- a/source/blender/editors/workspace/workspace_layout_edit.c
+++ b/source/blender/editors/workspace/workspace_layout_edit.c
@@ -91,7 +91,7 @@ static bool workspace_layout_delete_doit(bContext *C, WorkSpace *workspace,
 	return false;
 }
 
-static bool workspace_layout_set_poll(const WorkSpaceLayout *layout)
+bool workspace_layout_set_poll(const WorkSpaceLayout *layout)
 {
 	const bScreen *screen = BKE_workspace_layout_screen_get(layout);




More information about the Bf-blender-cvs mailing list