const char *get_vardir(void) { return "."; }
-static enum { mode_all=03, mode_screenshot=01, mode_analyse=02 }
- o_mode= mode_all;
+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 char *o_screenshots_fn;
static int o_single_page;
int r;
while ((arg=*++argv)) {
- if (!strcmp(arg,"--screenshot-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;
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();
screenshots_file= fopen(o_screenshots_fn, "r"); eassert(screenshots_file);
read_screenshots();
}
- if (o_mode & mode_analyse) {
+ if (o_mode & mf_analyse) {
analyse();
//output_tsv();
}
/*----- debugging arrangements, rather contingent -----*/
#define DEBUG_FLAG_LIST \
- DF(ocr) \
+ DF(findypp) \
+ DF(pages) \
DF(rect) \
- DF(callout) \
- DF(pages)
+ DF(ocr) \
+ DF(callout)
enum {
#define DF(f) dbg__shift_##f,
const char *get_vardir(void);
-#define DEBUG_DEFINE_DEBUGF(f) \
- static void vdebugf(const char *fmt, va_list al) { \
- if (DEBUGP(f)) \
+#define DEBUG_DEFINE_SOME_DEBUGF(fl,funcf) \
+ static void v##funcf(const char *fmt, va_list al) { \
+ if (DEBUGP(fl)) \
vfprintf(debug,fmt,al); \
} \
- static void debugf(const char *fmt, ...) { \
- va_list al; va_start(al,fmt); vdebugf(fmt,al); va_end(al); \
+ static void funcf(const char *fmt, ...) { \
+ va_list al; va_start(al,fmt); v##funcf(fmt,al); va_end(al); \
}
+#define DEBUG_DEFINE_DEBUGF(fl) DEBUG_DEFINE_SOME_DEBUGF(fl,debugf)
+
#endif /*OCR_H*/
CanonImage *page_images[MAX_PAGES];
int npages;
+char *ocean, *pirate;
+
static XWindowAttributes attr;
static Window id;
static Display *disp;
id= wul;
}
+DEBUG_DEFINE_SOME_DEBUGF(findypp,debugfind)
+
void find_yppclient_window(void) {
+ Window root, gotroot, gotparent;
+ int screen, r;
+ int nfound=0;
+
if (id) return;
- eassert(!"finding client window NYI");
+
+ static const char prefix[]= "Puzzle Pirates - ";
+ static const char onthe[]= " on the ";
+ static const char suffix[]= " ocean";
+#define S(x) (sizeof((x))-1)
+
+ Atom wm_name= XInternAtom(disp,"WM_NAME",True);
+ eassert(wm_name != None);
+
+ for (screen=0; screen<ScreenCount(disp); screen++) {
+ debugfind("FINDYPP screen %d\n", screen);
+ root= RootWindow(disp,screen);
+ unsigned int nchildren1;
+ Window *children1=0;
+
+ r= XQueryTree(disp,root,
+ &gotroot,&gotparent,
+ &children1,&nchildren1);
+ eassert(r);
+ debugfind("FINDYPP screen %d nchildren1=%d\n", screen, nchildren1);
+
+ int i;
+ for (i=0; i<nchildren1; i++) {
+ Window w1= children1[i];
+ unsigned int nchildren2;
+ Window *children2=0;
+
+ r= XQueryTree(disp,w1,
+ &gotroot,&gotparent,
+ &children2,&nchildren2);
+ eassert(r);
+ debugfind("FINDYPP screen %d c1[%2d]=0x%08lx nchildren2=%d\n",
+ screen, i, (unsigned long)w1, nchildren2);
+
+ int j;
+ for (j=-1; j<(int)nchildren2; j++) {
+ Window w2= j<0 ? w1 : children2[j];
+ debugfind("FINDYPP screen %d c1[%2d]=0x%08lx c2[%2d]=0x%08lx",
+ screen, i, (unsigned long)w1, j, (unsigned long)w2);
+
+ int gotfmt;
+ Atom gottype;
+ unsigned long len, gotbytesafter;
+ char *title;
+ unsigned char *gottitle=0;
+ r= XGetWindowProperty(disp,w2, wm_name,0,512, False,
+ AnyPropertyType,&gottype, &gotfmt, &len,
+ &gotbytesafter, &gottitle);
+ eassert(!r);
+ title= (char*)gottitle;
+
+ if (DEBUGP(findypp)) {
+ debugfind(" gf=%d len=%lu gba=%lu \"", gotfmt,len,gotbytesafter);
+ char *p;
+ for (p=title; p < title+len; p++) {
+ char c= *p;
+ if (c>=' ' && c<=126) fputc(c,debug);
+ else fprintf(debug,"\\x%02x",c & 0xff);
+ }
+ fputs("\": ",debug);
+ }
+
+#define REQUIRE(pred) \
+ if (!(pred)) { debugfind(" failed test %s\n", #pred); continue; } \
+ else
+
+ REQUIRE( gottype!=None );
+ REQUIRE( len );
+ REQUIRE( gotfmt==8 );
+
+ REQUIRE( len >= S(prefix) + 1 + S(onthe) + 1 + S(suffix) );
+
+ char *spc1= strchr( title + S(prefix), ' '); REQUIRE(spc1);
+ char *spc2= strrchr((title + len) - S(suffix), ' '); REQUIRE(spc2);
+
+ REQUIRE( (title + len) - spc1 >= S(onthe) + S(suffix) );
+ REQUIRE( spc2 - title >= S(prefix) + S(onthe) );
+
+ REQUIRE( !memcmp(title, prefix, S(prefix)) );
+ REQUIRE( !memcmp(title + len - S(suffix), suffix, S(suffix)) );
+ REQUIRE( !memcmp(spc1, onthe, S(onthe)) );
+
+#define ASSIGN(what, start, end) do { \
+ r= asprintf(&what, "%.*s", end - start, start); eassert(r>0); \
+ }while(0)
+ ASSIGN(ocean, title + S(prefix), spc1);
+ ASSIGN(pirate, spc1 + S(onthe), (title + len) - S(suffix));
+
+ debugfind(" YES!\n");
+ id= w2;
+ nfound++;
+ }
+ if (children2) XFree(children2);
+ }
+ if (children1) XFree(children1);
+ }
+ eassert(nfound==1);
}