replaced getproto with a saner function, now old-school artifacts of WM times in the early 90s completely disappeared, no punned pointer warning anymore ;)
This commit is contained in:
		
							parent
							
								
									44ef3f5a07
								
							
						
					
					
						commit
						28ffff801b
					
				
							
								
								
									
										18
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								client.c
									
									
									
									
									
								
							| @ -120,11 +120,26 @@ getclient(Window w) { | |||||||
| 	return NULL; | 	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 | void | ||||||
| killclient(Arg *arg) { | killclient(Arg *arg) { | ||||||
| 	if(!sel) | 	if(!sel) | ||||||
| 		return; | 		return; | ||||||
| 	if(sel->proto & PROTODELWIN) | 	if(isprotodel(sel)) | ||||||
| 		sendevent(sel->win, wmatom[WMProtocols], wmatom[WMDelete]); | 		sendevent(sel->win, wmatom[WMProtocols], wmatom[WMDelete]); | ||||||
| 	else | 	else | ||||||
| 		XKillClient(dpy, sel->win); | 		XKillClient(dpy, sel->win); | ||||||
| @ -159,7 +174,6 @@ manage(Window w, XWindowAttributes *wa) { | |||||||
| 			c->y = way; | 			c->y = way; | ||||||
| 	} | 	} | ||||||
| 	updatesizehints(c); | 	updatesizehints(c); | ||||||
| 	c->proto = getproto(c->win); |  | ||||||
| 	XSelectInput(dpy, c->win, | 	XSelectInput(dpy, c->win, | ||||||
| 		StructureNotifyMask | PropertyChangeMask | EnterWindowMask); | 		StructureNotifyMask | PropertyChangeMask | EnterWindowMask); | ||||||
| 	XGetTransientForHint(dpy, c->win, &trans); | 	XGetTransientForHint(dpy, c->win, &trans); | ||||||
|  | |||||||
| @ -17,8 +17,8 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 | |||||||
| # flags
 | # flags
 | ||||||
| CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" | CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" | ||||||
| LDFLAGS = ${LIBS} | LDFLAGS = ${LIBS} | ||||||
| #CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
 | CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" | ||||||
| #LDFLAGS = -g ${LIBS}
 | LDFLAGS = -g ${LIBS} | ||||||
| 
 | 
 | ||||||
| # Solaris
 | # Solaris
 | ||||||
| #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
 | #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
 | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								dwm.h
									
									
									
									
									
								
							| @ -36,8 +36,6 @@ | |||||||
| 
 | 
 | ||||||
| /* mask shorthands, used in event.c and client.c */ | /* mask shorthands, used in event.c and client.c */ | ||||||
| #define BUTTONMASK		(ButtonPressMask | ButtonReleaseMask) | #define BUTTONMASK		(ButtonPressMask | ButtonReleaseMask) | ||||||
| /* other stuff used in different places */ |  | ||||||
| #define PROTODELWIN		1 |  | ||||||
| 
 | 
 | ||||||
| enum { NetSupported, NetWMName, NetLast };		/* EWMH atoms */ | enum { NetSupported, NetWMName, NetLast };		/* EWMH atoms */ | ||||||
| enum { WMProtocols, WMDelete, WMState, WMLast };	/* default atoms */ | enum { WMProtocols, WMDelete, WMState, WMLast };	/* default atoms */ | ||||||
| @ -69,14 +67,13 @@ typedef struct { | |||||||
| typedef struct Client Client; | typedef struct Client Client; | ||||||
| struct Client { | struct Client { | ||||||
| 	char name[256]; | 	char name[256]; | ||||||
| 	int proto; |  | ||||||
| 	int x, y, w, h; | 	int x, y, w, h; | ||||||
| 	int rx, ry, rw, rh; /* revert geometry */ | 	int rx, ry, rw, rh; /* revert geometry */ | ||||||
| 	int basew, baseh, incw, inch, maxw, maxh, minw, minh; | 	int basew, baseh, incw, inch, maxw, maxh, minw, minh; | ||||||
| 	int minax, minay, maxax, maxay; | 	int minax, minay, maxax, maxay; | ||||||
| 	long flags;  | 	long flags;  | ||||||
| 	unsigned int border; | 	unsigned int border; | ||||||
| 	Bool isfloat, isfixed, ismax; | 	Bool isfixed, isfloat, ismax; | ||||||
| 	Bool *tags; | 	Bool *tags; | ||||||
| 	Client *next; | 	Client *next; | ||||||
| 	Client *prev; | 	Client *prev; | ||||||
| @ -105,6 +102,7 @@ extern Window root, barwin; | |||||||
| extern void configure(Client *c);		/* send synthetic configure event */ | extern void configure(Client *c);		/* send synthetic configure event */ | ||||||
| extern void focus(Client *c);			/* focus c, c may be NULL */ | extern void focus(Client *c);			/* focus c, c may be NULL */ | ||||||
| extern Client *getclient(Window w);		/* return client of w */ | 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 killclient(Arg *arg);		/* kill c nicely */ | ||||||
| extern void manage(Window w, XWindowAttributes *wa);	/* manage new client */ | extern void manage(Window w, XWindowAttributes *wa);	/* manage new client */ | ||||||
| extern void resize(Client *c, Bool sizehints);	/* resize c*/ | 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 */ | extern void procevent(void);			/* process pending X events */ | ||||||
| 
 | 
 | ||||||
| /* main.c */ | /* 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 quit(Arg *arg);			/* quit dwm nicely */ | ||||||
| extern void sendevent(Window w, Atom a, long value);	/* send synthetic event to w */ | 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 */ | extern int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */ | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								event.c
									
									
									
									
									
								
							| @ -308,10 +308,6 @@ propertynotify(XEvent *e) { | |||||||
| 	if(ev->state == PropertyDelete) | 	if(ev->state == PropertyDelete) | ||||||
| 		return; /* ignore */ | 		return; /* ignore */ | ||||||
| 	if((c = getclient(ev->window))) { | 	if((c = getclient(ev->window))) { | ||||||
| 		if(ev->atom == wmatom[WMProtocols]) { |  | ||||||
| 			c->proto = getproto(c->win); |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 		switch (ev->atom) { | 		switch (ev->atom) { | ||||||
| 			default: break; | 			default: break; | ||||||
| 			case XA_WM_TRANSIENT_FOR: | 			case XA_WM_TRANSIENT_FOR: | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								main.c
									
									
									
									
									
								
							| @ -172,24 +172,6 @@ xerrorstart(Display *dsply, XErrorEvent *ee) { | |||||||
| 
 | 
 | ||||||
| /* extern */ | /* 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 | void | ||||||
| sendevent(Window w, Atom a, long value) { | sendevent(Window w, Atom a, long value) { | ||||||
| 	XEvent e; | 	XEvent e; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Anselm R. Garbe
						Anselm R. Garbe