double begin= timestamp();
if (shmim) {
+ rtimestamp(&begin, "XShmGetImage before");
xassert( XShmGetImage(disp,id,shmim, 0,0, AllPlanes) );
rtimestamp(&begin, "XShmGetImage");
memcpy(im_free->data, shmim->data, dsz);
rtimestamp(&begin, "mmalloc/memcpy");
} else {
+ rtimestamp(&begin, "XGetImage before");
xassert( im_use= im_free=
XGetImage(disp,id, 0,0, wwidth,wheight, AllPlanes, ZPixmap) );
rtimestamp(&begin, "XGetImage");
return 0;
int compare_to= a->h;
- if (max_relevant_y && compare_to > max_relevant_y)
+ if (max_relevant_y>=0 && compare_to > max_relevant_y)
compare_to= max_relevant_y;
return !memcmp(a->data, b->data, a->w * 3 * compare_to);
va_start(al,fmt);
Snapshot *last=0;
+ int nidentical=0;
/* waits longer if we're going to return an image identical to previously
* if previously==0, all images are considered identical to it */
char *doing;
sysassert( vasprintf(&doing,fmt,al) >=0 );
- progress("%s",doing);
debugf("PAGING wait_for_stability"
" last_input=%f previously=%p `%s'\n",
last_input, previously, doing);
+ double min_interval= 25000; /*us*/
for (;;) {
- double at_snapshot= timestamp();
- double need_sleep= min_update_allowance - (at_snapshot - last_input);
- if (need_sleep > 0) { delay(need_sleep); continue; }
+ progress_spinner("%s",doing);
+
+ double since_last_input= timestamp() - last_input;
+ double this_interval= min_interval - since_last_input;
- snapshot(output);
+ if (this_interval >= 0)
+ usleep(this_interval);
- if (!with_keypress &&
- !(previously && identical(*output,previously))) {
- debugf("PAGING wait_for_stability simple\n");
- break;
- }
+ snapshot(output);
- if (last && identical(*output,last)) {
- debugf("PAGING wait_for_stability stabilised\n");
- break;
+ if (!last) {
+ debugf("PAGING wait_for_stability first...\n");
+ last=*output; *output=0;
+ } else if (!identical(*output,last)) {
+ debugf("PAGING wait_for_stability changed...\n");
+ free(last); last=*output; *output=0;
+ nidentical=0;
+ if (!with_keypress) {
+ min_interval *= 3.0;
+ min_interval += 0.5;
+ }
+ } else {
+ nidentical++;
+ int threshold=
+ !previously ? 3 :
+ identical(*output,previously) ? 5
+ : 1;
+ debugf("PAGING wait_for_stability nidentical=%d threshold=%d\n",
+ nidentical, threshold);
+ if (nidentical >= threshold)
+ break;
+
+ min_interval += 0.5;
+ min_interval *= 2.0;
}
-
- progress_spinner("%s",doing);
-
- debugf("PAGING wait_for_stability retry\n");
-
- free_snapshot(&last); last=*output; *output=0;
if (with_keypress)
with_keypress();
-
- delay(0.5);
}
free_snapshot(&last);
check_client_window_all_on_screen();
- int shm= XShmQueryExtension(disp);
- shm=0;
+ Bool shmpixmaps=0;
+ int major=0,minor=0;
+ int shm= XShmQueryVersion(disp, &major,&minor,&shmpixmaps);
+ debugf("PAGING shm=%d %d.%d pixmaps=%d\n",shm,major,minor,shmpixmaps);
if (shm) {
xassert( shmim= XShmCreateImage(disp, attr.visual, attr.depth, ZPixmap,
0,&shminfo, wwidth,wheight) );
static CanonImage *convert_page(Snapshot *sn, RgbImage *ri) {
CanonImage *im;
- fprintf(screenshot_file,
- "P6\n"
- "%d %d\n"
- "255\n", sn->w, sn->h);
+ fwrite_ppmraw(screenshot_file, sn);
+ if (ri) memcpy(ri->data, sn->data, ri->h * ri->w * 3);
+ unsigned char *pixel= sn->data;
CANONICALISE_IMAGE(im, sn->w, sn->h, {
- int i;
- rgb= 0;
- for (i=0; i<3; i++) {
- rgb <<= 8;
- unsigned long sample= RI_PIXEL(sn,x,y)[i];
- rgb |= sample;
- fputc(sample, screenshot_file);
- }
- if (ri)
- CANONIMG_ALSO_STORERGB(ri);
+ rgb=
+ (pixel[0] << 16) |
+ (pixel[1] << 8) |
+ (pixel[2] );
+ pixel += 3;
});
-
+
sysassert(!ferror(screenshot_file));
sysassert(!fflush(screenshot_file));
raise_and_get_details();
wait_for_stability(¤t,0,0, "checking current YPP client screen...");
-#if 0
-timestamp();
-snapshot(¤t);
-snapshot(¤t);
-snapshot(¤t);
-snapshot(¤t);
-snapshot(¤t);
-snapshot(¤t);
-snapshot(¤t);
-snapshot(¤t);
-snapshot(¤t);
-snapshot(¤t);
-timestamp();
-#endif
-
test= convert_page(current, 0);
find_structure(test, &max_relevant_y);
check_correct_commodities();
+ Rect sunshine= find_sunshine_widget();
+
+ progress("poking client...");
+ mouse_1_updown((sunshine.tl.x + sunshine.br.x) / 2,
+ (sunshine.tl.y*9 + sunshine.br.y) / 10);
+
free(test);
- free_snapshot(¤t);
- progress("requesting status information...");
+ wait_for_stability(¤t,0,0, "checking basic YPP client screen...");
mouse_1_updown(250, wheight-10);
mouse_1_updown_here();
mouse_1_updown_here();
send_key(XK_w);
send_key(XK_Return);
sync_after_input();
- sysassert(! usleep(1000000) );
+
+ Snapshot *status=0;
+ wait_for_stability(&status,current,0, "awaiting status information...");
+ free_snapshot(¤t);
+ free_snapshot(&status);
}
void take_screenshots(void) {