#include #include #include #include #include static int comp_event, comp_error; static int damage_event, damage_error; static void disaster (const char *what) { exit (-1); } static void dump_events (Display *dpy, const char *header) { int did_header = 0; XSync (dpy, False); while (XPending (dpy)) { XEvent event; XNextEvent (dpy, &event); if (header) { if (!did_header) { printf ("%s", header); did_header = 1; } if (event.type == damage_event) { printf (" event: damage (%lx)\n", event.xany.window); } else { printf (" event on window: (%lx)\n", event.xany.window); } } } } static void paint_window (Display *dpy, Window window, unsigned long pixel) { XGCValues gc_values; GC gc; gc_values.foreground = pixel; gc = XCreateGC (dpy, window, GCForeground, &gc_values); XFillRectangle (dpy, window, gc, 0, 0, 32000, 32000); XFreeGC (dpy, gc); } int main () { Display *dpy = XOpenDisplay (NULL); Window toplevel; Window child; Pixmap pixmap; Damage d; GC gc; int i; toplevel = XCreateSimpleWindow (dpy, XDefaultRootWindow (dpy), 100, 100, 600, 400, 0, 0, 0xffffffff); XMapWindow (dpy, toplevel); XFlush (dpy); usleep (1000); /* wait for wm to map window */ if (!XCompositeQueryExtension (dpy, &comp_event, &comp_error)) disaster ("No composite extension found\n"); if (!XDamageQueryExtension (dpy, &damage_event, &damage_error)) disaster ("No damage extension found\n"); XCompositeRedirectSubwindows (dpy, toplevel, CompositeRedirectManual); child = XCreateSimpleWindow (dpy, toplevel, 50, 50, 500, 300, 0, 0, 0x000000ff); printf ("Created window: %lx\n", child); XMapWindow (dpy, child); pixmap = XCompositeNameWindowPixmap (dpy, child); printf ("Named pixmap %lx\n", pixmap); XDamageCreate (dpy, child, XDamageReportRawRectangles); XDamageCreate (dpy, pixmap, XDamageReportRawRectangles); XSync (dpy, False); for (i = 0; i < 10; ++i) { paint_window (dpy, child, 0xff00ffff); dump_events (dpy, "events\n"); usleep (5000); } sleep (10); return 0; }