int expandable;
void* data;
- const char* (*print)(struct pakfire_progressbar* p, int width, void* data);
+ const char* (*print)(struct pakfire_progressbar* p,
+ struct pakfire_progressbar_widget* widget, int width, void* data);
void (*free)(void* data);
char buffer[1024];
}
static int pakfire_progressbar_add_widget(struct pakfire_progressbar* p,
- const char* (*print)(struct pakfire_progressbar* p, int width, void* data),
+ const char* (*print)(struct pakfire_progressbar* p,
+ struct pakfire_progressbar_widget* widget, int width, void* data),
void (*free)(void* data), int expandable, void* data) {
// Allocate the widget
struct pakfire_progressbar_widget* widget = calloc(1, sizeof(*widget));
goto REDRAW;
// Redraw when we hit the timeout
- if (timespec_lt(&now, &p->time_redraw))
+ if (timespec_lt(&p->time_redraw, &now))
goto REDRAW;
// Redraw when we are finished
const char* element = NULL;
if (!widget->expandable) {
- element = widget->print(p, 0, widget->data);
+ element = widget->print(p, widget, 0, widget->data);
cols_left -= strlen(element);
}
const char* element = elements[i];
if (!widget->expandable) {
- element = widget->print(p, width, widget->data);
+ element = widget->print(p, widget, width, widget->data);
}
elements[i++] = element;
}
// Reset the line
- fputs("\r ", p->terminal.f);
+ fputs("\r", p->terminal.f);
// Print all elements
- for (unsigned int i = 0; i < p->num_widgets; i++)
+ for (unsigned int i = 0; i < p->num_widgets; i++) {
+ fputs(" ", p->terminal.f);
fputs(elements[i], p->terminal.f);
+ }
return 0;
}
// String widget
-const char* pakfire_progressbar_string_print(
- struct pakfire_progressbar* p, int width, void* data) {
+const char* pakfire_progressbar_string_print(struct pakfire_progressbar* p,
+ struct pakfire_progressbar_widget* widget, int width, void* data) {
return (const char*)data;
}
return pakfire_progressbar_add_widget(p, pakfire_progressbar_string_print, free, 0, s);
}
+
+// Counter
+
+const char* pakfire_progressbar_counter_print(struct pakfire_progressbar* p,
+ struct pakfire_progressbar_widget* widget, int width, void* data) {
+ int r = snprintf(widget->buffer, sizeof(widget->buffer), "%lu", p->value);
+ if (r < 0)
+ return NULL;
+
+ return widget->buffer;
+}
+
+int pakfire_progressbar_add_counter(struct pakfire_progressbar* p) {
+ return pakfire_progressbar_add_widget(p, pakfire_progressbar_counter_print, free, 0, NULL);
+}