X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.main.git;a=blobdiff_plain;f=pctb%2Fconvert.c;h=cd9c6521976385498e72311d84631432a5d10bbf;hp=5f47113bdaaa93a52913b2dde95a4ae55fc25015;hb=a628ba6e81f90a4ebc632731bc5e39ca5daae7fb;hpb=2ca58afcdf02d87e31115110ecd6c83ecc5dabc7 diff --git a/pctb/convert.c b/pctb/convert.c index 5f47113..cd9c652 100644 --- a/pctb/convert.c +++ b/pctb/convert.c @@ -10,11 +10,20 @@ void debug_flush(void) { const char *get_vardir(void) { return "."; } +static enum { + mf_findwindow= 01, + mf_screenshot= 02, + mf_analyse= 04, + + mode_findwindow= 01, + mode_screenshot= 03, + mode_analyse= 04, + + mode_all= 07, +} o_mode= mode_all; -static enum { mode_all=03, mode_screenshot=01, mode_analyse=02 } - o_mode= mode_all; static char *o_screenshots_fn; -static int o_single_page; +static int o_single_page, o_quiet; FILE *screenshots_file; @@ -23,12 +32,16 @@ int main(int argc, char **argv) { int r; while ((arg=*++argv)) { - if (!strcmp(arg,"--screenshots-only")) + if (!strcmp(arg,"--find-window-only")) + o_mode= mode_findwindow; + else if (!strcmp(arg,"--screenshot-only")) o_mode= mode_screenshot; else if (!strcmp(arg,"--analyse-only")) o_mode= mode_analyse; else if (!strcmp(arg,"--single-page")) o_single_page= 1; + else if (!strcmp(arg,"--quiet")) + o_quiet= 1; else if (!strcmp(arg,"--screenshots-file")) eassert( o_screenshots_fn= *++argv ); #define DF(f) \ @@ -51,21 +64,76 @@ int main(int argc, char **argv) { eassert(r>=0); eassert(o_screenshots_fn); } - if (o_mode & mode_screenshot) { + if (o_mode & mf_findwindow) { screenshot_startup(); find_yppclient_window(); + } + 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 & mode_analyse) { + if (o_mode & mf_analyse) { analyse(); //output_tsv(); } return 0; } + + + + +DEFINE_VWRAPPERF(, progress) +DEFINE_VWRAPPERF(, progress_log) +DEFINE_VWRAPPERF(, progress_spinner) + +static int last_progress_len; + +static void vprogress_core(int spinner, const char *fmt, va_list al) { + int r; + + if (o_quiet) return; + if (!isatty(2)) return; + + if (last_progress_len) + putc('\r',stderr); + + 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); + else while (last_progress_len-- > r) putc('\b',stderr); + } + last_progress_len= r; + 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; + + progress(""); + vfprintf(stderr,fmt,al); + putc('\n',stderr); + fflush(stderr); +}