use XGetWMProtocols and simplify WM_PROTOCOL handling
This commit is contained in:
parent
54d74a2ed2
commit
f67063c034
@ -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.199 2013/05/14 12:35:56 okan Exp $
|
||||
* $OpenBSD: calmwm.h,v 1.200 2013/05/19 17:02:04 okan Exp $
|
||||
*/
|
||||
|
||||
#ifndef _CALMWM_H_
|
||||
@ -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
|
||||
|
@ -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.129 2013/05/11 22:01:07 okan Exp $
|
||||
* $OpenBSD: client.c,v 1.130 2013/05/19 17:02:04 okan Exp $
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user