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.
This commit is contained in:
parent
bd38e60d03
commit
0667dd4edd
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user