|  |  | @ -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: | 
			
		
	
	
		
			
				
					|  |  | 
 |