diff options
| author | Lucas de Sena <lucas@seninha.org> | 2024-08-09 13:33:47 +0200 | 
|---|---|---|
| committer | Hiltjo Posthuma <hiltjo@codemadness.org> | 2024-08-09 13:34:56 +0200 | 
| commit | a0274bc20e11d8672bb2953fdd1d3010c0e708c5 (patch) | |
| tree | c2368d6273853e48c62103155b1a9a69d9d13d5e | |
| parent | 5dbcca49263be094fc38159c297458ae323ef647 (diff) | |
| download | st-transparency-a0274bc20e11d8672bb2953fdd1d3010c0e708c5.tar.gz st-transparency-a0274bc20e11d8672bb2953fdd1d3010c0e708c5.tar.xz st-transparency-a0274bc20e11d8672bb2953fdd1d3010c0e708c5.zip  | |
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
| -rw-r--r-- | x.c | 11 | 
1 files changed, 7 insertions, 4 deletions
@@ -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));  | 
