#include #include #include #include int main(int argc, char **argv) { Display *display; int event_base, error_base; Screen *screen; Window root, window1, window2; unsigned long black; XRenderPictFormat *format; struct c { XRectangle rect; Picture pict; XRenderColor color; struct c *c; } c1, c2; XContext context; display = XOpenDisplay(NULL); if (display == NULL) { return 1; } if (!XRenderQueryExtension(display, &event_base, &error_base)) { XCloseDisplay(display); return 1; } screen = DefaultScreenOfDisplay(display); root = RootWindowOfScreen(screen); black = BlackPixelOfScreen(screen); window1 = XCreateSimpleWindow(display, root, 0, 0, 400, 300, 1, black, black); window2 = XCreateSimpleWindow(display, root, 0, 0, 300, 400, 1, black, black); XSelectInput(display, window1, KeyPressMask | ButtonPressMask | ExposureMask | StructureNotifyMask); XSelectInput(display, window2, KeyPressMask | ButtonPressMask | ExposureMask | StructureNotifyMask); XMapWindow(display, window1); XMapWindow(display, window2); format = XRenderFindVisualFormat(display, DefaultVisualOfScreen(screen)); c1.pict = XRenderCreatePicture(display, window1, format, 0, NULL); c2.pict = XRenderCreatePicture(display, window2, format, 0, NULL); context = XUniqueContext(); XSaveContext(display, window1, context, (XPointer)&c1); XSaveContext(display, window2, context, (XPointer)&c2); c1.color.red = 0; c1.color.green = 0xffff; c1.color.blue = 0; c1.color.alpha = 0xffff; c1.c = &c2; c2.color.red = 0; c2.color.green = 0; c2.color.blue = 0xffff; c2.color.alpha = 0xffff; c2.c = &c1; while (1) { XEvent event; struct c *c; XNextEvent(display, &event); XFindContext(display, event.xany.window, context, (XPointer *)&c); switch (event.type) { case KeyPress: printf("(%d, %d) %d x %d <- (%d, %d) %d x %d\n", c->rect.x, c->rect.y, c->rect.width, c->rect.height, c->c->rect.x, c->c->rect.y, c->c->rect.width, c->c->rect.height); XRenderComposite(display, PictOpSrc, c->c->pict, None, c->pict, 0, 0, 0, 0, 0, 0, c->rect.width, c->rect.height); continue; case ButtonPress: break; case Expose: XRenderFillRectangle(display, PictOpSrc, c->pict, &c->color, event.xexpose.x, event.xexpose.y, event.xexpose.width, event.xexpose.height); continue; case ConfigureNotify: c->rect.x = event.xconfigure.x; c->rect.y = event.xconfigure.y; c->rect.width = event.xconfigure.width; c->rect.height = event.xconfigure.height; continue; default: continue; } break; } XDestroyWindow(display, window1); XDestroyWindow(display, window2); XCloseDisplay(display); return 0; }