| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -16,6 +16,44 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#define ButtonMask      (ButtonPressMask | ButtonReleaseMask) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#define MouseMask       (ButtonMask | PointerMotionMask) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/********** CUSTOMIZE **********/ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					const char *term[] = {  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						"urxvtc", "-tr", "+sb", "-bg", "black", "-fg", "white", "-fn", | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						"-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*",NULL | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					const char *browse[] = { "firefox", NULL }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					const char *xlock[] = { "xlock", NULL }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Key key[] = { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* modifier				key			function	arguments */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask,				XK_Return,	zoom,		{ 0 } }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask,				XK_k,		focusprev,		{ 0 } }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask,				XK_j,		focusnext,		{ 0 } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask,				XK_m,		maximize,		{ 0 } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask,				XK_0,		view,		{ .i = Tscratch } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask,				XK_1,		view,		{ .i = Tdev } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask,				XK_2,		view,		{ .i = Twww } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask,				XK_3,		view,		{ .i = Twork } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask,				XK_space,	dotile,		{ 0 } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_space,	dofloat,	{ 0 } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_0,		replacetag,		{ .i = Tscratch } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_1,		replacetag,		{ .i = Tdev } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_2,		replacetag,		{ .i = Twww } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_3,		replacetag,		{ .i = Twork } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_c,		killclient,		{ 0 } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_q,		quit,		{ 0 } }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_Return,	spawn,		{ .argv = term } }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_w,		spawn,		{ .argv = browse } }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ Mod1Mask|ShiftMask,	XK_l,		spawn,		{ .argv = xlock } }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ ControlMask,			XK_0,		appendtag,	{ .i = Tscratch } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ ControlMask,			XK_1,		appendtag,	{ .i = Tdev } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ ControlMask,			XK_2,		appendtag,	{ .i = Twww } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ ControlMask,			XK_3,		appendtag,	{ .i = Twork } },  | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/********** CUSTOMIZE **********/ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					/* local functions */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void buttonpress(XEvent *e); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void configurerequest(XEvent *e); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -23,6 +61,7 @@ static void destroynotify(XEvent *e); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void enternotify(XEvent *e); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void leavenotify(XEvent *e); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void expose(XEvent *e); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void keypress(XEvent *e); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void maprequest(XEvent *e); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void propertynotify(XEvent *e); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void unmapnotify(XEvent *e); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -40,8 +79,40 @@ void (*handler[LASTEvent]) (XEvent *) = { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						[UnmapNotify] = unmapnotify | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					grabkeys() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						KeyCode code; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < len; i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							code = XKeysymToKeycode(dpy, key[i].keysym); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XUngrabKey(dpy, code, key[i].mod, root); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							XGrabKey(dpy, code, key[i].mod, root, True, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									GrabModeAsync, GrabModeAsync); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					keypress(XEvent *e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XKeyEvent *ev = &e->xkey; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						unsigned int i; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						KeySym keysym; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(i = 0; i < len; i++) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if((keysym == key[i].keysym) && (key[i].mod == ev->state)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(key[i].func) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									key[i].func(&key[i].arg); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					mresize(Client *c) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					resizemouse(Client *c) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XEvent ev; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int ocx, ocy; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -75,7 +146,7 @@ mresize(Client *c) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					mmove(Client *c) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					movemouse(Client *c) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						XEvent ev; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int x1, y1, ocx, ocy, di; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -117,7 +188,7 @@ buttonpress(XEvent *e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Client *c; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(barwin == ev->window) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							x = (arrange == floating) ? textw("~") : 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							x = (arrange == dofloat) ? textw("~") : 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for(a.i = 0; a.i < TLast; a.i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								x += textw(tags[a.i]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if(ev->x < x) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -127,20 +198,20 @@ buttonpress(XEvent *e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else if((c = getclient(ev->window))) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(arrange == tiling && !c->floating) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(arrange == dotile && !c->dofloat) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							higher(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							switch(ev->button) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							default: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							case Button1: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								mmove(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								movemouse(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							case Button2: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								lower(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							case Button3: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								mresize(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								resizemouse(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -226,7 +297,7 @@ expose(XEvent *e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(ev->count == 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(barwin == ev->window) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								drawstatus(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							else if((c = gettitle(ev->window))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							else if((c = getctitle(ev->window))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								drawtitle(c); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -262,14 +333,14 @@ propertynotify(XEvent *e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if((c = getclient(ev->window))) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(ev->atom == wm_atom[WMProtocols]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->proto = proto(c->win); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								c->proto = getproto(c->win); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							switch (ev->atom) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								default: break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case XA_WM_TRANSIENT_FOR: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									XGetTransientForHint(dpy, c->win, &trans); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if(!c->floating && (c->floating = (trans != 0))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if(!c->dofloat && (c->dofloat = (trans != 0))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										arrange(NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								case XA_WM_NORMAL_HINTS: | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |