diff options
author | Martin Duquesnoy <xorg62@gmail.com> | 2012-04-17 05:37:22 -0700 |
---|---|---|
committer | Martin Duquesnoy <xorg62@gmail.com> | 2012-04-17 05:37:22 -0700 |
commit | 4e2c6125cac00f63d94d550be85e1f8a596b8bee (patch) | |
tree | b69b643860ed7354e51a09338c4b2ef658ff9dfe | |
parent | 70bcf3cd50e380cea1238dafb0de01f648fc16ca (diff) | |
parent | 3878e89b99765974afce3b1231472809132659cb (diff) | |
download | wmfs-4e2c6125cac00f63d94d550be85e1f8a596b8bee.zip wmfs-4e2c6125cac00f63d94d550be85e1f8a596b8bee.tar.gz wmfs-4e2c6125cac00f63d94d550be85e1f8a596b8bee.tar.bz2 |
Merge pull request #45 from linkdd/master
Manage _NET_WM_WINDOW_TYPE_DESKTOP (Closes #29)
-rw-r--r-- | src/event.c | 3 | ||||
-rw-r--r-- | src/ewmh.c | 34 | ||||
-rw-r--r-- | src/ewmh.h | 2 |
3 files changed, 38 insertions, 1 deletions
diff --git a/src/event.c b/src/event.c index 7b9dc26..ace1ee8 100644 --- a/src/event.c +++ b/src/event.c @@ -244,7 +244,8 @@ event_maprequest(XEvent *e) /* Which windows to manage */ if(!XGetWindowAttributes(EVDPY(e), ev->window, &at) - || at.override_redirect) + || at.override_redirect + || ewmh_manage_window_type_desktop(ev->window)) return; if(!client_gb_win(ev->window)) @@ -42,6 +42,7 @@ ewmh_init(void) W->net_atom[net_supporting_wm_check] = ATOM("_NET_SUPPORTING_WM_CHECK"); W->net_atom[net_wm_window_opacity] = ATOM("_NET_WM_WINDOW_OPACITY"); W->net_atom[net_wm_window_type_normal] = ATOM("_NET_WM_WINDOW_TYPE_NORMAL"); + W->net_atom[net_wm_window_type_desktop] = ATOM("_NET_WM_WINDOW_TYPE_DESKTOP"); W->net_atom[net_wm_window_type_dock] = ATOM("_NET_WM_WINDOW_TYPE_DOCK"); W->net_atom[net_wm_window_type_splash] = ATOM("_NET_WM_WINDOW_TYPE_SPLASH"); W->net_atom[net_wm_window_type_dialog] = ATOM("_NET_WM_WINDOW_TYPE_DIALOG"); @@ -267,3 +268,36 @@ ewmh_manage_window_type(struct client *c) } } +bool +ewmh_manage_window_type_desktop(Window win) +{ + Atom *atom, rf; + int f; + unsigned long n, il, i; + unsigned char *data = NULL; + bool is_desktop = false; + + if(XGetWindowProperty(W->dpy, win, W->net_atom[net_wm_window_type], 0L, 0x7FFFFFFF, + False, XA_ATOM, &rf, &f, &n, &il, &data) == Success && n) + { + atom = (Atom*)data; + + for(i = 0; i < n; ++i) + { + /* If it is a _NET_WM_WINDOW_TYPE_DESKTOP window */ + if(atom[i] == W->net_atom[net_wm_window_type_desktop]) + { + /* map it, but don't manage it */ + XMapWindow(W->dpy, win); + XMapSubwindows(W->dpy, win); + + is_desktop = true; + break; + } + } + + XFree(data); + } + + return is_desktop; +} @@ -60,6 +60,7 @@ enum net_supporting_wm_check, net_wm_window_opacity, net_wm_window_type_normal, + net_wm_window_type_desktop, net_wm_window_type_dock, net_wm_window_type_splash, net_wm_window_type_dialog, @@ -124,5 +125,6 @@ long ewmh_get_xembed_state(Window win); void ewmh_update_wmfs_props(void); void ewmh_manage_state(long data[], struct client *c); void ewmh_manage_window_type(struct client *c); +bool ewmh_manage_window_type_desktop(Window win); #endif /* EWMH_H */ |