From 6abddb0fc4ca483f03e5a111c558824493006af5 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Fri, 24 Jul 2009 12:43:59 +0000 Subject: 2.5 New feature: allowing to open temporarily windows for output. Implemented for: - Render output (use output menu "new window" option). - User Preferences (alt+U, plus added in 'File' menu) Currently the window opens where your mouse is. The Render window works as usual, with ESC or F11 moving it to back or front again. That allows the window position to remain where you moved it on new renders. If you close a render window when it renders, the render thread will be killed. User prefs show 'info window' now... i thought we'd use outliner? Anyhoo, I've made the 'save settings' to close the 2nd window as well. Opening a secondary file window for save I'll check on later, this has to be checked with the current event system still. the WM_window_open_temp() api call for this maintains currently a *single* temp window. If you have a render window open, and call for the preferences, the render window will be used for it. And the other way around. On closing the blender window, the temp windows close automatically when there's no regular window open, and blender quits. --- source/blender/windowmanager/intern/wm_jobs.c | 56 +++++++++++++++++++-------- 1 file changed, 39 insertions(+), 17 deletions(-) (limited to 'source/blender/windowmanager/intern/wm_jobs.c') diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 6dd150a3416..0fd658dbb64 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -252,29 +252,38 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve) } } +/* stop job, free data completely */ +static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *steve) +{ + if(steve->running) { + /* signal job to end */ + steve->stop= 1; + BLI_end_threads(&steve->threads); + } + + if(steve->wt) + WM_event_remove_window_timer(steve->win, steve->wt); + if(steve->customdata) + steve->free(steve->customdata); + if(steve->run_customdata) + steve->run_free(steve->run_customdata); + + /* remove steve */ + BLI_remlink(&wm->jobs, steve); + MEM_freeN(steve); + +} + void WM_jobs_stop_all(wmWindowManager *wm) { - wmJob *steve= wm->jobs.first; + wmJob *steve; - for(; steve; steve= steve->next) { - if(steve->running) { - /* signal job to end */ - steve->stop= 1; - BLI_end_threads(&steve->threads); - } - - if(steve->wt) - WM_event_remove_window_timer(steve->win, steve->wt); - if(steve->customdata) - steve->free(steve->customdata); - if(steve->run_customdata) - steve->run_free(steve->run_customdata); - } + while((steve= wm->jobs.first)) + wm_jobs_kill_job(wm, steve); - BLI_freelistN(&wm->jobs); } -/* stops job(s) from this owner */ +/* signal job(s) from this owner to stop, timer is required to get handled */ void WM_jobs_stop(wmWindowManager *wm, void *owner) { wmJob *steve; @@ -285,6 +294,19 @@ void WM_jobs_stop(wmWindowManager *wm, void *owner) steve->stop= 1; } +/* kill job entirely, also removes timer itself */ +void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt) +{ + wmJob *steve; + + for(steve= wm->jobs.first; steve; steve= steve->next) { + if(steve->wt==wt) { + wm_jobs_kill_job(wm, steve); + return; + } + } +} + /* hardcoded to event TIMERJOBS */ static int wm_jobs_timer(bContext *C, wmOperator *op, wmEvent *evt) { -- cgit v1.2.3