This is a hack. --- src/pacman/callback.c | 39 +++++++++++++++++++++++++++------------ 1 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 59b4064..8a17111 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -86,8 +86,8 @@ static float get_update_timediff(int first_call) } /* refactored from cb_trans_progress */ -static void fill_progress(const int bar_percent, const int disp_percent, - const int proglen) +static void fill_progress(const int bar_percent, + const int proglen, const char *endline) { const unsigned int hashlen = proglen - 8; const unsigned int hash = bar_percent * hashlen / 100; @@ -139,16 +139,10 @@ static void fill_progress(const int bar_percent, const int disp_percent, } /* print percent after progress bar */ if(proglen > 5) { - /* show total download percent if option is enabled */ - int p = config->totaldownload ? disp_percent : bar_percent; - printf(" %3d%%", p); + printf(" %3d%%", bar_percent); } - if(bar_percent == 100) { - printf("\n"); - } else { - printf("\r"); - } + printf(endline); fflush(stdout); } @@ -399,7 +393,7 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent, free(wcstr); /* call refactored fill progress function */ - fill_progress(percent, percent, getcols() - infolen); + fill_progress(percent, getcols() - infolen, percent == 100 ? "\n" : "\r"); if(percent == 100) { alpm_list_t *i = NULL; @@ -441,6 +435,8 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) int file_percent = 0, total_percent = 0; char rate_size = 'K', xfered_size = 'K'; + static int beenheredonethat = 0; + if(config->noprogressbar || file_total == -1) { if(file_xfered == 0) { printf(_("downloading %s...\n"), filename); @@ -574,6 +570,18 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) } } + /* move up if not the first time download progress is being displayed */ + if (beenheredonethat == 1) + { + printf("\033[A" /* move up */ + "\033[K\n" /* kill line */ + "\033[K\r" /* kill line */ + "\033[A" /* move up */ + ); + } + beenheredonethat = 1; + + printf(" %ls%-*s %6.1f%c %#6.1f%c/s %02u:%02u:%02u", wcfname, padwid, "", f_xfered, xfered_size, rate, rate_size, eta_h, eta_m, eta_s); @@ -581,7 +589,14 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) free(fname); free(wcfname); - fill_progress(file_percent, total_percent, getcols() - infolen); + fill_progress(file_percent, getcols() - infolen, "\n"); + + printf(" %-23s %6.1f%c %#6.1f%c/s %02u:%02u:%02u", "total", + f_xfered, xfered_size, + rate, rate_size, eta_h, eta_m, eta_s); + fill_progress(total_percent, getcols() - infolen, "\r"); + if (file_percent == 100) + printf("\n"); return; } -- 1.6.0