From e1f1567b5657190d2da2d4a8df49995e0e515d0c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 2 Mar 2018 20:01:49 +1100 Subject: WorkSpace: ED_workspace_object_mode_in_other_window check other windows The same workspace can have different active objects depending on the window. So check other windows. --- source/blender/editors/include/ED_screen.h | 2 +- source/blender/editors/object/object_select.c | 7 ++++--- source/blender/editors/scene/scene_edit.c | 4 ++-- source/blender/editors/screen/workspace_edit.c | 14 +++++++------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 86b9b82e4f7..1f78a5292a7 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -195,7 +195,7 @@ void ED_workspace_object_mode_sync_from_scene( struct wmWindowManager *wm, WorkSpace *workspace, struct Scene *scene); bool ED_workspace_object_mode_in_other_window( - struct wmWindowManager *wm, WorkSpace *workspace, struct Object *obact, + struct wmWindowManager *wm, const struct wmWindow *win_compare, struct Object *obact, eObjectMode *r_object_mode); /* anim */ diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 3d65ca628f9..f416f499b6a 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -124,13 +124,15 @@ void ED_object_base_activate(bContext *C, Base *base) { ViewLayer *view_layer = CTX_data_view_layer(C); + wmWindowManager *wm = CTX_wm_manager(C); + wmWindow *win = CTX_wm_window(C); WorkSpace *workspace = CTX_wm_workspace(C); eObjectMode object_mode = workspace->object_mode; eObjectMode object_mode_set = OB_MODE_OBJECT; if (base && ED_workspace_object_mode_in_other_window( - CTX_wm_manager(C), workspace, base->object, + wm, win, base->object, &object_mode_set)) { /* Sync existing object mode with workspace. */ @@ -146,13 +148,12 @@ void ED_object_base_activate(bContext *C, Base *base) * Not correct because it's possible other work-spaces use these. * although that's a corner case. */ if (workspace->object_mode & OB_MODE_ALL_MODE_DATA) { - wmWindowManager *wm = CTX_wm_manager(C); EvaluationContext eval_ctx; CTX_data_eval_ctx(C, &eval_ctx); FOREACH_OBJECT_BEGIN(view_layer, ob) { if (ob != obact) { if (ED_object_mode_generic_has_data(&eval_ctx, ob) && - ED_workspace_object_mode_in_other_window(wm, workspace, ob, NULL) == false) + ED_workspace_object_mode_in_other_window(wm, win, ob, NULL) == false) { ED_object_mode_generic_exit(&eval_ctx, workspace, scene, ob); } diff --git a/source/blender/editors/scene/scene_edit.c b/source/blender/editors/scene/scene_edit.c index 7cc86488a21..cee73c28767 100644 --- a/source/blender/editors/scene/scene_edit.c +++ b/source/blender/editors/scene/scene_edit.c @@ -135,7 +135,7 @@ void ED_scene_change_update( Object *obact_old = OBACT(layer_old); if (obact_old && (obact_new != obact_old)) { bool obact_old_is_active = - ED_workspace_object_mode_in_other_window(bmain->wm.first, workspace, obact_old, NULL); + ED_workspace_object_mode_in_other_window(bmain->wm.first, win, obact_old, NULL); if (obact_old && (obact_old_is_active == false)) { EvaluationContext eval_ctx; CTX_data_eval_ctx(C, &eval_ctx); @@ -162,7 +162,7 @@ void ED_scene_change_update( else { eObjectMode object_mode_set = OB_MODE_OBJECT; if (ED_workspace_object_mode_in_other_window( - bmain->wm.first, workspace, obact_new, &object_mode_set)) + bmain->wm.first, win, obact_new, &object_mode_set)) { workspace->object_mode = object_mode_set; } diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index 393e99010a7..7635a2644f5 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -190,7 +190,7 @@ bool ED_workspace_change( if (workspace_old->object_mode & OB_MODE_ALL_MODE_DATA) { if (obact_old) { bool obact_old_is_active = - ED_workspace_object_mode_in_other_window(bmain->wm.first, workspace_old, obact_old, NULL); + ED_workspace_object_mode_in_other_window(bmain->wm.first, win, obact_old, NULL); if (obact_old_is_active == false) { eObjectMode object_mode = workspace_old->object_mode; EvaluationContext eval_ctx; @@ -227,7 +227,7 @@ bool ED_workspace_change( else if (use_object_mode) { eObjectMode object_mode_set = workspace_new->object_mode; if (ED_workspace_object_mode_in_other_window( - bmain->wm.first, workspace_new, obact_new, &object_mode_set)) + bmain->wm.first, win, obact_new, &object_mode_set)) { workspace_new->object_mode = object_mode_set; } @@ -356,13 +356,13 @@ void ED_workspace_object_mode_sync_from_scene(wmWindowManager *wm, WorkSpace *wo } bool ED_workspace_object_mode_in_other_window( - struct wmWindowManager *wm, WorkSpace *workspace, Object *obact, + struct wmWindowManager *wm, const wmWindow *win_compare, Object *obact, eObjectMode *r_object_mode) { - for (wmWindow *win = wm->windows.first; win; win = win->next) { - WorkSpace *workspace_iter = BKE_workspace_active_get(win->workspace_hook); - if (workspace != workspace_iter) { - Scene *scene_iter = WM_window_get_active_scene(win); + for (wmWindow *win_iter = wm->windows.first; win_iter; win_iter = win_iter->next) { + if (win_compare != win_iter) { + WorkSpace *workspace_iter = BKE_workspace_active_get(win_iter->workspace_hook); + Scene *scene_iter = WM_window_get_active_scene(win_iter); ViewLayer *view_layer_iter = BKE_view_layer_from_workspace_get(scene_iter, workspace_iter); Object *obact_iter = OBACT(view_layer_iter); if (obact == obact_iter) { -- cgit v1.2.3