From: Giuseppe Scrivano Date: Sat, 2 Nov 2013 14:36:52 +0000 (+0100) Subject: progress: Split update into update and draw X-Git-Url: http://sjero.net/git/?p=wget;a=commitdiff_plain;h=67a4c6cf97d544443b33b0374fe86aebf3298fe1 progress: Split update into update and draw --- diff --git a/src/ChangeLog b/src/ChangeLog index e8069bda..63589384 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2013-11-02 Giuseppe Scrivano + + * progress.c (struct progress_implementation): New method draw. + (bar_update): Split into... + (bar_draw): ...this new function. + (dot_update): Split into... + (dot_draw): New function. + (progress_update): Also invoke draw on `current_impl'. + 2014-04-22 Tim Ruehsen * http.c (gethttp): Fix 204 response handling diff --git a/src/progress.c b/src/progress.c index 2e888a90..47d13e6a 100644 --- a/src/progress.c +++ b/src/progress.c @@ -49,6 +49,7 @@ struct progress_implementation { bool interactive; void *(*create) (wgint, wgint); void (*update) (void *, wgint, double); + void (*draw) (void *); void (*finish) (void *, double); void (*set_params) (const char *); }; @@ -58,16 +59,18 @@ struct progress_implementation { static void *dot_create (wgint, wgint); static void dot_update (void *, wgint, double); static void dot_finish (void *, double); +static void dot_draw (void *); static void dot_set_params (const char *); static void *bar_create (wgint, wgint); static void bar_update (void *, wgint, double); +static void bar_draw (void *); static void bar_finish (void *, double); static void bar_set_params (const char *); static struct progress_implementation implementations[] = { - { "dot", 0, dot_create, dot_update, dot_finish, dot_set_params }, - { "bar", 1, bar_create, bar_update, bar_finish, bar_set_params } + { "dot", 0, dot_create, dot_update, dot_draw, dot_finish, dot_set_params }, + { "bar", 1, bar_create, bar_update, bar_draw, bar_finish, bar_set_params } }; static struct progress_implementation *current_impl; static int current_impl_locked; @@ -182,6 +185,7 @@ void progress_update (void *progress, wgint howmuch, double dltime) { current_impl->update (progress, howmuch, dltime); + current_impl->draw (progress); } /* Tell the progress gauge to clean up. Calling this will free the @@ -204,6 +208,7 @@ struct dot_progress { int accumulated; /* number of bytes accumulated after the last printed dot */ + double dltime; /* download time so far */ int rows; /* number of rows printed so far */ int dots; /* number of dots printed in this row */ @@ -342,6 +347,14 @@ print_row_stats (struct dot_progress *dp, double dltime, bool last) static void dot_update (void *progress, wgint howmuch, double dltime) +{ + struct dot_progress *dp = progress; + dp->accumulated += howmuch; + dp->dltime = dltime; +} + +static void +dot_draw (void *progress) { struct dot_progress *dp = progress; int dot_bytes = opt.dot_bytes; @@ -349,7 +362,6 @@ dot_update (void *progress, wgint howmuch, double dltime) log_set_flush (false); - dp->accumulated += howmuch; for (; dp->accumulated >= dot_bytes; dp->accumulated -= dot_bytes) { if (dp->dots == 0) @@ -366,7 +378,7 @@ dot_update (void *progress, wgint howmuch, double dltime) ++dp->rows; dp->dots = 0; - print_row_stats (dp, dltime, false); + print_row_stats (dp, dp->dltime, false); } } @@ -505,6 +517,7 @@ struct bar_progress { measured since the beginning of download. */ + double dltime; /* download time so far */ int width; /* screen width we're using at the time the progress gauge was created. this is different from @@ -595,8 +608,8 @@ static void bar_update (void *progress, wgint howmuch, double dltime) { struct bar_progress *bp = progress; - bool force_screen_update = false; + bp->dltime = dltime; bp->count += howmuch; if (bp->total_length > 0 && bp->count + bp->initial_length > bp->total_length) @@ -608,6 +621,13 @@ bar_update (void *progress, wgint howmuch, double dltime) bp->total_length = bp->initial_length + bp->count; update_speed_ring (bp, howmuch, dltime); +} + +static void +bar_draw (void *progress) +{ + bool force_screen_update = false; + struct bar_progress *bp = progress; /* If SIGWINCH (the window size change signal) been received, determine the new screen size and update the screen. */ @@ -628,13 +648,13 @@ bar_update (void *progress, wgint howmuch, double dltime) received_sigwinch = 0; } - if (dltime - bp->last_screen_update < REFRESH_INTERVAL && !force_screen_update) + if (bp->dltime - bp->last_screen_update < REFRESH_INTERVAL && !force_screen_update) /* Don't update more often than five times per second. */ return; - create_image (bp, dltime, false); + create_image (bp, bp->dltime, false); display_image (bp->buffer); - bp->last_screen_update = dltime; + bp->last_screen_update = bp->dltime; } static void