chiark / gitweb /
Merge branch 'master' of ijackson@chiark:things/ypp-sc-tools
[ypp-sc-tools.db-live.git] / pctb / pages.c
index 1fba5a64fccc2b6ccbacc952bd9efb29daa86c1f..56fb4092b8e35650586c35a4ffd18c3b400e1f70 100644 (file)
@@ -43,6 +43,7 @@
 
 CanonImage *page_images[MAX_PAGES];
 int npages;
+RgbImage *page0_rgbimage;
 
 char *ocean, *pirate;
 
@@ -158,6 +159,19 @@ static void send_key(KeySym sym) {
   XTestFakeKeyEvent(disp, keycode(sym),1, 10);
   XTestFakeKeyEvent(disp, keycode(sym),0, 10);
 }
+static void mouse_1_updown_here(void) {
+  check_not_disturbed();
+  XTestFakeButtonEvent(disp,1,1, 50);
+  XTestFakeButtonEvent(disp,1,0, 50);
+}
+static void mouse_1_updown(int x, int y) {
+  check_not_disturbed();
+  int screen= XScreenNumberOfScreen(attr.screen);
+  int xpos, ypos;
+  translate_coords_toroot(x,y, &xpos,&ypos);
+  XTestFakeMotionEvent(disp, screen, xpos,ypos, 0);
+  mouse_1_updown_here();
+}
 
 static int pgupdown;
 
@@ -365,20 +379,14 @@ static void raise_and_get_details(void) {
   }
 }
 
-static void set_focus(void) {
+static void set_focus_commodity(void) {
   int screen= XScreenNumberOfScreen(attr.screen);
 
   progress("taking control of YPP client window...");
 
   debugf("PAGING set_focus\n");
 
-  int xpos, ypos;
-  translate_coords_toroot(160,160, &xpos,&ypos);
-  XTestFakeMotionEvent(disp,screen, xpos,ypos, 0);
-
-  XTestFakeButtonEvent(disp,1,1, 50);
-  XTestFakeButtonEvent(disp,1,0, 50);
-
+  mouse_1_updown(160,160);
   sync_after_input();
 
   delay(0.5);
@@ -388,6 +396,7 @@ static void set_focus(void) {
                        FocusChangeMask
                        ) );
 
+  int xpos,ypos;
   translate_coords_toroot(10,10, &xpos,&ypos);
   XTestFakeMotionEvent(disp,screen, xpos,ypos, 0);
 
@@ -420,7 +429,7 @@ static void compute_shift_mask(ShMask *sm, unsigned long ximage_mask) {
   assert(sm->rshift < LONG_BIT);
 }
 
-static CanonImage *convert_page(Snapshot *sn) {
+static CanonImage *convert_page(Snapshot *sn, RgbImage *ri) {
   ShMask shiftmasks[3];
   CanonImage *im;
 
@@ -447,6 +456,8 @@ static CanonImage *convert_page(Snapshot *sn) {
       rgb |= sample;
       fputc(sample, screenshot_file);
     }
+    if (ri)
+      CANONIMG_ALSO_STORERGB(ri);
   });
 
   sysassert(!ferror(screenshot_file));
@@ -455,20 +466,38 @@ static CanonImage *convert_page(Snapshot *sn) {
   return im;
 }
 
-void take_screenshots(void) {
-  Snapshot *current=0, *last=0;
+static void prepare_ypp_client(void) {
   CanonImage *test;
-
+  Snapshot *current=0;
+  
   /* find the window and check it's on the right kind of screen */
   raise_and_get_details();
   wait_for_stability(&current,0,0, "checking current YPP client screen...");
-  test= convert_page(current);
+  test= convert_page(current, 0);
   find_structure(test, &max_relevant_y);
   check_correct_commodities();
   free(test);
+  free_snapshot(&current);
+
+  progress("requesting status information...");
+  mouse_1_updown(250, wheight-10);
+  mouse_1_updown_here();
+  mouse_1_updown_here();
+  XSync(disp,False);
+  check_not_disturbed();
+  send_key(XK_slash);
+  send_key(XK_w);
+  send_key(XK_Return);
+  sync_after_input();
+}
 
+void take_screenshots(void) {
+  Snapshot *current=0, *last=0;
+
+  prepare_ypp_client();
+  
   /* page to the top - keep pressing page up until the image stops changing */
-  set_focus();
+  set_focus_commodity();
   wait_for_stability(&current,0, send_pgup_many,
                     "paging up to top of commodity list...");
 
@@ -480,7 +509,7 @@ void take_screenshots(void) {
       fatal("Paging down seems to generate too many pages - max is %d.",
            MAX_PAGES);
     
-    page_images[npages]= convert_page(current);
+    page_images[npages]= convert_page(current, 0);
     free_snapshot(&last); last=current; current=0;
 
     debugf("PAGING page %d converted\n",npages);
@@ -507,11 +536,11 @@ void take_screenshots(void) {
 
 void take_one_screenshot(void) {
   Snapshot *current=0;
-  
-  raise_and_get_details();
-  sync_after_input();
+
+  prepare_ypp_client();
   wait_for_stability(&current,0,0, "taking screenshot...");
-  page_images[0]= convert_page(current);
+  page0_rgbimage= alloc_rgb_image(current->width, current->height);
+  page_images[0]= convert_page(current, 0);
   npages= 1;
   progress_log("collected single screenshot.");
 }