From 116d9a0ea7a5e903a344f7e6044dd019349bc01c Mon Sep 17 00:00:00 2001 From: Timo Teräs Date: Sat, 19 Mar 2011 15:20:47 +0200 Subject: apk: improve progress bar * make it as wide as the screen * make sure it's drawn after package change * and draw it using ansi escapes in line buffered stderr --- src/state.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'src/state.c') diff --git a/src/state.c b/src/state.c index 3a8d3a6..cb6e5cc 100644 --- a/src/state.c +++ b/src/state.c @@ -668,19 +668,19 @@ static void apk_count_change(struct apk_change *change, struct apk_stats *stats) stats->packages ++; } -static inline void apk_draw_progress(int percent) +static void apk_draw_progress(int percent) { - char tmp[128]; - char reset[128]; + const int bar_width = (apk_screen_width - 15); int i; - snprintf(tmp, sizeof(tmp), "-[ ]- %3i%%", percent); - for (i = 0; (i < (percent/5)) && (i < (sizeof(tmp)-2)); i++) - tmp[2+i] = '#'; - memset(reset, '\b', strlen(tmp)); - fwrite(tmp, strlen(tmp), 1, stderr); - fwrite(reset, strlen(tmp), 1, stderr); + fputs("\e7-[", stderr); + for (i = 0; i < bar_width * percent / 100; i++) + fputc('#', stderr); + for (; i < bar_width; i++) + fputc(' ', stderr); + fprintf(stderr, "]- %3i%%", percent); fflush(stderr); + fputs("\e8\e[0K", stderr); } struct progress { @@ -950,6 +950,8 @@ int apk_state_commit(struct apk_state *state, list_for_each_entry(change, &state->change_list_head, change_list) { n++; apk_print_change(db, change->oldpkg, change->newpkg, n, state->num_changes); + if (apk_flags & APK_PROGRESS) + apk_draw_progress(prog.count); prog.pkg = change->newpkg; if (!(apk_flags & APK_SIMULATE)) { -- cgit v1.2.3-60-g2f50