/** * This timer system only gives maximum 1 timer event per redraw cycle, * to prevent queues to get overloaded. * Timer handlers should check for delta to decide if they just update, or follow real time. * Timer handlers can also set duration to match frames passed */ static int wm_window_timer(const bContext *C) { wmWindowManager *wm = CTX_wm_manager(C); wmTimer *wt, *wtnext; wmWindow *win; double time = PIL_check_seconds_timer(); int retval = 0; for (wt = wm->timers.first; wt; wt = wtnext) { wtnext = wt->next; /* in case timer gets removed */ win = wt->win; if (wt->sleep == 0) { if (time > wt->ntime) { wt->delta = time - wt->ltime; wt->duration += wt->delta; wt->ltime = time; wt->ntime = wt->stime + wt->timestep * ceil(wt->duration / wt->timestep); if (wt->event_type == TIMERJOBS) wm_jobs_timer(C, wm, wt); else if (wt->event_type == TIMERAUTOSAVE) wm_autosave_timer(C, wm, wt); else if (wt->event_type == TIMERNOTIFIER) WM_main_add_notifier(GET_UINT_FROM_POINTER(wt->customdata), NULL); else if (win) { wmEvent event; wm_event_init_from_window(win, &event); event.type = wt->event_type; event.val = KM_NOTHING; event.keymodifier = 0; event.custom = EVT_DATA_TIMER; event.customdata = wt; wm_event_add(win, &event); retval = 1; } } } } return retval; }
/* This timer system only gives maximum 1 timer event per redraw cycle, * to prevent queues to get overloaded. * Timer handlers should check for delta to decide if they just * update, or follow real time. * Timer handlers can also set duration to match frames passed */ static int wm_window_timer(const bContext *C) { wmWindowManager *wm = CTX_wm_manager(C); wmTimer *wt, *wtnext; wmWindow *win; double time = PIL_check_seconds_timer(); int retval = 0; for (wt = wm->timers.first; wt; wt = wtnext) { wtnext = wt->next; /* in case timer gets removed */ win = wt->win; if (wt->sleep == 0) { if (time > wt->ntime) { wt->delta = time - wt->ltime; wt->duration += wt->delta; wt->ltime = time; wt->ntime = wt->stime + wt->timestep *ceil(wt->duration / wt->timestep); if (wt->event_type == TIMERJOBS) wm_jobs_timer(C, wm, wt); else if (wt->event_type == TIMERAUTOSAVE) wm_autosave_timer(C, wm, wt); else if (win) { wmEvent event = *(win->eventstate); event.type = wt->event_type; event.custom = EVT_DATA_TIMER; event.customdata = wt; wm_event_add(win, &event); retval = 1; } } } } return retval; }