}
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();
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;
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);
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;
/*----- 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 -----*/
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);
}
static void snapshot(Snapshot **output) {
-// char *cmd;
-// int r;
-// XImage *xim;
-
free_snapshot(output);
debugf("PAGING snapshot\n");
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 */
" 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);
break;
}
+ progress_spinner(doing);
+
debugf("PAGING wait_for_stability retry\n");
free_snapshot(&last); last=*output; *output=0;
}
free_snapshot(&last);
+ free(doing);
debugf("PAGING wait_for_stability done.\n");
}
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");
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");
/* 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 (;;) {
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);
npages++;
}
debugf("PAGING all done.\n");
+ progress_log("collected %d screenshots.",npages);
}
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) {
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";
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);
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;
(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) {
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) {