From a3a2c5e71711482dfce333a6a8b5724f3c5f84bf Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Wed, 20 Jun 2012 05:51:21 +0000 Subject: [PATCH] Add support for dialogs and transient windows These are both added the floating layer by default --- conf.c | 7 ++++--- sys-x11.c | 28 ++++++++++++++++++++-------- sys.h | 16 ++++++++++++---- wm-wmii.c | 2 ++ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/conf.c b/conf.c index 4071655..889bda6 100644 --- a/conf.c +++ b/conf.c @@ -23,10 +23,11 @@ #include "conf.h" /* Types */ -typedef enum { NUMBER, STRING } type_t; - typedef struct { - type_t type; + enum { + NUMBER, + STRING, + } type; char *key; union { int num; diff --git a/sys-x11.c b/sys-x11.c index 7dd9c7b..adb4eae 100644 --- 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 db18800..3599c3d 100644 --- 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 diff --git a/wm-wmii.c b/wm-wmii.c index 06a258f..23e2ce7 100644 --- 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 */ -- 2.43.2