From: Ian Jackson Date: Sun, 7 Jun 2009 15:08:06 +0000 (+0100) Subject: better progress indication X-Git-Tag: 1.9.2~154 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.web-live.git;a=commitdiff_plain;h=a628ba6e81f90a4ebc632731bc5e39ca5daae7fb better progress indication --- diff --git a/pctb/convert.c b/pctb/convert.c index d0c113c..cd9c652 100644 --- a/pctb/convert.c +++ b/pctb/convert.c @@ -70,13 +70,12 @@ int main(int argc, char **argv) { } if (o_mode & mf_screenshot) { screenshots_file= fopen(o_screenshots_fn, "w"); eassert(screenshots_file); - if (o_single_page) - take_one_screenshot(); - else - take_screenshots(); + if (o_single_page) take_one_screenshot(); + else take_screenshots(); } else { screenshots_file= fopen(o_screenshots_fn, "r"); eassert(screenshots_file); - read_screenshots(); + if (o_single_page) read_one_screenshot(); + else read_screenshots(); } if (o_mode & mf_analyse) { analyse(); @@ -90,10 +89,11 @@ int main(int argc, char **argv) { DEFINE_VWRAPPERF(, progress) DEFINE_VWRAPPERF(, progress_log) +DEFINE_VWRAPPERF(, progress_spinner) static int last_progress_len; -void vprogress(const char *fmt, va_list al) { +static void vprogress_core(int spinner, const char *fmt, va_list al) { int r; if (o_quiet) return; @@ -105,6 +105,11 @@ void vprogress(const char *fmt, va_list al) { r= vfprintf(stderr,fmt,al); eassert(r>=0); + if (spinner) { + putc(spinner,stderr); + r++; + } + if (r < last_progress_len) { fprintf(stderr,"%*s", last_progress_len - r, ""); if (!r) putc('\r', stderr); @@ -114,6 +119,16 @@ void vprogress(const char *fmt, va_list al) { fflush(stderr); } +void vprogress(const char *fmt, va_list al) { vprogress_core(0,fmt,al); } +void vprogress_spinner(const char *fmt, va_list al) { + static const char spinchars[]="/-\\"; + static int spinner; + + vprogress_core(spinchars[spinner],fmt,al); + spinner++; + spinner %= (sizeof(spinchars)-1); +} + void vprogress_log(const char *fmt, va_list al) { if (o_quiet) return; diff --git a/pctb/convert.h b/pctb/convert.h index 853fef5..d396269 100644 --- a/pctb/convert.h +++ b/pctb/convert.h @@ -14,8 +14,8 @@ /*----- from structure.c -----*/ void find_structure(CanonImage *im); -CanonImage *file_read_image_ppm(FILE *f); void read_screenshots(void); +void read_one_screenshot(void); void analyse(void); /*----- from convert.c -----*/ @@ -28,6 +28,9 @@ void progress(const char *fmt, ...); void vprogress_log(const char *fmt, va_list); void progress_log(const char *fmt, ...); +void vprogress_spinner(const char *fmt, va_list); +void progress_spinner(const char *fmt, ...); + /*----- from pages.c -----*/ void screenshot_startup(void); diff --git a/pctb/pages.c b/pctb/pages.c index 99f4af2..fbf3317 100644 --- a/pctb/pages.c +++ b/pctb/pages.c @@ -85,10 +85,6 @@ static void free_snapshot(Snapshot **io) { } static void snapshot(Snapshot **output) { -// char *cmd; -// int r; -// XImage *xim; - free_snapshot(output); debugf("PAGING snapshot\n"); @@ -111,8 +107,10 @@ static int identical(const Snapshot *a, const Snapshot *b) { static void wait_for_stability(Snapshot **output, const Snapshot *previously, - void (*with_keypress)(void)) { + void (*with_keypress)(void), + const char *fmt, ...) { Snapshot *last=0; + int r; /* waits longer if we're going to return an image identical to previously * if previously==0, all images are considered identical to it */ @@ -120,6 +118,14 @@ static void wait_for_stability(Snapshot **output, " last_input=%f previously=%p\n", last_input, previously); + char *doing; + va_list al; + va_start(al,fmt); + r= asprintf(&doing,fmt,al); eassert(r>=0); + va_end(al); + + progress(doing); + for (;;) { double at_snapshot= timestamp(); double need_sleep= min_update_allowance - (at_snapshot - last_input); @@ -138,6 +144,8 @@ static void wait_for_stability(Snapshot **output, break; } + progress_spinner(doing); + debugf("PAGING wait_for_stability retry\n"); free_snapshot(&last); last=*output; *output=0; @@ -149,6 +157,7 @@ static void wait_for_stability(Snapshot **output, } free_snapshot(&last); + free(doing); debugf("PAGING wait_for_stability done.\n"); } @@ -166,7 +175,7 @@ static void raise_and_get_details(void) { unsigned bd,depth; Window dummy; - progress("raising and checking YPP client window ...\n"); + progress("raising and checking YPP client window..."); debugf("PAGING raise_and_get_details\n"); @@ -209,7 +218,7 @@ static void raise_and_get_details(void) { static void set_focus(void) { int screen= XScreenNumberOfScreen(attr.screen); - progress("taking control of YPP client window ...\n"); + progress("taking control of YPP client window..."); debugf("PAGING set_focus\n"); @@ -294,14 +303,15 @@ void take_screenshots(void) { /* find the window and check it's on the right kind of screen */ raise_and_get_details(); - wait_for_stability(¤t,0,0); + wait_for_stability(¤t,0,0, "checking current YPP client screen..."); test= convert_page(current); find_structure(test); free(test); /* page to the top - keep pressing page up until the image stops changing */ set_focus(); - wait_for_stability(¤t,0, send_pgup_many); + wait_for_stability(¤t,0, send_pgup_many, + "paging up to top of commodity list..."); /* now to actually page down */ for (;;) { @@ -313,7 +323,9 @@ void take_screenshots(void) { debugf("PAGING page %d converted\n",npages); - wait_for_stability(¤t,last, 0); + wait_for_stability(¤t,last, 0, + "collecting screenshot of page %d...",npages+1); + if (npages && /* first pagedown doesn't do much */ identical(current,last)) { free_snapshot(¤t); @@ -324,6 +336,7 @@ void take_screenshots(void) { npages++; } debugf("PAGING all done.\n"); + progress_log("collected %d screenshots.",npages); } void take_one_screenshot(void) { @@ -331,9 +344,10 @@ void take_one_screenshot(void) { raise_and_get_details(); sync_after_input(); - wait_for_stability(¤t,0,0); + wait_for_stability(¤t,0,0, "taking screenshot..."); page_images[0]= convert_page(current); npages= 1; + progress_log("collected single screenshot."); } void set_yppclient_window(unsigned long wul) { @@ -349,6 +363,8 @@ void find_yppclient_window(void) { if (id) return; + progress("looking for YPP client window..."); + static const char prefix[]= "Puzzle Pirates - "; static const char onthe[]= " on the "; static const char suffix[]= " ocean"; @@ -439,7 +455,7 @@ void find_yppclient_window(void) { debugfind(" YES!\n"); id= w2; nfound++; - progress_log("found YPP client window 0x%lx: %s on the %s ocean\n", + progress_log("found YPP client window (0x%lx): %s on the %s ocean.", (unsigned long)id, pirate, ocean); } if (children2) XFree(children2); diff --git a/pctb/structure.c b/pctb/structure.c index bbc7b8b..04cb962 100644 --- a/pctb/structure.c +++ b/pctb/structure.c @@ -207,7 +207,7 @@ CanonImage *alloc_canon_image(int w, int h) { return im; } -CanonImage *file_read_image_ppm(FILE *f) { +static void file_read_image_ppm(FILE *f) { struct pam inpam; unsigned char rgb_buf[3]; CanonImage *im; @@ -225,7 +225,17 @@ CanonImage *file_read_image_ppm(FILE *f) { (rgb_buf[2]); }); - return im; + eassert(!ferror(screenshots_file)); + eassert(!feof(screenshots_file)); + + eassert(npages < MAX_PAGES); + page_images[npages++]= im; +} + +void read_one_screenshot(void) { + progress("reading screenshot..."); + file_read_image_ppm(screenshots_file); + progress_log("read screenshot.",npages); } void read_screenshots(void) { @@ -243,10 +253,11 @@ void read_screenshots(void) { if (c==EOF) break; ungetc(c, screenshots_file); } - eassert(npages < MAX_PAGES); - page_images[npages++]= file_read_image_ppm(screenshots_file); + progress("reading screenshot %d...",npages); + file_read_image_ppm(screenshots_file); } eassert(!ferror(screenshots_file)); + progress_log("read %d screenshots.",npages); } static void find_commodity(int offset, Rect *rr) {