]> Pileus Git - wmpus/blobdiff - sys-x11.c
Fix showing struts
[wmpus] / sys-x11.c
index 7dd9c7b35d814cb8981d59b8febef6385442571f..0d7644b859c3a67e575901802e5fc527f92d8b63 100644 (file)
--- a/sys-x11.c
+++ b/sys-x11.c
@@ -50,6 +50,7 @@ typedef struct {
 typedef enum {
        WM_PROTO, WM_FOCUS, WM_DELETE,
        NET_STATE, NET_FULL, NET_STRUT,
+       NET_TYPE, NET_DIALOG,
        NATOMS
 } atom_t;
 
@@ -209,8 +210,12 @@ static int strut_del(win_t *root, win_t *win)
 }
 
 /* Window functions */
+static Atom win_prop(win_t *win, atom_t prop);
+static win_t *win_find(Display *dpy, Window xid, int create);
+
 static win_t *win_new(Display *dpy, Window xid)
 {
+       Window trans;
        XWindowAttributes attr;
        if (XGetWindowAttributes(dpy, xid, &attr))
                if (attr.override_redirect)
@@ -223,9 +228,14 @@ static win_t *win_new(Display *dpy, Window xid)
        win->sys      = new0(win_sys_t);
        win->sys->dpy = dpy;
        win->sys->xid = xid;
-       printf("win_new: %p = %p, %d (%d,%d %dx%d)\n",
+       if (win_prop(win, NET_TYPE) == atoms[NET_DIALOG])
+               win->type = TYPE_DIALOG;
+       if (XGetTransientForHint(dpy, xid, &trans))
+               win->parent = win_find(dpy, trans, 0);
+       printf("win_new: %p = %p, %d (%d,%d %dx%d) - %s\n",
                        win, dpy, (int)xid,
-                       win->x, win->y, win->w, win->h);
+                       win->x, win->y, win->w, win->h,
+                       win->type ? "dialog" : "normal");
        return win;
 }
 
@@ -428,6 +438,7 @@ static void process_event(int type, XEvent *xe, win_t *root)
                printf("map_req: %d\n", type);
                if ((win = win_find(dpy,xe->xmaprequest.window,1)) &&
                     win->state == ST_HIDE) {
+                       win->state = ST_SHOW;
                        if (win_prop(win, NET_STATE) == atoms[NET_FULL])
                                win->state = ST_FULL;
                        XSelectInput(win->sys->dpy, win->sys->xid, PropertyChangeMask);
@@ -435,8 +446,8 @@ static void process_event(int type, XEvent *xe, win_t *root)
                                wm_insert(win);
                        else
                                wm_update();
-               } else
-                       sys_show(win, ST_SHOW);
+               }
+               sys_show(win, win->state);
        }
        else if (type == ClientMessage) {
                XClientMessageEvent *cme = &xe->xclient;
@@ -665,12 +676,14 @@ win_t *sys_init(void)
                error("Unable to get root window");
 
        /* Setup X11 data */
-       atoms[WM_PROTO]    = XInternAtom(dpy, "WM_PROTOCOLS",             False);
-       atoms[WM_FOCUS]    = XInternAtom(dpy, "WM_TAKE_FOCUS",            False);
-       atoms[WM_DELETE]   = XInternAtom(dpy, "WM_DELETE_WINDOW",         False);
-       atoms[NET_STATE]   = XInternAtom(dpy, "_NET_WM_STATE",            False);
-       atoms[NET_FULL]    = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
-       atoms[NET_STRUT]   = XInternAtom(dpy, "_NET_WM_STRUT",            False);
+       atoms[WM_PROTO]    = XInternAtom(dpy, "WM_PROTOCOLS",               False);
+       atoms[WM_FOCUS]    = XInternAtom(dpy, "WM_TAKE_FOCUS",              False);
+       atoms[WM_DELETE]   = XInternAtom(dpy, "WM_DELETE_WINDOW",           False);
+       atoms[NET_STATE]   = XInternAtom(dpy, "_NET_WM_STATE",              False);
+       atoms[NET_FULL]    = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN",   False);
+       atoms[NET_STRUT]   = XInternAtom(dpy, "_NET_WM_STRUT",              False);
+       atoms[NET_TYPE]    = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE",        False);
+       atoms[NET_DIALOG]  = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
 
        colors[CLR_FOCUS]   = get_color(dpy, "#a0a0ff");
        colors[CLR_UNFOCUS] = get_color(dpy, "#101066");