diff options
| -rw-r--r-- | client.c | 18 | ||||
| -rw-r--r-- | config.mk | 4 | ||||
| -rw-r--r-- | dwm.h | 7 | ||||
| -rw-r--r-- | event.c | 4 | ||||
| -rw-r--r-- | main.c | 18 | 
5 files changed, 20 insertions, 31 deletions
| @@ -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); @@ -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}\" @@ -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 */ @@ -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: @@ -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; | 
