From a0f2923fd821099039c6350f3e8666d1d4d37ec9 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Fri, 8 Mar 2019 18:48:27 -0300 Subject: Fix active workspace changes when deleting workspace Tested for multi-window as well, which failed with the previous code even before we introduced ordered workspaces. --- source/blender/editors/screen/workspace_edit.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'source/blender/editors/screen/workspace_edit.c') diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index b63a755368e..c777308e435 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -221,20 +221,31 @@ WorkSpace *ED_workspace_duplicate( bool ED_workspace_delete( WorkSpace *workspace, Main *bmain, bContext *C, wmWindowManager *wm) { - ID *workspace_id = (ID *)workspace; - if (BLI_listbase_is_single(&bmain->workspaces)) { return false; } - for (wmWindow *win = wm->windows.first; win; win = win->next) { - WorkSpace *prev = workspace_id->prev; - WorkSpace *next = workspace_id->next; + ListBase ordered; + BKE_id_ordered_list(&ordered, &bmain->workspaces); + WorkSpace *prev = NULL, *next = NULL; + for (LinkData *link = ordered.first; link; link = link->next) { + if (link->data == workspace) { + prev = link->prev ? link->prev->data : NULL; + next = link->next ? link->next->data : NULL; + break; + } + } + BLI_freelistN(&ordered); + BLI_assert((prev != NULL) || (next != NULL)); - ED_workspace_change((prev != NULL) ? prev : next, C, wm, win); + for (wmWindow *win = wm->windows.first; win; win = win->next) { + WorkSpace *workspace_active = WM_window_get_active_workspace(win); + if (workspace_active == workspace) { + ED_workspace_change((prev != NULL) ? prev : next, C, wm, win); + } } - BKE_id_free(bmain, workspace_id); + BKE_id_free(bmain, &workspace->id); return true; } -- cgit v1.2.3