[hackers] [dmenu][PATCH] fix BadMatch error when embedding on some windows

From: Lucas de Sena <lucas_AT_seninha.org>
Date: Wed, 5 Apr 2023 17:11:49 -0300

When embedded into another window, dmenu will fail with the BadMatch
error if that window have not the same colormap/depth/visual as the
root window.

That happens because dmenu inherits the colormap/depth/visual from
its parent, but draws on a pixmap created based on the root window
using a GC created for the root window (see drw.c). A BadMatch will
occur when copying the content of the pixmap into dmenu's window.

A solution is to create dmenu's window inside root and then reparent
it if embeded.

See this mail[1] on ports_AT_openbsd.org mailing list for context.

[1]: https://marc.info/?l=openbsd-ports&m=168072150814664&w=2
---
 dmenu.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dmenu.c b/dmenu.c
index 4e7df12..62f1089 100644
--- a/dmenu.c
+++ b/dmenu.c
_AT_@ -685,7 +685,7 @@ setup(void)
 	swa.override_redirect = True;
 	swa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
 	swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
-	win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0,
+	win = XCreateWindow(dpy, root, x, y, mw, mh, 0,
 	                    CopyFromParent, CopyFromParent, CopyFromParent,
 	                    CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);
 	XSetClassHint(dpy, win, &ch);
_AT_@ -700,6 +700,7 @@ setup(void)
 
 	XMapRaised(dpy, win);
 	if (embed) {
+		XReparentWindow(dpy, win, parentwin, x, y);
 		XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask);
 		if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) {
 			for (i = 0; i < du && dws[i] != win; ++i)
-- 
2.40.0
Received on Wed Apr 05 2023 - 22:11:49 CEST

This archive was generated by hypermail 2.3.0 : Wed Apr 05 2023 - 22:12:55 CEST