[Bf-blender-cvs] [0336dfa3ff6] temp-workspace-object-mode-removal: Fix crash in ED_editors_flush_edits

Campbell Barton noreply at git.blender.org
Wed Feb 7 03:30:17 CET 2018


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;



More information about the Bf-blender-cvs mailing list