chiark / gitweb /
wip fetching images from X
[ypp-sc-tools.main.git] / pctb / pages.c
1 /*
2   */
3
4 #include "ocr.h"
5
6 #include <X11/Xlib.h>
7 #include <X11/extensions/XTest.h>
8 #include <X11/keysym.h>
9
10 #define NUM_PAGES 25
11
12 static Display *disp;
13
14 static KeyCode keycode(KeySym sym) {
15   return XKeysymToKeycode(disp,sym);
16 }
17
18 static CanonImage *screenshot_now(Window id) {
19   char *cmd;
20   CanonImage *ci;
21   int r;
22   
23   r= asprintf(&cmd, "xwd -silent -id 0x%lx | xwdtopnm", (unsigned long)id);
24   eassert(r>=0);
25   FILE *f= popen(cmd,"r");  eassert(f);
26   ci= file_read_image(f);
27   r= fgetc(f);  eassert(r==EOF);  eassert(feof(f));
28   r= pclose(f);  eassert(r>=0);  eassert(WIFEXITED(r) && !WEXITSTATUS(r));
29   free(cmd);
30   return ci;
31 }
32
33 static void read_pages(Window id) {
34   int r;
35   XWindowAttributes attr;
36   int xpos,ypos, evbase,errbase,majver,minver;
37   unsigned width,height,bd,depth;
38   Window dummy;
39   
40   disp= XOpenDisplay(0);  eassert(disp);
41
42   r= XTestQueryExtension(disp, &evbase,&errbase,&majver,&minver);
43   eassert(r==True);
44
45   r= XRaiseWindow(disp, id);  eassert(r);
46
47   r= XGetWindowAttributes(disp, id, &attr);  eassert(r);
48   r= XGetGeometry(disp,id, &attr.root,&xpos,&ypos,&width,&height, &bd,&depth);
49   eassert(r);
50
51   r= XTranslateCoordinates(disp, id,attr.root, 160,160, &xpos,&ypos,
52                            &dummy);
53   eassert(r);
54
55   int screen= XScreenNumberOfScreen(attr.screen);
56   XTestFakeMotionEvent(disp,screen, xpos, ypos, 0);
57
58   XTestFakeButtonEvent(disp,1,1, 0);
59   XTestFakeButtonEvent(disp,1,0, 50);
60
61   XTestFakeKeyEvent(disp, keycode(XK_Next),1, 50);
62   XTestFakeKeyEvent(disp, keycode(XK_Next),0, 50);
63   
64   r= XSync(disp, False);  eassert(r);
65 }
66
67 int main(int argc, char **argv) {
68   Window id;
69   CanonImage *ci;
70
71   id= strtoul(*++argv,0,0);
72   read_pages(id);
73   ci= screenshot_now(id);
74   return 0;
75 }