From 4461be1b722a4f6e5af4854eb12023b3670a4c3d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 15 May 2018 19:30:59 +0200 Subject: Fix T55032: Redo w/ file saved in edit-mode failed It's important edit-mode has a step stored for redo to work, file load now ensures this in a generic way. --- source/blender/blenkernel/BKE_undo_system.h | 1 + source/blender/blenkernel/intern/undo_system.c | 9 +++++++++ source/blender/windowmanager/intern/wm_files.c | 17 +++++++++-------- 3 files changed, 19 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_undo_system.h b/source/blender/blenkernel/BKE_undo_system.h index 53ea8ddefe8..05093deec70 100644 --- a/source/blender/blenkernel/BKE_undo_system.h +++ b/source/blender/blenkernel/BKE_undo_system.h @@ -137,6 +137,7 @@ void BKE_undosys_stack_destroy(UndoStack *ustack); void BKE_undosys_stack_clear(UndoStack *ustack); bool BKE_undosys_stack_has_undo(UndoStack *ustack, const char *name); void BKE_undosys_stack_init_from_main(UndoStack *ustack, struct Main *bmain); +void BKE_undosys_stack_init_from_context(UndoStack *ustack, struct bContext *C); UndoStep *BKE_undosys_stack_active_with_type(UndoStack *ustack, const UndoType *ut); UndoStep *BKE_undosys_stack_init_or_active_with_type(UndoStack *ustack, const UndoType *ut); void BKE_undosys_stack_limit_steps_and_memory(UndoStack *ustack, int steps, size_t memory_limit); diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c index 5a0081bff16..7eaf42591f0 100644 --- a/source/blender/blenkernel/intern/undo_system.c +++ b/source/blender/blenkernel/intern/undo_system.c @@ -251,6 +251,15 @@ void BKE_undosys_stack_init_from_main(UndoStack *ustack, struct Main *bmain) undosys_stack_push_main(ustack, "original", bmain); } +/* called after 'BKE_undosys_stack_init_from_main' */ +void BKE_undosys_stack_init_from_context(UndoStack *ustack, bContext *C) +{ + const UndoType *ut = BKE_undosys_type_from_context(C); + if ((ut != NULL) && (ut != BKE_UNDOSYS_TYPE_MEMFILE) && (ut->mode == BKE_UNDOTYPE_MODE_STORE)) { + BKE_undosys_step_push_with_type(ustack, C, "original mode", ut); + } +} + /* name optional */ bool BKE_undosys_stack_has_undo(UndoStack *ustack, const char *name) { diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index da5ebd7abcd..1f85d764d45 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -516,14 +516,7 @@ static void wm_file_read_post(bContext *C, const bool is_startup_file, const boo if (addons_loaded) { wm_file_read_report(C); } - - if (!G.background) { - /* in background mode this makes it hard to load - * a blend file and do anything since the screen - * won't be set to a valid value again */ - CTX_wm_window_set(C, NULL); /* exits queues */ - } - + if (!G.background) { if (wm->undo_stack == NULL) { wm->undo_stack = BKE_undosys_stack_create(); @@ -532,6 +525,14 @@ static void wm_file_read_post(bContext *C, const bool is_startup_file, const boo BKE_undosys_stack_clear(wm->undo_stack); } BKE_undosys_stack_init_from_main(wm->undo_stack, CTX_data_main(C)); + BKE_undosys_stack_init_from_context(wm->undo_stack, C); + } + + if (!G.background) { + /* in background mode this makes it hard to load + * a blend file and do anything since the screen + * won't be set to a valid value again */ + CTX_wm_window_set(C, NULL); /* exits queues */ } } -- cgit v1.2.3