]> Sergey Matveev's repositories - st.git/commitdiff
fix BadMatch error when embedding on some windows
authorLucas de Sena <lucas@seninha.org>
Fri, 9 Aug 2024 11:33:47 +0000 (13:33 +0200)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Fri, 9 Aug 2024 11:34:56 +0000 (13:34 +0200)
When embedded, st fails with BadMatch error if the embedder's window has
non-default colormap/depth/visual.  This commit fixes that by creating
st's window inside root and then reparent it into embedder.

The reference window for dc.gc is also changed to match root's visuals.

A similar commit had been made for dmenu[1].
See this issue[2] on github for context.

[1]: https://git.suckless.org/dmenu/commit/0fe460dbd469a1d5b6a7140d0e1801935e4a923b.html
[2]: https://github.com/phillbush/xfiles/issues/47

x.c

diff --git a/x.c b/x.c
index bd236869526584bdc5f30fd719535122164c5a52..d73152b5f07f811af386c183329f59d495300ab4 100644 (file)
--- a/x.c
+++ b/x.c
@@ -1131,7 +1131,7 @@ xinit(int cols, int rows)
 {
        XGCValues gcvalues;
        Cursor cursor;
-       Window parent;
+       Window parent, root;
        pid_t thispid = getpid();
        XColor xmousefg, xmousebg;
 
@@ -1168,16 +1168,19 @@ xinit(int cols, int rows)
                | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask;
        xw.attrs.colormap = xw.cmap;
 
+       root = XRootWindow(xw.dpy, xw.scr);
        if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0))))
-               parent = XRootWindow(xw.dpy, xw.scr);
-       xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t,
+               parent = root;
+       xw.win = XCreateWindow(xw.dpy, root, xw.l, xw.t,
                        win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput,
                        xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity
                        | CWEventMask | CWColormap, &xw.attrs);
+       if (parent != root)
+               XReparentWindow(xw.dpy, xw.win, parent, xw.l, xw.t);
 
        memset(&gcvalues, 0, sizeof(gcvalues));
        gcvalues.graphics_exposures = False;
-       dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
+       dc.gc = XCreateGC(xw.dpy, xw.win, GCGraphicsExposures,
                        &gcvalues);
        xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
                        DefaultDepth(xw.dpy, xw.scr));