handle _NET_WM_STATE ClientMessage; from Alexander Polakov.

This commit is contained in:
okan 2013-05-21 00:29:20 +00:00
parent c2042cd523
commit 421bf22ac7
3 changed files with 48 additions and 0 deletions

View File

@ -482,6 +482,8 @@ void xu_ewmh_net_desktop_names(struct screen_ctx *, char *,
void xu_ewmh_net_wm_desktop(struct client_ctx *);
Atom *xu_ewmh_get_net_wm_state(struct client_ctx *, int *);
void xu_ewmh_handle_net_wm_state_msg(struct client_ctx *,
int, Atom , Atom);
void xu_ewmh_set_net_wm_state(struct client_ctx *);
void xu_ewmh_restore_net_wm_state(struct client_ctx *);
@ -543,6 +545,11 @@ enum {
_NET_WM_STATE_MAXIMIZED_HORZ,
EWMH_NITEMS
};
enum {
_NET_WM_STATE_REMOVE,
_NET_WM_STATE_ADD,
_NET_WM_STATE_TOGGLE
};
struct atom_ctx {
char *name;
Atom atom;

View File

@ -359,6 +359,10 @@ xev_handle_clientmessage(XEvent *ee)
client_ptrsave(old_cc);
client_ptrwarp(cc);
}
if (e->message_type == ewmh[_NET_WM_STATE].atom &&
e->format == 32)
xu_ewmh_handle_net_wm_state_msg(cc,
e->data.l[0], e->data.l[1], e->data.l[2]);
}
static void

37
xutil.c
View File

@ -439,6 +439,43 @@ xu_ewmh_get_net_wm_state(struct client_ctx *cc, int *n)
return (state);
}
void
xu_ewmh_handle_net_wm_state_msg(struct client_ctx *cc, int action,
Atom first, Atom second)
{
int i;
static struct handlers {
int atom;
int property;
void (*toggle)(struct client_ctx *);
} handlers[] = {
{ _NET_WM_STATE_MAXIMIZED_VERT,
CLIENT_VMAXIMIZED,
client_vmaximize },
{ _NET_WM_STATE_MAXIMIZED_HORZ,
CLIENT_HMAXIMIZED,
client_hmaximize },
};
for (i = 0; i < nitems(handlers); i++) {
if (first != ewmh[handlers[i].atom].atom &&
second != ewmh[handlers[i].atom].atom)
continue;
switch (action) {
case _NET_WM_STATE_ADD:
if ((cc->flags & handlers[i].property) == 0)
handlers[i].toggle(cc);
break;
case _NET_WM_STATE_REMOVE:
if (cc->flags & handlers[i].property)
handlers[i].toggle(cc);
break;
case _NET_WM_STATE_TOGGLE:
handlers[i].toggle(cc);
}
}
}
void
xu_ewmh_restore_net_wm_state(struct client_ctx *cc)
{