/**
 * 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;
}
Beispiel #2
0
/* 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;
}