summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorOkan Demirmen <okan@cvs.openbsd.org>2013-05-20 21:13:59 +0000
committerOkan Demirmen <okan@cvs.openbsd.org>2013-05-20 21:13:59 +0000
commit6c64852054082a58f12e38422fa881571739ae81 (patch)
treeb52e6f1615bbc4565d67ef3e645ae1acb432d68d /app
parent403863e66b5a7bc0e2f9286e2d73d69bb5132104 (diff)
add support for _NET_WM_STATE_MAXIMIZED_{HORZ,VERT}; from Alexander Polakov.
while I'm unsure of the final look of _NET_WM_STATE, there's no reason to delay this support.
Diffstat (limited to 'app')
-rw-r--r--app/cwm/calmwm.h9
-rw-r--r--app/cwm/client.c7
-rw-r--r--app/cwm/xutil.c63
3 files changed, 76 insertions, 3 deletions
diff --git a/app/cwm/calmwm.h b/app/cwm/calmwm.h
index 0f5d3f3f4..e7f6d0ef0 100644
--- a/app/cwm/calmwm.h
+++ b/app/cwm/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.206 2013/05/20 20:21:04 okan Exp $
+ * $OpenBSD: calmwm.h,v 1.207 2013/05/20 21:13:58 okan Exp $
*/
#ifndef _CALMWM_H_
@@ -481,6 +481,9 @@ void xu_ewmh_net_desktop_names(struct screen_ctx *, char *,
int);
void xu_ewmh_net_wm_desktop(struct client_ctx *);
+Atom *xu_ewmh_get_net_wm_state(struct client_ctx *, int *);
+void xu_ewmh_set_net_wm_state(struct client_ctx *);
+void xu_ewmh_restore_net_wm_state(struct client_ctx *);
void u_exec(char *);
void u_spawn(char *);
@@ -534,6 +537,10 @@ enum {
_NET_WM_NAME,
_NET_WM_DESKTOP,
_NET_CLOSE_WINDOW,
+ _NET_WM_STATE,
+#define _NET_WM_STATES_NITEMS 2
+ _NET_WM_STATE_MAXIMIZED_VERT,
+ _NET_WM_STATE_MAXIMIZED_HORZ,
EWMH_NITEMS
};
struct atom_ctx {
diff --git a/app/cwm/client.c b/app/cwm/client.c
index 9fe7e08a0..ae4bb06f2 100644
--- a/app/cwm/client.c
+++ b/app/cwm/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.131 2013/05/19 23:09:59 okan Exp $
+ * $OpenBSD: client.c,v 1.132 2013/05/20 21:13:58 okan Exp $
*/
#include <sys/param.h>
@@ -133,6 +133,7 @@ client_init(Window win, struct screen_ctx *sc, int mapped)
xu_ewmh_net_client_list(sc);
client_wm_protocols(cc);
+ xu_ewmh_restore_net_wm_state(cc);
if (mapped)
group_autogroup(cc);
@@ -301,6 +302,7 @@ client_maximize(struct client_ctx *cc)
resize:
client_resize(cc, 0);
+ xu_ewmh_set_net_wm_state(cc);
}
void
@@ -341,6 +343,7 @@ client_vmaximize(struct client_ctx *cc)
resize:
client_resize(cc, 0);
+ xu_ewmh_set_net_wm_state(cc);
}
void
@@ -381,6 +384,7 @@ client_hmaximize(struct client_ctx *cc)
resize:
client_resize(cc, 0);
+ xu_ewmh_set_net_wm_state(cc);
}
void
@@ -389,6 +393,7 @@ client_resize(struct client_ctx *cc, int reset)
if (reset) {
cc->flags &= ~CLIENT_MAXIMIZED;
cc->bwidth = Conf.bwidth;
+ xu_ewmh_set_net_wm_state(cc);
}
client_draw_border(cc);
diff --git a/app/cwm/xutil.c b/app/cwm/xutil.c
index 85f2f39f2..727370220 100644
--- a/app/cwm/xutil.c
+++ b/app/cwm/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.64 2013/05/20 20:21:04 okan Exp $
+ * $OpenBSD: xutil.c,v 1.65 2013/05/20 21:13:58 okan Exp $
*/
#include <sys/param.h>
@@ -257,6 +257,9 @@ struct atom_ctx ewmh[EWMH_NITEMS] = {
{"_NET_WM_NAME", None},
{"_NET_WM_DESKTOP", None},
{"_NET_CLOSE_WINDOW", None},
+ {"_NET_WM_STATE", None},
+ {"_NET_WM_STATE_MAXIMIZED_VERT",None},
+ {"_NET_WM_STATE_MAXIMIZED_HORZ",None},
};
void
@@ -420,6 +423,64 @@ xu_ewmh_net_wm_desktop(struct client_ctx *cc)
XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&no, 1);
}
+Atom *
+xu_ewmh_get_net_wm_state(struct client_ctx *cc, int *n)
+{
+ Atom *state, *p = NULL;
+
+ if ((*n = xu_getprop(cc->win, ewmh[_NET_WM_STATE].atom, XA_ATOM, 64L,
+ (u_char **)&p)) <= 0)
+ return (NULL);
+
+ state = xmalloc(*n * sizeof(Atom));
+ memcpy(state, p, *n * sizeof(Atom));
+ XFree((char *)p);
+
+ return (state);
+}
+
+void
+xu_ewmh_restore_net_wm_state(struct client_ctx *cc)
+{
+ Atom *atoms;
+ int i, n;
+
+ atoms = xu_ewmh_get_net_wm_state(cc, &n);
+ for (i = 0; i < n; i++) {
+ if (atoms[i] == ewmh[_NET_WM_STATE_MAXIMIZED_HORZ].atom)
+ client_hmaximize(cc);
+ if (atoms[i] == ewmh[_NET_WM_STATE_MAXIMIZED_VERT].atom)
+ client_vmaximize(cc);
+ }
+ free(atoms);
+}
+
+void
+xu_ewmh_set_net_wm_state(struct client_ctx *cc)
+{
+ Atom *atoms, *oatoms;
+ int n, i, j;
+
+ oatoms = xu_ewmh_get_net_wm_state(cc, &n);
+ atoms = xmalloc((n + _NET_WM_STATES_NITEMS) * sizeof(Atom));
+ for (i = j = 0; i < n; i++) {
+ if (oatoms[i] != ewmh[_NET_WM_STATE_MAXIMIZED_HORZ].atom &&
+ oatoms[i] != ewmh[_NET_WM_STATE_MAXIMIZED_VERT].atom)
+ atoms[j++] = oatoms[i];
+ }
+ free(oatoms);
+ if (cc->flags & CLIENT_HMAXIMIZED)
+ atoms[j++] = ewmh[_NET_WM_STATE_MAXIMIZED_HORZ].atom;
+ if (cc->flags & CLIENT_VMAXIMIZED)
+ atoms[j++] = ewmh[_NET_WM_STATE_MAXIMIZED_VERT].atom;
+ if (j > 0)
+ XChangeProperty(X_Dpy, cc->win, ewmh[_NET_WM_STATE].atom,
+ XA_ATOM, 32, PropModeReplace, (unsigned char *)atoms, j);
+ else
+ XDeleteProperty(X_Dpy, cc->win, ewmh[_NET_WM_STATE].atom);
+ free(atoms);
+}
+
void
xu_xorcolor(XftColor a, XftColor b, XftColor *r)
{