Commit: 0336dfa3ff6c45e0e464c920f78547895bb6c2c7
Author: Campbell Barton
Date:   Wed Feb 7 13:06:08 2018 +1100
Branches: temp-workspace-object-mode-removal
https://developer.blender.org/rB0336dfa3ff6c45e0e464c920f78547895bb6c2c7

Fix crash in ED_editors_flush_edits

Also take all workspaces into account using WM_windows_object_mode_get

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

M       source/blender/editors/util/ed_util.c
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/editors/util/ed_util.c 
b/source/blender/editors/util/ed_util.c
index a1e69375c28..02443af0bfc 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -41,6 +41,7 @@
 #include "DNA_space_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_packedFile_types.h"
+#include "DNA_workspace_types.h"
 
 #include "BLI_utildefines.h"
 #include "BLI_string.h"
@@ -88,10 +89,7 @@
 void ED_editors_init(bContext *C)
 {
        wmWindowManager *wm = CTX_wm_manager(C);
-       Main *bmain = CTX_data_main(C);
        Scene *sce = CTX_data_scene(C);
-       ViewLayer *view_layer = CTX_data_view_layer(C);
-       Object *ob, *obact = (view_layer && view_layer->basact) ? 
view_layer->basact->object : NULL;
 
        /* This is called during initialization, so we don't want to store any 
reports */
        ReportList *reports = CTX_wm_reports(C);
@@ -99,28 +97,6 @@ void ED_editors_init(bContext *C)
 
        SWAP(int, reports->flag, reports_flag_prev);
 
-#if 0 // XXX TODO
-       /* toggle on modes for objects that were saved with these enabled. for
-        * e.g. linked objects we have to ensure that they are actually the
-        * active object in this scene. */
-       for (ob = bmain->object.first; ob; ob = ob->id.next) {
-               int mode = ob->mode;
-
-               if (mode == OB_MODE_OBJECT) {
-                       /* pass */
-               }
-               else {
-                       ID *data = ob->data;
-                       ob->mode = OB_MODE_OBJECT;
-                       if ((ob == obact) && !ID_IS_LINKED(ob) && !(data && 
ID_IS_LINKED(data))) {
-                               ED_object_toggle_modes(C, mode);
-                       }
-               }
-       }
-#else
-       UNUSED_VARS(bmain, ob, obact);
-#endif
-
        /* image editor paint mode */
        if (sce) {
                ED_space_image_paint_update(wm, sce);
@@ -171,17 +147,20 @@ void ED_editors_exit(bContext *C)
  * rendering, copying, etc. */
 bool ED_editors_flush_edits(const bContext *C, bool for_render)
 {
-       EvaluationContext eval_ctx;
-       CTX_data_eval_ctx(C, &eval_ctx);
        bool has_edited = false;
        Object *ob;
        Main *bmain = CTX_data_main(C);
 
+       eObjectMode object_mode = WM_windows_object_mode_get(bmain->wm.first);
+       if ((object_mode & (OB_MODE_SCULPT | OB_MODE_EDIT)) == 0) {
+               return has_edited;
+       }
+
        /* loop through all data to find edit mode or object mode, because 
during
         * exiting we might not have a context for edit object and multiple 
sculpt
         * objects can exist at the same time */
        for (ob = bmain->object.first; ob; ob = ob->id.next) {
-               if (eval_ctx.object_mode & OB_MODE_SCULPT) {
+               if (object_mode & OB_MODE_SCULPT) {
                        /* Don't allow flushing while in the middle of a stroke 
(frees data in use).
                         * Auto-save prevents this from happening but scripts 
may cause a flush on saving: T53986. */
                        if ((ob->sculpt && ob->sculpt->cache) == 0) {
@@ -200,7 +179,7 @@ bool ED_editors_flush_edits(const bContext *C, bool 
for_render)
                                }
                        }
                }
-               else if (eval_ctx.object_mode & OB_MODE_EDIT) {
+               else if (object_mode & OB_MODE_EDIT) {
                        /* get editmode results */
                        has_edited = true;
                        ED_object_editmode_load(ob);
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index 7a66cc04014..50efc4d3252 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -68,6 +68,8 @@ struct ScrArea;
 struct Main;
 struct bToolDef;
 
+#include "DNA_object_enums.h"
+
 #ifdef WITH_INPUT_NDOF
 struct wmNDOFMotionData;
 #endif
@@ -103,6 +105,7 @@ bool                WM_window_is_fullscreen (struct 
wmWindow *win);
 void WM_windows_scene_data_sync(const ListBase *win_lb, struct Scene *scene) 
ATTR_NONNULL();
 struct Scene *WM_windows_scene_get_from_screen(const struct wmWindowManager 
*wm, const struct bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 struct WorkSpace *WM_windows_workspace_get_from_screen(const wmWindowManager 
*wm, const struct bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+eObjectMode WM_windows_object_mode_get(const struct wmWindowManager *wm) 
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 
 struct Scene *WM_window_get_active_scene(const struct wmWindow *win) 
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 void          WM_window_change_active_scene(struct Main *bmain, struct 
bContext *C, struct wmWindow *win,
diff --git a/source/blender/windowmanager/intern/wm_window.c 
b/source/blender/windowmanager/intern/wm_window.c
index 0e07b66996d..7557abffee4 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -1948,6 +1948,18 @@ WorkSpace *WM_windows_workspace_get_from_screen(const 
wmWindowManager *wm, const
        return NULL;
 }
 
+eObjectMode WM_windows_object_mode_get(const struct wmWindowManager *wm)
+{
+       eObjectMode object_mode = 0;
+       for (wmWindow *win = wm->windows.first; win; win = win->next) {
+               const WorkSpace *workspace = 
BKE_workspace_active_get(win->workspace_hook);
+               if (workspace != NULL) {
+                       object_mode |= workspace->object_mode;
+               }
+       }
+       return object_mode;
+}
+
 Scene *WM_window_get_active_scene(const wmWindow *win)
 {
        return win->scene;

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

Reply via email to