aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Duquesnoy <xorg62@gmail.com>2012-04-17 05:37:22 -0700
committerMartin Duquesnoy <xorg62@gmail.com>2012-04-17 05:37:22 -0700
commit4e2c6125cac00f63d94d550be85e1f8a596b8bee (patch)
treeb69b643860ed7354e51a09338c4b2ef658ff9dfe
parent70bcf3cd50e380cea1238dafb0de01f648fc16ca (diff)
parent3878e89b99765974afce3b1231472809132659cb (diff)
downloadwmfs-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.c3
-rw-r--r--src/ewmh.c34
-rw-r--r--src/ewmh.h2
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))
diff --git a/src/ewmh.c b/src/ewmh.c
index 8bb32cc..e2472ea 100644
--- a/src/ewmh.c
+++ b/src/ewmh.c
@@ -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;
+}
diff --git a/src/ewmh.h b/src/ewmh.h
index 111b3b8..28535fe 100644
--- a/src/ewmh.h
+++ b/src/ewmh.h
@@ -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 */