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