chiark / gitweb /
better progress indication
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 7 Jun 2009 15:08:06 +0000 (16:08 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 7 Jun 2009 15:08:06 +0000 (16:08 +0100)
pctb/convert.c
pctb/convert.h
pctb/pages.c
pctb/structure.c

index d0c113c..cd9c652 100644 (file)
@@ -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;
   
index 853fef5..d396269 100644 (file)
@@ -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);
index 99f4af2..fbf3317 100644 (file)
@@ -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(&current,0,0);
+  wait_for_stability(&current,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(&current,0, send_pgup_many);
+  wait_for_stability(&current,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(&current,last, 0);
+    wait_for_stability(&current,last, 0,
+                      "collecting screenshot of page %d...",npages+1);
+
     if (npages &&  /* first pagedown doesn't do much */
        identical(current,last)) {
       free_snapshot(&current);
@@ -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(&current,0,0);
+  wait_for_stability(&current,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);
index bbc7b8b..04cb962 100644 (file)
@@ -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) {