diff options
-rw-r--r-- | i3status.c | 13 |
1 files changed, 12 insertions, 1 deletions
@@ -22,6 +22,8 @@ #include <glob.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> +#include <sys/time.h> #include "i3status.h" @@ -186,6 +188,8 @@ int main(int argc, char *argv[]) { if ((general_socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1) die("Could not create socket\n"); + int interval = cfg_getint(cfg_general, "interval"); + while (1) { for (j = 0; j < cfg_size(cfg, "order"); j++) { if (j > 0) @@ -223,6 +227,13 @@ int main(int argc, char *argv[]) { printf("\n"); fflush(stdout); - sleep(cfg_getint(cfg_general, "interval")); + /* To provide updates on every full second (as good as possible) + * we don’t use sleep(interval) but we sleep until the next + * second (with microsecond precision) plus (interval-1) + * seconds. */ + struct timeval current_time; + gettimeofday(¤t_time, NULL); + struct timespec ts = {interval - 1, (10e5 - current_time.tv_usec) * 1000}; + nanosleep(&ts, NULL); } } |