+static void translate_coords_toroot(int wx, int wy, int *rx, int *ry) {
+ Window dummy;
+ xassert( XTranslateCoordinates(disp, id,attr.root, wx,wy, rx,ry, &dummy) );
+}
+
+static void check_client_window_all_on_screen(void) {
+ Rect onroot;
+ unsigned rwidth, rheight;
+ Window dummy;
+ unsigned bd, depth;
+ int rxpos, rypos;
+
+ xassert( XGetGeometry(disp,attr.root, &dummy, &rxpos,&rypos,
+ &rwidth, &rheight,
+ &bd,&depth) );
+
+ translate_coords_toroot(0,0, &onroot.tl.x,&onroot.tl.y);
+ translate_coords_toroot(wwidth-1,wheight-1, &onroot.br.x,&onroot.br.y);
+ if (!(onroot.tl.x >= 0 &&
+ onroot.tl.y >= 0 &&
+ onroot.br.x < rwidth &&
+ onroot.br.y < rheight))
+ fatal("YPP client window is not entirely on the screen.");
+}
+
+static void check_not_disturbed(void) {
+ XEvent ev;
+ int r;
+
+ for (;;) {
+ r= XCheckMaskEvent(disp, ~0, &ev);
+ if (r==False) return;
+
+ switch (ev.type) {
+ case VisibilityNotify:
+ if (ev.xvisibility.state != VisibilityUnobscured)
+ fatal("YPP client window has become obscured.");
+ break;
+ case ConfigureNotify:
+ check_client_window_all_on_screen();
+ break;
+ case FocusOut:
+ fatal("Focus left YPP client window.");
+ break;
+ case FocusIn:
+ warning("focus entered YPP client window ?!");
+ break;
+ default:
+ fatal("Received unexpected X11 event (type code %d)!", ev.type);
+ }
+ }
+}
+