summaryrefslogtreecommitdiffstats
path: root/src/x11util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/x11util.cpp')
-rw-r--r--src/x11util.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/x11util.cpp b/src/x11util.cpp
new file mode 100644
index 0000000..f56d31e
--- /dev/null
+++ b/src/x11util.cpp
@@ -0,0 +1,62 @@
+#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);
+ }
+}