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 */