use XGetWMProtocols and simplify WM_PROTOCOL handling

This commit is contained in:
okan 2013-05-19 17:02:04 +00:00
parent 3253f5a4a1
commit 01bfdd7b42
2 changed files with 20 additions and 20 deletions

View File

@ -121,6 +121,11 @@ struct winname {
};
TAILQ_HEAD(winname_q, winname);
enum wm_protocols {
_WM_DELETE_WINDOW = 0x0001,
_WM_TAKE_FOCUS = 0x0002,
};
struct client_ctx {
TAILQ_ENTRY(client_ctx) entry;
TAILQ_ENTRY(client_ctx) group_entry;
@ -147,9 +152,7 @@ struct client_ctx {
int x; /* x position */
int y; /* y position */
} ptr;
#define CLIENT_PROTO_DELETE 0x0001
#define CLIENT_PROTO_TAKEFOCUS 0x0002
int xproto;
enum wm_protocols xproto;
#define CLIENT_HIDDEN 0x0001
#define CLIENT_IGNORE 0x0002
#define CLIENT_VMAXIMIZED 0x0004

View File

@ -36,7 +36,7 @@ static struct client_ctx *client_mruprev(struct client_ctx *);
static void client_mtf(struct client_ctx *);
static void client_none(struct screen_ctx *);
static void client_placecalc(struct client_ctx *);
static void client_update(struct client_ctx *);
static void client_wm_protocols(struct client_ctx *);
static void client_getmwmhints(struct client_ctx *);
static int client_inbound(struct client_ctx *, int, int);
@ -132,7 +132,7 @@ client_init(Window win, struct screen_ctx *sc, int mapped)
xu_ewmh_net_client_list(sc);
client_update(cc);
client_wm_protocols(cc);
if (mapped)
group_autogroup(cc);
@ -497,29 +497,26 @@ client_draw_border(struct client_ctx *cc)
}
static void
client_update(struct client_ctx *cc)
client_wm_protocols(struct client_ctx *cc)
{
Atom *p;
int i;
long n;
int i, j;
if ((n = xu_getprop(cc->win, cwmh[WM_PROTOCOLS].atom,
XA_ATOM, 20L, (u_char **)&p)) <= 0)
return;
for (i = 0; i < n; i++)
if (p[i] == cwmh[WM_DELETE_WINDOW].atom)
cc->xproto |= CLIENT_PROTO_DELETE;
else if (p[i] == cwmh[WM_TAKE_FOCUS].atom)
cc->xproto |= CLIENT_PROTO_TAKEFOCUS;
XFree(p);
if (XGetWMProtocols(X_Dpy, cc->win, &p, &j)) {
for (i = 0; i < j; i++) {
if (p[i] == cwmh[WM_DELETE_WINDOW].atom)
cc->xproto |= _WM_DELETE_WINDOW;
else if (p[i] == cwmh[WM_TAKE_FOCUS].atom)
cc->xproto |= _WM_TAKE_FOCUS;
}
XFree(p);
}
}
void
client_send_delete(struct client_ctx *cc)
{
if (cc->xproto & CLIENT_PROTO_DELETE)
if (cc->xproto & _WM_DELETE_WINDOW)
xu_sendmsg(cc->win,
cwmh[WM_PROTOCOLS].atom, cwmh[WM_DELETE_WINDOW].atom);
else