summaryrefslogtreecommitdiff
path: root/status.c
diff options
context:
space:
mode:
Diffstat (limited to 'status.c')
-rw-r--r--status.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/status.c b/status.c
index c2b8bd0..2349547 100644
--- a/status.c
+++ b/status.c
@@ -380,7 +380,7 @@ time_add(struct timespec a, struct timespec b) {
dst.tv_nsec = a.tv_nsec + b.tv_nsec;
/* larger than 1 second in μsec */
- if (dst.tv_nsec >= 1000000) {
+ if (dst.tv_nsec >= 1000000 * 1000) {
dst.tv_nsec -= 1000000 * 1000;
dst.tv_sec++;
}
@@ -393,8 +393,8 @@ static struct timespec
time_sub(struct timespec a, struct timespec b) {
struct timespec dst;
- dst.tv_sec = a.tv_sec + b.tv_sec;
- dst.tv_nsec = a.tv_nsec + b.tv_nsec;
+ dst.tv_sec = a.tv_sec - b.tv_sec;
+ dst.tv_nsec = a.tv_nsec - b.tv_nsec;
if (dst.tv_nsec < 0) {
dst.tv_nsec += 1000000 * 1000;
@@ -426,39 +426,38 @@ main(void) {
unsigned i;
/* Stall updating for at most 1 minute */
- struct timespec next_update = {0};
- now = time_add(one_minute, next_update);
+ struct timespec next_update = time_add(now, one_minute);
for (i = 0; i < num_elems; i++) {
- struct timespec next_fire = {0};
- struct element* e = &statusbar[i];
-
- e->fire_previous = time_add(e->fire_interval, next_fire);
+ struct element* e = &statusbar[i];
+ // Next time this element updates
+ struct timespec next_fire = time_add(e->fire_previous, e->fire_interval);
+ /* test if this is not to be updated yet */
if (time_lt(now, next_fire)) {
- /* Check if this is the next to-be-updated element */
+ /* test if this element is to be updated next */
if (time_lt(next_fire, next_update)) {
next_update = next_fire;
}
continue;
}
+ /* Otherwise update this element */
memset(e->buf, 0, ELEMENT_STRBUF_SZ);
e->f(statusbar[i].buf);
e->fire_previous = now;
/* Check if this element needs to be refreshed next, again */
- e->fire_previous = time_add(e->fire_interval, next_fire);
-
+ next_fire = time_add(now, e->fire_interval);
if (time_lt(next_fire, next_update)) {
next_update = next_fire;
}
/* printf("[%ld.%ld] %s\n",
- * statusbar[i].fire_interval.tv_sec,
- * statusbar[i].fire_interval.tv_usec,
- * (char*)statusbar[i].buf);
+ * e->fire_interval.tv_sec,
+ * e->fire_interval.tv_nsec,
+ * (char*)e->buf);
*/
}
@@ -480,11 +479,12 @@ main(void) {
puts(buf);
fflush(stdout);
- next_update = time_sub(now, next_update);
+ struct timespec sleep_for = time_sub(next_update, now);
+ sleep_for = time_add(sleep_for, (struct timespec){0, 500});
/* Replace NULL to get "remaining time", in case we got
* interrupted / signaled */
- nanosleep(&next_update, NULL);
+ nanosleep(&sleep_for, NULL);
}
return 0;