[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