]> Pileus Git - wmpus/commitdiff
Add support for dialogs and transient windows
authorAndy Spencer <andy753421@gmail.com>
Wed, 20 Jun 2012 05:51:21 +0000 (05:51 +0000)
committerAndy Spencer <andy753421@gmail.com>
Wed, 20 Jun 2012 05:51:21 +0000 (05:51 +0000)
These are both added the floating layer by default

conf.c
sys-x11.c
sys.h
wm-wmii.c

diff --git a/conf.c b/conf.c
index 407165546c72e4c83c8234672753aef4bac011f7..889bda6e4327839927c022626a816a186b61274b 100644 (file)
--- a/conf.c
+++ b/conf.c
 #include "conf.h"
 
 /* Types */
-typedef enum { NUMBER, STRING } type_t;
-
 typedef struct {
-       type_t  type;
+       enum {
+               NUMBER,
+               STRING,
+       } type;
        char   *key;
        union {
                int   num;
index 7dd9c7b35d814cb8981d59b8febef6385442571f..adb4eae71d8270c5de1883749b8fbeaac11fab60 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;
 }
 
@@ -665,12 +675,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");
diff --git a/sys.h b/sys.h
index db18800c0724e20903652046744ce64bf83d1431..3599c3da13382c89421d542d2ebefbe600b65cbf 100644 (file)
--- a/sys.h
+++ b/sys.h
@@ -35,15 +35,23 @@ typedef enum {
        ST_CLOSE, // close the window
 } state_t;
 
+/* Window types */
+typedef enum {
+       TYPE_NORMAL,
+       TYPE_DIALOG,
+} type_t;
+
 /* Basic window type */
 typedef struct win_sys win_sys_t;
 typedef struct win_wm  win_wm_t;
-typedef struct {
+typedef struct win {
        int x, y, z;
        int w, h;
-       state_t    state;
-       win_sys_t *sys;
-       win_wm_t  *wm;
+       state_t state;
+       type_t  type;
+       struct win *parent;
+       win_sys_t  *sys;
+       win_wm_t   *wm;
 } win_t;
 
 /* Generic key codes, also used for some other events
index 06a258fd49d954af42a94a16b3521fc2a7db9c4b..23e2ce76bddab4367a67a34ee356e763a39f86ae 100644 (file)
--- a/wm-wmii.c
+++ b/wm-wmii.c
@@ -889,6 +889,8 @@ void wm_insert(win_t *win)
        sys_watch(win, EV_FOCUS, MOD());
 
        /* Add to screen */
+       if (win->type == TYPE_DIALOG || win->parent)
+               wm_dpy->layer = FLOATING;
        put_win(win, wm_tag, wm_dpy->layer);
 
        /* Arrange */