From 28ffff801bb0137ec3fe4093afc4fb29784b17ec Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Wed, 7 Feb 2007 12:37:06 +0100 Subject: [PATCH] replaced getproto with a saner function, now old-school artifacts of WM times in the early 90s completely disappeared, no punned pointer warning anymore ;) --- client.c | 18 ++++++++++++++++-- config.mk | 4 ++-- dwm.h | 7 ++----- event.c | 4 ---- main.c | 18 ------------------ 5 files changed, 20 insertions(+), 31 deletions(-) diff --git a/client.c b/client.c index 50e8a94..e37b9e6 100644 --- a/client.c +++ b/client.c @@ -120,11 +120,26 @@ getclient(Window w) { return NULL; } +Bool +isprotodel(Client *c) { + int i, n; + Atom *protocols; + Bool ret = False; + + if(XGetWMProtocols(dpy, c->win, &protocols, &n)) { + for(i = 0; !ret && i < n; i++) + if(protocols[i] == wmatom[WMDelete]) + ret = True; + XFree(protocols); + } + return ret; +} + void killclient(Arg *arg) { if(!sel) return; - if(sel->proto & PROTODELWIN) + if(isprotodel(sel)) sendevent(sel->win, wmatom[WMProtocols], wmatom[WMDelete]); else XKillClient(dpy, sel->win); @@ -159,7 +174,6 @@ manage(Window w, XWindowAttributes *wa) { c->y = way; } updatesizehints(c); - c->proto = getproto(c->win); XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | EnterWindowMask); XGetTransientForHint(dpy, c->win, &trans); diff --git a/config.mk b/config.mk index 338632d..2e5630a 100644 --- a/config.mk +++ b/config.mk @@ -17,8 +17,8 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 # flags CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" LDFLAGS = ${LIBS} -#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = -g ${LIBS} +CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" +LDFLAGS = -g ${LIBS} # Solaris #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" diff --git a/dwm.h b/dwm.h index a7053c5..674ab1e 100644 --- a/dwm.h +++ b/dwm.h @@ -36,8 +36,6 @@ /* mask shorthands, used in event.c and client.c */ #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) -/* other stuff used in different places */ -#define PROTODELWIN 1 enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */ enum { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */ @@ -69,14 +67,13 @@ typedef struct { typedef struct Client Client; struct Client { char name[256]; - int proto; int x, y, w, h; int rx, ry, rw, rh; /* revert geometry */ int basew, baseh, incw, inch, maxw, maxh, minw, minh; int minax, minay, maxax, maxay; long flags; unsigned int border; - Bool isfloat, isfixed, ismax; + Bool isfixed, isfloat, ismax; Bool *tags; Client *next; Client *prev; @@ -105,6 +102,7 @@ extern Window root, barwin; extern void configure(Client *c); /* send synthetic configure event */ extern void focus(Client *c); /* focus c, c may be NULL */ extern Client *getclient(Window w); /* return client of w */ +extern Bool isprotodel(Client *c); /* returns True if c->win supports wmatom[WMDelete] */ extern void killclient(Arg *arg); /* kill c nicely */ extern void manage(Window w, XWindowAttributes *wa); /* manage new client */ extern void resize(Client *c, Bool sizehints); /* resize c*/ @@ -123,7 +121,6 @@ extern void grabkeys(void); /* grab all keys defined in config.h */ extern void procevent(void); /* process pending X events */ /* main.c */ -extern int getproto(Window w); /* return protocol mask of WMProtocols property of w */ extern void quit(Arg *arg); /* quit dwm nicely */ extern void sendevent(Window w, Atom a, long value); /* send synthetic event to w */ extern int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */ diff --git a/event.c b/event.c index 418e986..c66aa72 100644 --- a/event.c +++ b/event.c @@ -308,10 +308,6 @@ propertynotify(XEvent *e) { if(ev->state == PropertyDelete) return; /* ignore */ if((c = getclient(ev->window))) { - if(ev->atom == wmatom[WMProtocols]) { - c->proto = getproto(c->win); - return; - } switch (ev->atom) { default: break; case XA_WM_TRANSIENT_FOR: diff --git a/main.c b/main.c index 97fdbaf..da95d95 100644 --- a/main.c +++ b/main.c @@ -172,24 +172,6 @@ xerrorstart(Display *dsply, XErrorEvent *ee) { /* extern */ -int -getproto(Window w) { - int i, format, protos, status; - unsigned long extra, res; - Atom *protocols, real; - - protos = 0; - status = XGetWindowProperty(dpy, w, wmatom[WMProtocols], 0L, 20L, False, - XA_ATOM, &real, &format, &res, &extra, (unsigned char **)&protocols); - if(status != Success || protocols == 0) - return protos; - for(i = 0; i < res; i++) - if(protocols[i] == wmatom[WMDelete]) - protos |= PROTODELWIN; - free(protocols); - return protos; -} - void sendevent(Window w, Atom a, long value) { XEvent e;