[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