aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorokan2014-09-17 16:00:44 +0000
committerokan2014-09-17 16:00:44 +0000
commit8d10d477be60c717703bb419601c8c76be754f54 (patch)
tree7220a1ddb8d474e982345b775f4006c8c63f271d
parent67e11ccf55b1c98c1db978ca29a41a2fdd71e061 (diff)
downloadcwm-8d10d477be60c717703bb419601c8c76be754f54.tar.gz
Implement EWMH _NET_WM_STATE_HIDDEN.
-rw-r--r--calmwm.h6
-rw-r--r--client.c17
-rw-r--r--conf.c3
-rw-r--r--xutil.c14
4 files changed, 31 insertions, 9 deletions
diff --git a/calmwm.h b/calmwm.h
index f25e7b5..5bd06be 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: calmwm.h,v 1.276 2014/09/17 14:31:37 okan Exp $
+ * $OpenBSD: calmwm.h,v 1.277 2014/09/17 16:00:44 okan Exp $
*/
#ifndef _CALMWM_H_
@@ -344,10 +344,11 @@ enum {
_NET_WM_DESKTOP,
_NET_CLOSE_WINDOW,
_NET_WM_STATE,
-#define _NET_WM_STATES_NITEMS 5
+#define _NET_WM_STATES_NITEMS 6
_NET_WM_STATE_STICKY,
_NET_WM_STATE_MAXIMIZED_VERT,
_NET_WM_STATE_MAXIMIZED_HORZ,
+ _NET_WM_STATE_HIDDEN,
_NET_WM_STATE_FULLSCREEN,
_NET_WM_STATE_DEMANDS_ATTENTION,
EWMH_NITEMS
@@ -374,6 +375,7 @@ void client_freeze(struct client_ctx *);
void client_fullscreen(struct client_ctx *);
long client_get_wm_state(struct client_ctx *);
void client_getsizehints(struct client_ctx *);
+void client_hidden(struct client_ctx *);
void client_hide(struct client_ctx *);
void client_hmaximize(struct client_ctx *);
void client_htile(struct client_ctx *);
diff --git a/client.c b/client.c
index 64a7622..4c3a88d 100644
--- a/client.c
+++ b/client.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: client.c,v 1.183 2014/09/15 13:00:49 okan Exp $
+ * $OpenBSD: client.c,v 1.184 2014/09/17 16:00:44 okan Exp $
*/
#include <sys/param.h>
@@ -240,6 +240,17 @@ client_freeze(struct client_ctx *cc)
}
void
+client_hidden(struct client_ctx *cc)
+{
+ if (cc->flags & CLIENT_HIDDEN)
+ cc->flags &= ~CLIENT_HIDDEN;
+ else
+ cc->flags |= CLIENT_HIDDEN;
+
+ xu_ewmh_set_net_wm_state(cc);
+}
+
+void
client_sticky(struct client_ctx *cc)
{
if (cc->flags & CLIENT_STICKY)
@@ -486,7 +497,7 @@ client_hide(struct client_ctx *cc)
XUnmapWindow(X_Dpy, cc->win);
cc->flags &= ~CLIENT_ACTIVE;
- cc->flags |= CLIENT_HIDDEN;
+ client_hidden(cc);
client_set_wm_state(cc, IconicState);
if (cc == client_current())
@@ -501,7 +512,7 @@ client_unhide(struct client_ctx *cc)
XMapRaised(X_Dpy, cc->win);
- cc->flags &= ~CLIENT_HIDDEN;
+ client_hidden(cc);
client_set_wm_state(cc, NormalState);
client_draw_border(cc);
}
diff --git a/conf.c b/conf.c
index a6d99a3..89eef07 100644
--- a/conf.c
+++ b/conf.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: conf.c,v 1.179 2014/09/07 19:27:30 okan Exp $
+ * $OpenBSD: conf.c,v 1.180 2014/09/17 16:00:44 okan Exp $
*/
#include <sys/param.h>
@@ -675,6 +675,7 @@ static char *ewmhints[] = {
"_NET_WM_STATE_STICKY",
"_NET_WM_STATE_MAXIMIZED_VERT",
"_NET_WM_STATE_MAXIMIZED_HORZ",
+ "_NET_WM_STATE_HIDDEN",
"_NET_WM_STATE_FULLSCREEN",
"_NET_WM_STATE_DEMANDS_ATTENTION",
};
diff --git a/xutil.c b/xutil.c
index 6eb2b17..1ba435e 100644
--- a/xutil.c
+++ b/xutil.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: xutil.c,v 1.93 2014/09/15 13:00:49 okan Exp $
+ * $OpenBSD: xutil.c,v 1.94 2014/09/17 16:00:44 okan Exp $
*/
#include <sys/param.h>
@@ -379,6 +379,9 @@ xu_ewmh_handle_net_wm_state_msg(struct client_ctx *cc, int action,
{ _NET_WM_STATE_MAXIMIZED_HORZ,
CLIENT_HMAXIMIZED,
client_hmaximize },
+ { _NET_WM_STATE_HIDDEN,
+ CLIENT_HIDDEN,
+ client_hidden },
{ _NET_WM_STATE_FULLSCREEN,
CLIENT_FULLSCREEN,
client_fullscreen },
@@ -420,6 +423,8 @@ xu_ewmh_restore_net_wm_state(struct client_ctx *cc)
client_hmaximize(cc);
if (atoms[i] == ewmh[_NET_WM_STATE_MAXIMIZED_VERT])
client_vmaximize(cc);
+ if (atoms[i] == ewmh[_NET_WM_STATE_HIDDEN])
+ client_hidden(cc);
if (atoms[i] == ewmh[_NET_WM_STATE_FULLSCREEN])
client_fullscreen(cc);
if (atoms[i] == ewmh[_NET_WM_STATE_DEMANDS_ATTENTION])
@@ -437,16 +442,19 @@ xu_ewmh_set_net_wm_state(struct client_ctx *cc)
oatoms = xu_ewmh_get_net_wm_state(cc, &n);
atoms = xcalloc((n + _NET_WM_STATES_NITEMS), sizeof(Atom));
for (i = j = 0; i < n; i++) {
- if (oatoms[i] != ewmh[_NET_WM_STATE_MAXIMIZED_HORZ] &&
+ if (oatoms[i] != ewmh[_NET_WM_STATE_STICKY] &&
+ oatoms[i] != ewmh[_NET_WM_STATE_MAXIMIZED_HORZ] &&
oatoms[i] != ewmh[_NET_WM_STATE_MAXIMIZED_VERT] &&
+ oatoms[i] != ewmh[_NET_WM_STATE_HIDDEN] &&
oatoms[i] != ewmh[_NET_WM_STATE_FULLSCREEN] &&
- oatoms[i] != ewmh[_NET_WM_STATE_STICKY] &&
oatoms[i] != ewmh[_NET_WM_STATE_DEMANDS_ATTENTION])
atoms[j++] = oatoms[i];
}
free(oatoms);
if (cc->flags & CLIENT_STICKY)
atoms[j++] = ewmh[_NET_WM_STATE_STICKY];
+ if (cc->flags & CLIENT_HIDDEN)
+ atoms[j++] = ewmh[_NET_WM_STATE_HIDDEN];
if (cc->flags & CLIENT_FULLSCREEN)
atoms[j++] = ewmh[_NET_WM_STATE_FULLSCREEN];
else {