#include "x11util.h"
extern "C" {
#include <X11/Xlib.h>
#include <X11/Xutil.h>
}
#include <cstring>
#include <cstdlib>
#include <cstdio>
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);
}
}