| 
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -16,6 +16,44 @@ | 
															
														
														
													
														
															
																 | 
																 | 
																#define ButtonMask      (ButtonPressMask | ButtonReleaseMask) | 
																 | 
																 | 
																#define ButtonMask      (ButtonPressMask | ButtonReleaseMask) | 
															
														
														
													
														
															
																 | 
																 | 
																#define MouseMask       (ButtonMask | PointerMotionMask) | 
																 | 
																 | 
																#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 */ | 
																 | 
																 | 
																/* local functions */ | 
															
														
														
													
														
															
																 | 
																 | 
																static void buttonpress(XEvent *e); | 
																 | 
																 | 
																static void buttonpress(XEvent *e); | 
															
														
														
													
														
															
																 | 
																 | 
																static void configurerequest(XEvent *e); | 
																 | 
																 | 
																static void configurerequest(XEvent *e); | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -23,6 +61,7 @@ static void destroynotify(XEvent *e); | 
															
														
														
													
														
															
																 | 
																 | 
																static void enternotify(XEvent *e); | 
																 | 
																 | 
																static void enternotify(XEvent *e); | 
															
														
														
													
														
															
																 | 
																 | 
																static void leavenotify(XEvent *e); | 
																 | 
																 | 
																static void leavenotify(XEvent *e); | 
															
														
														
													
														
															
																 | 
																 | 
																static void expose(XEvent *e); | 
																 | 
																 | 
																static void expose(XEvent *e); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static void keypress(XEvent *e); | 
															
														
														
													
														
															
																 | 
																 | 
																static void maprequest(XEvent *e); | 
																 | 
																 | 
																static void maprequest(XEvent *e); | 
															
														
														
													
														
															
																 | 
																 | 
																static void propertynotify(XEvent *e); | 
																 | 
																 | 
																static void propertynotify(XEvent *e); | 
															
														
														
													
														
															
																 | 
																 | 
																static void unmapnotify(XEvent *e); | 
																 | 
																 | 
																static void unmapnotify(XEvent *e); | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -40,8 +79,40 @@ void (*handler[LASTEvent]) (XEvent *) = { | 
															
														
														
													
														
															
																 | 
																 | 
																	[UnmapNotify] = unmapnotify | 
																 | 
																 | 
																	[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 | 
																 | 
																 | 
																static void | 
															
														
														
													
														
															
																 | 
																 | 
																mresize(Client *c) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																resizemouse(Client *c) | 
															
														
														
													
														
															
																 | 
																 | 
																{ | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																	XEvent ev; | 
																 | 
																 | 
																	XEvent ev; | 
															
														
														
													
														
															
																 | 
																 | 
																	int ocx, ocy; | 
																 | 
																 | 
																	int ocx, ocy; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -75,7 +146,7 @@ mresize(Client *c) | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																static void | 
																 | 
																 | 
																static void | 
															
														
														
													
														
															
																 | 
																 | 
																mmove(Client *c) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																movemouse(Client *c) | 
															
														
														
													
														
															
																 | 
																 | 
																{ | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																	XEvent ev; | 
																 | 
																 | 
																	XEvent ev; | 
															
														
														
													
														
															
																 | 
																 | 
																	int x1, y1, ocx, ocy, di; | 
																 | 
																 | 
																	int x1, y1, ocx, ocy, di; | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -117,7 +188,7 @@ buttonpress(XEvent *e) | 
															
														
														
													
														
															
																 | 
																 | 
																	Client *c; | 
																 | 
																 | 
																	Client *c; | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																	if(barwin == ev->window) { | 
																 | 
																 | 
																	if(barwin == ev->window) { | 
															
														
														
													
														
															
																 | 
																 | 
																		x = (arrange == floating) ? textw("~") : 0; | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		x = (arrange == dofloat) ? textw("~") : 0; | 
															
														
														
													
														
															
																 | 
																 | 
																		for(a.i = 0; a.i < TLast; a.i++) { | 
																 | 
																 | 
																		for(a.i = 0; a.i < TLast; a.i++) { | 
															
														
														
													
														
															
																 | 
																 | 
																			x += textw(tags[a.i]); | 
																 | 
																 | 
																			x += textw(tags[a.i]); | 
															
														
														
													
														
															
																 | 
																 | 
																			if(ev->x < x) { | 
																 | 
																 | 
																			if(ev->x < x) { | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																			
																		
																	
																 | 
																@ -127,20 +198,20 @@ buttonpress(XEvent *e) | 
															
														
														
													
														
															
																 | 
																 | 
																		} | 
																 | 
																 | 
																		} | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																	} | 
															
														
														
													
														
															
																 | 
																 | 
																	else if((c = getclient(ev->window))) { | 
																 | 
																 | 
																	else if((c = getclient(ev->window))) { | 
															
														
														
													
														
															
																 | 
																 | 
																		if(arrange == tiling && !c->floating) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		if(arrange == dotile && !c->dofloat) | 
															
														
														
													
														
															
																 | 
																 | 
																			return; | 
																 | 
																 | 
																			return; | 
															
														
														
													
														
															
																 | 
																 | 
																		higher(c); | 
																 | 
																 | 
																		higher(c); | 
															
														
														
													
														
															
																 | 
																 | 
																		switch(ev->button) { | 
																 | 
																 | 
																		switch(ev->button) { | 
															
														
														
													
														
															
																 | 
																 | 
																		default: | 
																 | 
																 | 
																		default: | 
															
														
														
													
														
															
																 | 
																 | 
																			break; | 
																 | 
																 | 
																			break; | 
															
														
														
													
														
															
																 | 
																 | 
																		case Button1: | 
																 | 
																 | 
																		case Button1: | 
															
														
														
													
														
															
																 | 
																 | 
																			mmove(c); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			movemouse(c); | 
															
														
														
													
														
															
																 | 
																 | 
																			break; | 
																 | 
																 | 
																			break; | 
															
														
														
													
														
															
																 | 
																 | 
																		case Button2: | 
																 | 
																 | 
																		case Button2: | 
															
														
														
													
														
															
																 | 
																 | 
																			lower(c); | 
																 | 
																 | 
																			lower(c); | 
															
														
														
													
														
															
																 | 
																 | 
																			break; | 
																 | 
																 | 
																			break; | 
															
														
														
													
														
															
																 | 
																 | 
																		case Button3: | 
																 | 
																 | 
																		case Button3: | 
															
														
														
													
														
															
																 | 
																 | 
																			mresize(c); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			resizemouse(c); | 
															
														
														
													
														
															
																 | 
																 | 
																			break; | 
																 | 
																 | 
																			break; | 
															
														
														
													
														
															
																 | 
																 | 
																		} | 
																 | 
																 | 
																		} | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																	} | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -226,7 +297,7 @@ expose(XEvent *e) | 
															
														
														
													
														
															
																 | 
																 | 
																	if(ev->count == 0) { | 
																 | 
																 | 
																	if(ev->count == 0) { | 
															
														
														
													
														
															
																 | 
																 | 
																		if(barwin == ev->window) | 
																 | 
																 | 
																		if(barwin == ev->window) | 
															
														
														
													
														
															
																 | 
																 | 
																			drawstatus(); | 
																 | 
																 | 
																			drawstatus(); | 
															
														
														
													
														
															
																 | 
																 | 
																		else if((c = gettitle(ev->window))) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																		else if((c = getctitle(ev->window))) | 
															
														
														
													
														
															
																 | 
																 | 
																			drawtitle(c); | 
																 | 
																 | 
																			drawtitle(c); | 
															
														
														
													
														
															
																 | 
																 | 
																	} | 
																 | 
																 | 
																	} | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -262,14 +333,14 @@ propertynotify(XEvent *e) | 
															
														
														
													
														
															
																 | 
																 | 
																
 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																	if((c = getclient(ev->window))) { | 
																 | 
																 | 
																	if((c = getclient(ev->window))) { | 
															
														
														
													
														
															
																 | 
																 | 
																		if(ev->atom == wm_atom[WMProtocols]) { | 
																 | 
																 | 
																		if(ev->atom == wm_atom[WMProtocols]) { | 
															
														
														
													
														
															
																 | 
																 | 
																			c->proto = proto(c->win); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			c->proto = getproto(c->win); | 
															
														
														
													
														
															
																 | 
																 | 
																			return; | 
																 | 
																 | 
																			return; | 
															
														
														
													
														
															
																 | 
																 | 
																		} | 
																 | 
																 | 
																		} | 
															
														
														
													
														
															
																 | 
																 | 
																		switch (ev->atom) { | 
																 | 
																 | 
																		switch (ev->atom) { | 
															
														
														
													
														
															
																 | 
																 | 
																			default: break; | 
																 | 
																 | 
																			default: break; | 
															
														
														
													
														
															
																 | 
																 | 
																			case XA_WM_TRANSIENT_FOR: | 
																 | 
																 | 
																			case XA_WM_TRANSIENT_FOR: | 
															
														
														
													
														
															
																 | 
																 | 
																				XGetTransientForHint(dpy, c->win, &trans); | 
																 | 
																 | 
																				XGetTransientForHint(dpy, c->win, &trans); | 
															
														
														
													
														
															
																 | 
																 | 
																				if(!c->floating && (c->floating = (trans != 0))) | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																				if(!c->dofloat && (c->dofloat = (trans != 0))) | 
															
														
														
													
														
															
																 | 
																 | 
																					arrange(NULL); | 
																 | 
																 | 
																					arrange(NULL); | 
															
														
														
													
														
															
																 | 
																 | 
																				break; | 
																 | 
																 | 
																				break; | 
															
														
														
													
														
															
																 | 
																 | 
																			case XA_WM_NORMAL_HINTS: | 
																 | 
																 | 
																			case XA_WM_NORMAL_HINTS: | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																	
																 | 
																
  |