[hackers] [st] fix BadMatch error when embedding on some windows || Lucas de Sena

From: <git_AT_suckless.org>
Date: Fri, 9 Aug 2024 13:35:33 +0200 (CEST)

commit a0274bc20e11d8672bb2953fdd1d3010c0e708c5
Author: Lucas de Sena <lucas_AT_seninha.org>
AuthorDate: Fri Aug 9 13:33:47 2024 +0200
Commit: Hiltjo Posthuma <hiltjo_AT_codemadness.org>
CommitDate: Fri Aug 9 13:34:56 2024 +0200

    fix BadMatch error when embedding on some windows
    
    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

diff --git a/x.c b/x.c
index bd23686..d73152b 100644
--- a/x.c
+++ b/x.c
_AT_@ -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;
 
_AT_@ -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));
Received on Fri Aug 09 2024 - 13:35:33 CEST

This archive was generated by hypermail 2.3.0 : Fri Aug 09 2024 - 13:36:38 CEST