/* context is allowed to be NULL, do not free wm itself (library.c) */ void wm_close_and_free(bContext *C, wmWindowManager *wm) { wmWindow *win; wmOperator *op; wmKeyConfig *keyconf; if(wm->autosavetimer) wm_autosave_timer_ended(wm); while((win= wm->windows.first)) { BLI_remlink(&wm->windows, win); win->screen= NULL; /* prevent draw clear to use screen */ wm_draw_window_clear(win); wm_window_free(C, wm, win); } while((op= wm->operators.first)) { BLI_remlink(&wm->operators, op); WM_operator_free(op); } while((keyconf=wm->keyconfigs.first)) { BLI_remlink(&wm->keyconfigs, keyconf); WM_keyconfig_free(keyconf); } BLI_freelistN(&wm->queue); BLI_freelistN(&wm->paintcursors); BLI_freelistN(&wm->drags); wm_reports_free(wm); if(C && CTX_wm_manager(C)==wm) CTX_wm_manager_set(C, NULL); }
/* this is event from ghost, or exit-blender op */ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win) { wmWindow *tmpwin; bool do_exit = false; /* first check if we have to quit (there are non-temp remaining windows) */ for (tmpwin = wm->windows.first; tmpwin; tmpwin = tmpwin->next) { if (tmpwin == win) continue; if (tmpwin->screen->temp == 0) break; } if (tmpwin == NULL) do_exit = 1; if ((U.uiflag & USER_QUIT_PROMPT) && !wm->file_saved) { if (do_exit) { if (!GHOST_confirmQuit(win->ghostwin)) return; } } /* let WM_exit do all freeing, for correct quit.blend save */ if (do_exit) { WM_exit(C); } else { bScreen *screen = win->screen; BLI_remlink(&wm->windows, win); wm_draw_window_clear(win); CTX_wm_window_set(C, win); /* needed by handlers */ WM_event_remove_handlers(C, &win->handlers); WM_event_remove_handlers(C, &win->modalhandlers); /* for regular use this will _never_ be NULL, * however we may be freeing an improperly initialized window. */ if (win->screen) { ED_screen_exit(C, win, win->screen); } wm_window_free(C, wm, win); /* if temp screen, delete it after window free (it stops jobs that can access it) */ if (screen && screen->temp) { Main *bmain = CTX_data_main(C); BKE_libblock_free(bmain, screen); } } }
/* this is event from ghost, or exit-blender op */ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win) { wmWindow *tmpwin; bScreen *screen = win->screen; /* first check if we have any non-temp remaining windows */ if ((U.uiflag & USER_QUIT_PROMPT) && !wm->file_saved) { if (wm->windows.first) { for (tmpwin = wm->windows.first; tmpwin; tmpwin = tmpwin->next) { if (tmpwin == win) continue; if (tmpwin->screen->temp == 0) break; } if (tmpwin == NULL) { if (!GHOST_confirmQuit(win->ghostwin)) return; } } } BLI_remlink(&wm->windows, win); wm_draw_window_clear(win); CTX_wm_window_set(C, win); /* needed by handlers */ WM_event_remove_handlers(C, &win->handlers); WM_event_remove_handlers(C, &win->modalhandlers); ED_screen_exit(C, win, win->screen); wm_window_free(C, wm, win); /* if temp screen, delete it after window free (it stops jobs that can access it) */ if (screen->temp) { Main *bmain = CTX_data_main(C); BKE_libblock_free(&bmain->screen, screen); } /* check remaining windows */ if (wm->windows.first) { for (win = wm->windows.first; win; win = win->next) if (win->screen->temp == 0) break; /* in this case we close all */ if (win == NULL) WM_exit(C); } else WM_exit(C); }