summaryrefslogtreecommitdiff
path: root/dmenu.c
diff options
context:
space:
mode:
authorLucas de Sena <lucas@seninha.org>2023-04-05 17:11:49 -0300
committerRafael Marçalo <raroma09@gmail.com>2023-04-09 00:09:26 +0100
commit47a29cb0e3f60270a71fd5fe49dc359179baa92b (patch)
tree33a54607f3b3322992457d86e17227e19b57bd19 /dmenu.c
parentef8a3a73913a2ff294682612f1512891aae76252 (diff)
fix BadMatch error when embedding on some windows
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@openbsd.org mailing list for context. [1]: https://marc.info/?l=openbsd-ports&m=168072150814664&w=2
Diffstat (limited to 'dmenu.c')
-rw-r--r--dmenu.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/dmenu.c b/dmenu.c
index 5e4fe3e..4bc0123 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -696,7 +696,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);
@@ -711,6 +711,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)