diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_init_exit.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_init_exit.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 98ac3eebb57..03bc1ae0a02 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -445,6 +445,29 @@ static void wait_for_console_key(void) } #endif +static int wm_exit_handler(bContext *C, const wmEvent *event, void *userdata) +{ + WM_exit(C); + + UNUSED_VARS(event, userdata); + return WM_UI_HANDLER_BREAK; +} + +/** + * Cause a delayed WM_exit() call to avoid leaking memory when trying to exit from within operators. + */ +void wm_exit_schedule_delayed(const bContext *C) +{ + /* What we do here is a little bit hacky, but quite simple and doesn't require bigger + * changes: Add a handler wrapping WM_exit() to cause a delayed call of it. */ + + wmWindow *win = CTX_wm_window(C); + + /* Use modal UI handler for now. Could add separate WM handlers or so, but probably not worth it. */ + WM_event_add_ui_handler(C, &win->modalhandlers, wm_exit_handler, NULL, NULL, 0); + WM_event_add_mousemove(C); /* ensure handler actually gets called */ +} + /** * \note doesn't run exit() call #WM_exit() for that. */ @@ -625,6 +648,10 @@ void WM_exit_ext(bContext *C, const bool do_python) BKE_tempdir_session_purge(); } +/** + * \brief Main exit function to close Blender ordinarily. + * \note Use #wm_exit_schedule_delayed() to close Blender from an operator. Might leak memory otherwise. + */ void WM_exit(bContext *C) { WM_exit_ext(C, 1); |