Changeset View
Changeset View
Standalone View
Standalone View
source/blender/windowmanager/intern/wm_jobs.c
| Show First 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | struct wmJob { | ||||
| /* running jobs each have own timer */ | /* running jobs each have own timer */ | ||||
| double timestep; | double timestep; | ||||
| wmTimer *wt; | wmTimer *wt; | ||||
| /* the notifier event timers should send */ | /* the notifier event timers should send */ | ||||
| unsigned int note, endnote; | unsigned int note, endnote; | ||||
| /* internal */ | /* internal */ | ||||
| void *owner; | void *owner; | ||||
| int flag; | int flag; | ||||
| short suspended, running, ready, do_update, stop, job_type; | short suspended, running, ready, do_update, stop, job_type; | ||||
| float progress; | float progress; | ||||
| /* for display in header, identification */ | /* for display in header, identification */ | ||||
| char name[128]; | char name[128]; | ||||
| /* for other text display in progress bar */ | |||||
| char text[128]; | |||||
| /* once running, we store this separately */ | /* once running, we store this separately */ | ||||
| void *run_customdata; | void *run_customdata; | ||||
| void (*run_free)(void *); | void (*run_free)(void *); | ||||
| /* we use BLI_threads api, but per job only 1 thread runs */ | /* we use BLI_threads api, but per job only 1 thread runs */ | ||||
| ListBase threads; | ListBase threads; | ||||
| double start_time; | double start_time; | ||||
| ▲ Show 20 Lines • Show All 117 Lines • ▼ Show 20 Lines | float WM_jobs_progress(wmWindowManager *wm, void *owner) | ||||
| wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); | wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); | ||||
| if (wm_job && wm_job->flag & WM_JOB_PROGRESS) | if (wm_job && wm_job->flag & WM_JOB_PROGRESS) | ||||
| return wm_job->progress; | return wm_job->progress; | ||||
| return 0.0; | return 0.0; | ||||
| } | } | ||||
| /* time that job started */ | |||||
| double WM_jobs_starttime(wmWindowManager *wm, void *owner) | |||||
| { | |||||
| wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); | |||||
| if (wm_job && wm_job->flag & WM_JOB_PROGRESS) | |||||
| return wm_job->start_time; | |||||
| return 0; | |||||
| } | |||||
| /* get progress bar tooltip text */ | |||||
| char *WM_jobs_tooltip(wmWindowManager *wm, void *owner) | |||||
| { | |||||
| wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); | |||||
| if (wm_job && wm_job->flag & WM_JOB_PROGRESS) | |||||
| return wm_job->text; | |||||
| return NULL; | |||||
| } | |||||
| /* set progress bar text (e.g. tooltip, UI label, eta...) */ | |||||
| void WM_jobs_set_tooltip(wmWindowManager *wm, void *owner, char *text) | |||||
| { | |||||
| wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); | |||||
| if (wm_job && wm_job->flag & WM_JOB_PROGRESS) { | |||||
| BLI_strncpy(wm_job->text, text, sizeof(wm_job->text)); | |||||
brecht: Use `sizeof(wm_job->text)` instead of `128`. | |||||
| } | |||||
| } | |||||
| char *WM_jobs_name(wmWindowManager *wm, void *owner) | char *WM_jobs_name(wmWindowManager *wm, void *owner) | ||||
| { | { | ||||
| wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); | wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); | ||||
| if (wm_job) | if (wm_job) | ||||
| return wm_job->name; | return wm_job->name; | ||||
| return NULL; | return NULL; | ||||
| Show All 19 Lines | void *WM_jobs_customdata_from_type(wmWindowManager *wm, int job_type) | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| bool WM_jobs_is_running(wmJob *wm_job) | bool WM_jobs_is_running(wmJob *wm_job) | ||||
| { | { | ||||
| return wm_job->running; | return wm_job->running; | ||||
| } | } | ||||
| bool WM_jobs_is_stopped(wmWindowManager *wm, void *owner) | |||||
| { | |||||
| wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); | |||||
| return wm_job->stop; | |||||
| } | |||||
| void *WM_jobs_customdata_get(wmJob *wm_job) | void *WM_jobs_customdata_get(wmJob *wm_job) | ||||
| { | { | ||||
| if (!wm_job->customdata) { | if (!wm_job->customdata) { | ||||
| return wm_job->run_customdata; | return wm_job->run_customdata; | ||||
| } | } | ||||
| else { | else { | ||||
| return wm_job->customdata; | return wm_job->customdata; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 124 Lines • ▼ Show 20 Lines | if (wm_job->customdata && wm_job->startjob) { | ||||
| BLI_init_threads(&wm_job->threads, do_job_thread, 1); | BLI_init_threads(&wm_job->threads, do_job_thread, 1); | ||||
| BLI_insert_thread(&wm_job->threads, wm_job); | BLI_insert_thread(&wm_job->threads, wm_job); | ||||
| } | } | ||||
| /* restarted job has timer already */ | /* restarted job has timer already */ | ||||
| if (wm_job->wt == NULL) | if (wm_job->wt == NULL) | ||||
| wm_job->wt = WM_event_add_timer(wm, wm_job->win, TIMERJOBS, wm_job->timestep); | wm_job->wt = WM_event_add_timer(wm, wm_job->win, TIMERJOBS, wm_job->timestep); | ||||
| if (G.debug & G_DEBUG_JOBS) | |||||
| wm_job->start_time = PIL_check_seconds_timer(); | wm_job->start_time = PIL_check_seconds_timer(); | ||||
| } | } | ||||
| else { | else { | ||||
| printf("job fails, not initialized\n"); | printf("job fails, not initialized\n"); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void wm_job_free(wmWindowManager *wm, wmJob *wm_job) | static void wm_job_free(wmWindowManager *wm, wmJob *wm_job) | ||||
| ▲ Show 20 Lines • Show All 233 Lines • Show Last 20 Lines | |||||
Use sizeof(wm_job->text) instead of 128.