| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -215,6 +215,7 @@ static Bool sendevent(Client *c, Atom proto); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void sendmon(Client *c, Monitor *m); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void setclientstate(Client *c, long state); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void setfocus(Client *c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void setfullscreen(Client *c, Bool fullscreen); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void setlayout(const Arg *arg); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void setmfact(const Arg *arg); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void setup(void); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -531,31 +532,10 @@ clientmessage(XEvent *e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!c) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(cme->data.l[0] && !c->isfullscreen) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								                PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->isfullscreen = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->oldstate = c->isfloating; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->oldbw = c->bw; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->bw = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->isfloating = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XRaiseWindow(dpy, c->win); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								                PropModeReplace, (unsigned char*)0, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->isfullscreen = False; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->isfloating = c->oldstate; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->bw = c->oldbw; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->x = c->oldx; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->y = c->oldy; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->w = c->oldw; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->h = c->oldh; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								resizeclient(c, c->x, c->y, c->w, c->h); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								arrange(c->mon); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(cme->message_type == netatom[NetWMState]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(cme->data.l[1] == netatom[NetWMFullscreen] || cme->data.l[2] == netatom[NetWMFullscreen]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD    */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								              || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else if(cme->message_type == netatom[NetActiveWindow]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(!ISVISIBLE(c)) { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -928,6 +908,21 @@ focusstack(const Arg *arg) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Atom | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					getatomprop(Client *c, Atom prop) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int di; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned long dl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned char *p = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Atom da, atom = None; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						                      &da, &di, &dl, &dl, &p) == Success && p) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							atom = *(Atom *)p; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFree(p); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return atom; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					unsigned long | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					getcolor(const char *colstr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Colormap cmap = DefaultColormap(dpy, screen); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1133,23 +1128,17 @@ manage(Window w, XWindowAttributes *wa) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->w = c->oldw = wa->width; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->h = c->oldh = wa->height; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->oldbw = wa->border_width; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(c->w == c->mon->mw && c->h == c->mon->mh) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->isfloating = True; // regression with flash, XXXX | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->x = c->mon->mx; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->y = c->mon->my; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->bw = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(c->x + WIDTH(c) > c->mon->mx + c->mon->mw) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->x = c->mon->mx + c->mon->mw - WIDTH(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(c->y + HEIGHT(c) > c->mon->my + c->mon->mh) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->y = c->mon->my + c->mon->mh - HEIGHT(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->x = MAX(c->x, c->mon->mx); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							/* only fix client y-offset, if the client center might cover the bar */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							           && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->bw = borderpx; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(c->x + WIDTH(c) > c->mon->mx + c->mon->mw) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->x = c->mon->mx + c->mon->mw - WIDTH(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(c->y + HEIGHT(c) > c->mon->my + c->mon->mh) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->y = c->mon->my + c->mon->mh - HEIGHT(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->x = MAX(c->x, c->mon->mx); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* only fix client y-offset, if the client center might cover the bar */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						           && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						c->bw = borderpx; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						wc.border_width = c->bw; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XConfigureWindow(dpy, w, CWBorderWidth, &wc); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XSetWindowBorder(dpy, w, dc.norm[ColBorder]); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1515,6 +1504,34 @@ setfocus(Client *c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						sendevent(c, wmatom[WMTakeFocus]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					setfullscreen(Client *c, Bool fullscreen) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(fullscreen) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							                PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->isfullscreen = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->oldstate = c->isfloating; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->oldbw = c->bw; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->bw = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->isfloating = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XRaiseWindow(dpy, c->win); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							                PropModeReplace, (unsigned char*)0, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->isfullscreen = False; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->isfloating = c->oldstate; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->bw = c->oldbw; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->x = c->oldx; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->y = c->oldy; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->w = c->oldw; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->h = c->oldh; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							resizeclient(c, c->x, c->y, c->w, c->h); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							arrange(c->mon); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					setlayout(const Arg *arg) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1974,22 +1991,15 @@ updatestatus(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					updatewindowtype(Client *c) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Atom wtype, real; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int format; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned long n, extra; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned char *p = NULL; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					updatewindowtype(Client *c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Atom state = getatomprop(c, netatom[NetWMState]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Atom wtype = getatomprop(c, netatom[NetWMWindowType]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(XGetWindowProperty(dpy, c->win, netatom[NetWMWindowType], 0L, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						                      sizeof(Atom), False, XA_ATOM, &real, &format, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						                      &n, &extra, (unsigned char **)&p) == Success && p) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							wtype = *(Atom *)p; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XFree(p); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(state == netatom[NetWMFullscreen]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							setfullscreen(c, True); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(wtype == netatom[NetWMWindowTypeDialog]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->isfloating = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(wtype == netatom[NetWMWindowTypeDialog]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							c->isfloating = True; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |