From: Michael Tremer Date: Wed, 31 Mar 2021 22:43:22 +0000 (+0000) Subject: progressbar: Add a timer widget X-Git-Tag: 0.9.28~1285^2~443 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d5f08d3064c3e6af245299a29c509e41444bdf0;p=pakfire.git progressbar: Add a timer widget Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/progressbar.c b/src/libpakfire/progressbar.c index c3a267026..3293928f9 100644 --- a/src/libpakfire/progressbar.c +++ b/src/libpakfire/progressbar.c @@ -163,6 +163,16 @@ struct pakfire_progressbar* pakfire_progressbar_unref(struct pakfire_progressbar return NULL; } +static time_t pakfire_progressbar_elapsed_time(struct pakfire_progressbar* p) { + struct timespec now; + + int r = clock_gettime(CLOCK_MONOTONIC, &now); + if (r) + return r; + + return now.tv_sec - p->time_start.tv_sec; +} + int pakfire_progressbar_start(struct pakfire_progressbar* p, unsigned long value) { if (p->status != PAKFIRE_PROGRESSBAR_INIT) return EINVAL; @@ -325,7 +335,7 @@ static int pakfire_progressbar_redraw(struct pakfire_progressbar* p) { STAILQ_FOREACH(widget, &p->widgets, nodes) { const char* element = elements[i]; - if (!widget->expandable) { + if (widget->expandable) { element = widget->print(p, widget, width, widget->data); } @@ -416,5 +426,24 @@ const char* pakfire_progressbar_bar(struct pakfire_progressbar* p, } int pakfire_progressbar_add_bar(struct pakfire_progressbar* p) { - return pakfire_progressbar_add_widget(p, pakfire_progressbar_bar, NULL, 0, NULL); + return pakfire_progressbar_add_widget(p, pakfire_progressbar_bar, NULL, 1, NULL); +} + +// Timer + +const char* pakfire_progressbar_timer(struct pakfire_progressbar* p, + struct pakfire_progressbar_widget* widget, unsigned int width, void* data) { + time_t t = pakfire_progressbar_elapsed_time(p); + if (t < 0) + return NULL; + + int r = snprintf(widget->buffer, sizeof(widget->buffer), "%02lu:%02lu", t / 60, t % 60); + if (r < 0) + return NULL; + + return widget->buffer; +} + +int pakfire_progressbar_add_timer(struct pakfire_progressbar* p) { + return pakfire_progressbar_add_widget(p, pakfire_progressbar_timer, NULL, 0, NULL); } diff --git a/tests/libpakfire/progressbar.c b/tests/libpakfire/progressbar.c index 7caa75810..8a1dc72ca 100644 --- a/tests/libpakfire/progressbar.c +++ b/tests/libpakfire/progressbar.c @@ -45,6 +45,9 @@ static int test_run(const struct test* t) { // Add the percentage ASSERT_SUCCESS(pakfire_progressbar_add_percentage(p)); + // Add a timer + ASSERT_SUCCESS(pakfire_progressbar_add_timer(p)); + ASSERT_SUCCESS(pakfire_progressbar_start(p, 1000)); for (unsigned int i = 0; i < 1000; i++) {