From b44ef3383c7c51591ddbe69a29bb0d9ac6e4ead6 Mon Sep 17 00:00:00 2001 From: David Delassus Date: Tue, 17 Apr 2012 14:20:21 +0200 Subject: [PATCH 1/2] Manage _NET_WM_WINDOW_TYPE_DESKTOP --- src/event.c | 26 ++++++++++++++++++++++++++ src/ewmh.c | 1 + src/ewmh.h | 1 + 3 files changed, 28 insertions(+) diff --git a/src/event.c b/src/event.c index 7b9dc26..0c1c042 100644 --- a/src/event.c +++ b/src/event.c @@ -242,11 +242,37 @@ event_maprequest(XEvent *e) XWindowAttributes at; struct _systray *s; + Atom *atom, rf; + int f; + unsigned long n, il, i; + unsigned char *data = NULL; + /* Which windows to manage */ if(!XGetWindowAttributes(EVDPY(e), ev->window, &at) || at.override_redirect) return; + if(XGetWindowProperty(EVDPY(e), ev->window, 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(EVDPY(e), ev->window); + XMapSubwindows(EVDPY(e), ev->window); + XFree(data); + return; + } + } + + XFree(data); + } + if(!client_gb_win(ev->window)) client_new(ev->window, &at, false); else if((s = systray_find(ev->window))) diff --git a/src/ewmh.c b/src/ewmh.c index 8bb32cc..f21e1dc 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"); diff --git a/src/ewmh.h b/src/ewmh.h index 111b3b8..becffca 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, From 3878e89b99765974afce3b1231472809132659cb Mon Sep 17 00:00:00 2001 From: David Delassus Date: Tue, 17 Apr 2012 14:36:17 +0200 Subject: [PATCH 2/2] Clean up code --- src/event.c | 29 ++--------------------------- src/ewmh.c | 33 +++++++++++++++++++++++++++++++++ src/ewmh.h | 1 + 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/event.c b/src/event.c index 0c1c042..ace1ee8 100644 --- a/src/event.c +++ b/src/event.c @@ -242,37 +242,12 @@ event_maprequest(XEvent *e) XWindowAttributes at; struct _systray *s; - Atom *atom, rf; - int f; - unsigned long n, il, i; - unsigned char *data = NULL; - /* 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(XGetWindowProperty(EVDPY(e), ev->window, 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(EVDPY(e), ev->window); - XMapSubwindows(EVDPY(e), ev->window); - XFree(data); - return; - } - } - - XFree(data); - } - if(!client_gb_win(ev->window)) client_new(ev->window, &at, false); else if((s = systray_find(ev->window))) diff --git a/src/ewmh.c b/src/ewmh.c index f21e1dc..e2472ea 100644 --- a/src/ewmh.c +++ b/src/ewmh.c @@ -268,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 becffca..28535fe 100644 --- a/src/ewmh.h +++ b/src/ewmh.h @@ -125,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 */