Commit: e1f1567b5657190d2da2d4a8df49995e0e515d0c
Author: Campbell Barton
Date:   Fri Mar 2 20:01:49 2018 +1100
Branches: blender2.8
https://developer.blender.org/rBe1f1567b5657190d2da2d4a8df49995e0e515d0c

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.

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

M       source/blender/editors/include/ED_screen.h
M       source/blender/editors/object/object_select.c
M       source/blender/editors/scene/scene_edit.c
M       source/blender/editors/screen/workspace_edit.c

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

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) {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to