diff --git a/window-clock.c b/window-clock.c index 51620d4a..81d33858 100644 --- a/window-clock.c +++ b/window-clock.c @@ -123,6 +123,26 @@ const char window_clock_table[14][5][5] = { { 1,0,0,0,1 } }, }; +static void +window_clock_start_timer(struct window_mode_entry *wme) +{ + struct window_clock_mode_data *data = wme->data; + struct timeval tv; + struct timespec ts; + long delay; + + clock_gettime(CLOCK_REALTIME, &ts); + delay = 1000000 - (ts.tv_nsec / 1000); + + tv.tv_sec = delay / 1000000; + tv.tv_usec = delay % 1000000; + if (tv.tv_sec < 0 || (tv.tv_sec == 0 && tv.tv_usec <= 0)) { + tv.tv_sec = 1; + tv.tv_usec = 0; + } + evtimer_add(&data->timer, &tv); +} + static void window_clock_timer_callback(__unused int fd, __unused short events, void *arg) { @@ -131,23 +151,20 @@ window_clock_timer_callback(__unused int fd, __unused short events, void *arg) struct window_clock_mode_data *data = wme->data; struct tm now, then; time_t t; - struct timeval tv = { .tv_sec = 1 }; evtimer_del(&data->timer); - evtimer_add(&data->timer, &tv); - - if (TAILQ_FIRST(&wp->modes) != wme) - return; t = time(NULL); gmtime_r(&t, &now); gmtime_r(&data->tim, &then); - if (now.tm_sec == then.tm_sec) - return; - data->tim = t; - window_clock_draw_screen(wme); - wp->flags |= PANE_REDRAW; + if (now.tm_sec != then.tm_sec) { + data->tim = t; + window_clock_draw_screen(wme); + wp->flags |= PANE_REDRAW; + } + + window_clock_start_timer(wme); } static struct screen * @@ -157,13 +174,12 @@ window_clock_init(struct window_mode_entry *wme, struct window_pane *wp = wme->wp; struct window_clock_mode_data *data; struct screen *s; - struct timeval tv = { .tv_sec = 1 }; wme->data = data = xmalloc(sizeof *data); data->tim = time(NULL); evtimer_set(&data->timer, window_clock_timer_callback, wme); - evtimer_add(&data->timer, &tv); + window_clock_start_timer(wme); s = &data->screen; screen_init(s, screen_size_x(&wp->base), screen_size_y(&wp->base), 0);