about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAnselm R. Garbe <arg@suckless.org>2007-02-07 12:37:06 +0100
committerAnselm R. Garbe <arg@suckless.org>2007-02-07 12:37:06 +0100
commit28ffff801bb0137ec3fe4093afc4fb29784b17ec (patch)
tree2072e2465fb0b3cbf4f3241a096de99752e79be1
parent44ef3f5a07753ecaeacc2fb180e90bf4479ab975 (diff)
downloaddwm-28ffff801bb0137ec3fe4093afc4fb29784b17ec.tar.gz
replaced getproto with a saner function, now old-school artifacts of WM times in the early 90s completely disappeared, no punned pointer warning anymore ;)
-rw-r--r--client.c18
-rw-r--r--config.mk4
-rw-r--r--dwm.h7
-rw-r--r--event.c4
-rw-r--r--main.c18
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;