]> Pileus Git - wmpus/blobdiff - sys-x11.c
Fix showing struts
[wmpus] / sys-x11.c
index 2120ee07931b427dc4be43c6486655f3c0f73197..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;
 }
 
@@ -299,27 +309,19 @@ static int win_msg(win_t *win, atom_t msg)
        return 1;
 }
 
-#if 0
-static int win_full(win_t *win)
+static Atom win_prop(win_t *win, atom_t prop)
 {
-       Atom ret_type;
-       int ret_size;
-       unsigned long ret_items, bytes_left;
-       unsigned char *xdata;
-       int status = XGetWindowProperty(win->sys->dpy, win->sys->xid,
-                       atoms[NET_FULL], 0L, 1L, False, XA_ATOM,
-                       &ret_type, &ret_size, &ret_items, &bytes_left, &xdata);
-       printf("is_fullscreen:\n");
-       printf("\t%d\n", status);
-       printf("\t%d\n", ret_size);
-       printf("\t%ld\n", ret_items);
-       printf("\t%p\n", xdata);
-       if (xdata)
-       printf("\t%d\n", xdata[0]);
-       return status == Success && ret_size == 32 && ret_items == 1 &&
-               xdata[0] == atoms[NET_FULL];
-}
-#endif
+       int format;
+       unsigned long nitems, bytes;
+       unsigned char *buf = NULL;
+       Atom atom, type = XA_ATOM;
+       if (XGetWindowProperty(win->sys->dpy, win->sys->xid, atoms[prop],
+                       0L, sizeof(Atom), False, type, &type, &format, &nitems, &bytes, &buf) || !buf)
+               return 0;
+       atom = *(Atom *)buf;
+       XFree(buf);
+       return atom;
+}
 
 /* Drawing functions */
 static unsigned long get_color(Display *dpy, const char *name)
@@ -436,13 +438,16 @@ 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);
                        if (!strut_add(root, win))
                                wm_insert(win);
                        else
                                wm_update();
                }
-               sys_show(win, ST_SHOW);
+               sys_show(win, win->state);
        }
        else if (type == ClientMessage) {
                XClientMessageEvent *cme = &xe->xclient;
@@ -671,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");