diff options
-rw-r--r-- | source/blender/editors/util/undo.c | 6 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_jobs.c | 10 |
3 files changed, 18 insertions, 0 deletions
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index 527537b5efb..f0055bd6008 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -125,6 +125,12 @@ static int ed_undo_step(bContext *C, int step, const char *undoname) Object *obact= CTX_data_active_object(C); ScrArea *sa= CTX_wm_area(C); + /* undo during jobs are running can easily lead to freeing data using by jobs, + or they can just lead to freezing job in some other cases */ + if(WM_jobs_has_running(CTX_wm_manager(C))) { + return OPERATOR_CANCELLED; + } + /* grease pencil can be can be used in plenty of spaces, so check it first */ if(ED_gpencil_session_active()) { return ED_undo_gpencil_step(C, step, undoname); diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index fcdb6d25083..1d8161086b0 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -316,6 +316,8 @@ void WM_jobs_stop(struct wmWindowManager *wm, void *owner, void *startjob); void WM_jobs_kill(struct wmWindowManager *wm, void *owner, void (*)(void *, short int *, short int *, float *)); void WM_jobs_stop_all(struct wmWindowManager *wm); +int WM_jobs_has_running(struct wmWindowManager *wm); + /* clipboard */ char *WM_clipboard_text_get(int selection); void WM_clipboard_text_set(char *buf, int selection); diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 16691ac5ab0..2d0d0f92a44 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -505,3 +505,13 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) } } +int WM_jobs_has_running(wmWindowManager *wm) +{ + wmJob *steve; + + for(steve= wm->jobs.first; steve; steve= steve->next) + if(steve->running) + return 1; + + return 0; +} |