fix BadMatch error when embedding on some windows - st - simple terminal | |
git clone git://git.suckless.org/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit a0274bc20e11d8672bb2953fdd1d3010c0e708c5 | |
parent 5dbcca49263be094fc38159c297458ae323ef647 | |
Author: Lucas de Sena <[email protected]> | |
Date: Fri, 9 Aug 2024 13:33:47 +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/0fe460dbd469a1d5b6a7140d0e1801935e4a… | |
[2]: https://github.com/phillbush/xfiles/issues/47 | |
Diffstat: | |
M x.c | 11 +++++++---- | |
1 file changed, 7 insertions(+), 4 deletions(-) | |
--- | |
diff --git 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), InputO… | |
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)); |