commit 0fe460dbd469a1d5b6a7140d0e1801935e4a923b
Author:     Lucas de Sena <[email protected]>
AuthorDate: Wed Apr 5 17:11:49 2023 -0300
Commit:     Hiltjo Posthuma <[email protected]>
CommitDate: Thu Apr 6 20:28:56 2023 +0200

    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 [email protected] mailing list for context.
    
    [1]: https://marc.info/?l=openbsd-ports&m=168072150814664&w=2

diff --git a/dmenu.c b/dmenu.c
index 4e7df12..62f1089 100644
--- a/dmenu.c
+++ b/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)

Reply via email to