commit 0fe460dbd469a1d5b6a7140d0e1801935e4a923b from: Lucas de Sena via: Hiltjo Posthuma date: Thu Apr 6 18:28:56 2023 UTC 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 commit - dfbbf7f6e1b22ccf9e5a45d77ee10995577fb4fc commit + 0fe460dbd469a1d5b6a7140d0e1801935e4a923b blob - 4e7df12eee673974038aeefeb2daa4bd8a8a2e60 blob + 62f1089ff4f414c6ccdfc85e07eedbb706aec562 --- dmenu.c +++ dmenu.c @@ -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); @@ -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)