diff options
author | Okan Demirmen <okan@cvs.openbsd.org> | 2013-05-20 21:13:59 +0000 |
---|---|---|
committer | Okan Demirmen <okan@cvs.openbsd.org> | 2013-05-20 21:13:59 +0000 |
commit | 6c64852054082a58f12e38422fa881571739ae81 (patch) | |
tree | b52e6f1615bbc4565d67ef3e645ae1acb432d68d /app | |
parent | 403863e66b5a7bc0e2f9286e2d73d69bb5132104 (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.h | 9 | ||||
-rw-r--r-- | app/cwm/client.c | 7 | ||||
-rw-r--r-- | app/cwm/xutil.c | 63 |
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) { |