#include "x11util.h" extern "C" { #include #include } #include #include #include static int eHandler(Display* dpy, XErrorEvent* e) { char buf[1000]; XGetErrorText(dpy, e->error_code, buf, 1000); fprintf(stderr, "X ERROR %d: %s\n", (int)e->error_code, buf); return 0; } extern "C" void AddPixmapToBackground(unsigned const char* imgData, int width, int height, int depth, int bytesPerLine, int byteCount) { Pixmap pix = 0; GC gc = NULL; XImage *xi = NULL; XGCValues gc_init; memset(&gc_init, 0, sizeof(gc_init)); Display* dpy = XOpenDisplay(NULL); if (dpy == NULL) return; XSetErrorHandler(&eHandler); int screen = DefaultScreen(dpy); Window root = RootWindow(dpy, screen); char *data = (char*)malloc(byteCount); memcpy(data, imgData, byteCount); xi = XCreateImage(dpy, CopyFromParent, depth, ZPixmap, 0, data, width, height, 32, bytesPerLine); if (xi == NULL) goto cleanup; pix = XCreatePixmap(dpy, root, width, height, (unsigned int)DefaultDepth(dpy, screen)); if (pix == 0) goto cleanup; gc_init.foreground = BlackPixel(dpy, screen); gc_init.background = WhitePixel(dpy, screen); gc = XCreateGC(dpy, pix, GCForeground|GCBackground, &gc_init); if (gc == NULL) goto cleanup; int res1, res2, res3; res1 = XPutImage(dpy, pix, gc, xi, 0, 0, 0, 0, width, height); res2 = XSetWindowBackgroundPixmap(dpy, root, pix); res3 = XClearWindow(dpy, root); cleanup: if (gc != NULL) { XFreeGC(dpy, gc); } if (pix != 0) { XFreePixmap(dpy, pix); } if (xi != NULL) { XDestroyImage(xi); } if (dpy != NULL) { XCloseDisplay(dpy); } }