#include #include #include #include static Bool all_events (Display *display, XEvent *event, XPointer arg) { return True; } #if 0 static void get_size (Display *d, Drawable draw, int *xp, int *yp, int *widthp, int *heightp) { int x, y; unsigned int width, height, border, depth; Window root; XGetGeometry (d, draw, &root, &x, &y, &width, &height, &border, &depth); if (xp) *xp = x; if (yp) *yp = y; if (widthp) *widthp = width; if (*heightp) *heightp = height; } #endif int main (int argc, char **argv) { Display *d; Window zero_min_size; XSizeHints hints; int screen; XEvent ev; int x, y, width, height; Pixmap pix; GC gc; XGCValues gc_vals; gboolean redraw_pending; d = XOpenDisplay (NULL); screen = DefaultScreen (d); x = 0; y = 0; width = 100; height = 100; zero_min_size = XCreateSimpleWindow (d, RootWindow (d, screen), x, y, width, height, 0, WhitePixel (d, screen), WhitePixel (d, screen)); XSelectInput (d, zero_min_size, ButtonPressMask | ExposureMask | StructureNotifyMask); hints.flags = PMinSize; hints.min_width = 0; hints.min_height = 0; XSetWMNormalHints (d, zero_min_size, &hints); XMapWindow (d, zero_min_size); redraw_pending = FALSE; while (1) { XNextEvent (d, &ev); switch (ev.xany.type) { case ButtonPress: if (ev.xbutton.button == 1) { g_print ("Exiting on button 1 press\n"); exit (0); } break; case ConfigureNotify: x = ev.xconfigure.x; y = ev.xconfigure.y; width = ev.xconfigure.width; height = ev.xconfigure.height; redraw_pending = TRUE; break; case Expose: redraw_pending = TRUE; break; default: break; } /* Primitive event compression */ if (XCheckIfEvent (d, &ev, all_events, NULL)) { XPutBackEvent (d, &ev); } else if (redraw_pending) { pix = XCreatePixmap (d, zero_min_size, width, height, DefaultDepth (d, screen)); gc_vals.foreground = WhitePixel (d, screen); gc = XCreateGC (d, pix, GCForeground, &gc_vals); XFillRectangle (d, pix, gc, 0, 0, width, height); XCopyArea (d, pix, zero_min_size, gc, 0, 0, width, height, 0, 0); XFreePixmap (d, pix); XFreeGC (d, gc); redraw_pending = FALSE; } } return 0; }