diff --git a/src/server.c b/src/server.c index 18000f2..0f6b083 100644 --- a/src/server.c +++ b/src/server.c @@ -58,6 +58,7 @@ void server_init_atoms () server.atom._NET_WM_STATE_MAXIMIZED_VERT = XInternAtom (server.dsp, "_NET_WM_STATE_MAXIMIZED_VERT", False); server.atom._NET_WM_STATE_MAXIMIZED_HORZ = XInternAtom (server.dsp, "_NET_WM_STATE_MAXIMIZED_HORZ", False); server.atom._NET_WM_STATE_SHADED = XInternAtom (server.dsp, "_NET_WM_STATE_SHADED", False); + server.atom._NET_WM_STATE_HIDDEN = XInternAtom (server.dsp, "_NET_WM_STATE_HIDDEN", False); server.atom._NET_WM_STATE_BELOW = XInternAtom (server.dsp, "_NET_WM_STATE_BELOW", False); server.atom._NET_WM_STATE_ABOVE = XInternAtom (server.dsp, "_NET_WM_STATE_ABOVE", False); server.atom._NET_WM_STATE_MODAL = XInternAtom (server.dsp, "_NET_WM_STATE_MODAL", False); diff --git a/src/server.h b/src/server.h index 3da2f04..517cd84 100644 --- a/src/server.h +++ b/src/server.h @@ -40,6 +40,7 @@ typedef struct Global_atom Atom _NET_WM_STATE_MAXIMIZED_VERT; Atom _NET_WM_STATE_MAXIMIZED_HORZ; Atom _NET_WM_STATE_SHADED; + Atom _NET_WM_STATE_HIDDEN; Atom _NET_WM_STATE_BELOW; Atom _NET_WM_STATE_ABOVE; Atom _NET_WM_STATE_MODAL; diff --git a/src/util/window.c b/src/util/window.c index 285d525..06ab093 100644 --- a/src/util/window.c +++ b/src/util/window.c @@ -146,20 +146,18 @@ int window_get_monitor (Window win) int window_is_iconified (Window win) { - if (IconicState == get_property32(win, server.atom.WM_STATE, server.atom.WM_STATE)) { - // openbox sets on shaded windows the IconicState, however we do not consider these windows iconified - Atom *at; - int count, i; - at = server_get_property (win, server.atom._NET_WM_STATE, XA_ATOM, &count); - for (i = 0; i < count; i++) { - if (at[i] == server.atom._NET_WM_STATE_SHADED) { - XFree(at); - return 0; - } + // EWMH specification : minimization of windows use _NET_WM_STATE_HIDDEN. + // WM_STATE is not accurate for shaded window and in multi_desktop mode. + Atom *at; + int count, i; + at = server_get_property (win, server.atom._NET_WM_STATE, XA_ATOM, &count); + for (i = 0; i < count; i++) { + if (at[i] == server.atom._NET_WM_STATE_HIDDEN) { + XFree(at); + return 1; } - XFree(at); - return 1; } + XFree(at); return 0; }