diff --git a/window-clock.c b/window-clock.c index 51620d4a..b7a8b728 100644 --- a/window-clock.c +++ b/window-clock.c @@ -131,23 +131,33 @@ 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 }; + struct timeval tv; + struct timespec ts; + long delay; 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; + + if (now.tm_sec != then.tm_sec) { + data->tim = t; + window_clock_draw_screen(wme); + wp->flags |= PANE_REDRAW; + } - window_clock_draw_screen(wme); - wp->flags |= PANE_REDRAW; + 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 struct screen * @@ -157,12 +167,25 @@ 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 }; + struct timeval tv; + struct timespec ts; + long delay; wme->data = data = xmalloc(sizeof *data); data->tim = time(NULL); evtimer_set(&data->timer, window_clock_timer_callback, wme); + + 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); s = &data->screen;