|  |  | @@ -156,6 +156,7 @@ static void clientmessage(XEvent *e); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void configure(Client *c); |  |  |  | static void configure(Client *c); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void configurenotify(XEvent *e); |  |  |  | static void configurenotify(XEvent *e); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void configurerequest(XEvent *e); |  |  |  | static void configurerequest(XEvent *e); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | static void copyvalidchars(char *text, char *rawtext); | 
			
		
	
		
		
			
				
					
					|  |  |  | static Monitor *createmon(void); |  |  |  | static Monitor *createmon(void); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void destroynotify(XEvent *e); |  |  |  | static void destroynotify(XEvent *e); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void detach(Client *c); |  |  |  | static void detach(Client *c); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -169,6 +170,8 @@ static void focus(Client *c); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void focusin(XEvent *e); |  |  |  | static void focusin(XEvent *e); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void focusmon(const Arg *arg); |  |  |  | static void focusmon(const Arg *arg); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void focusstack(const Arg *arg); |  |  |  | static void focusstack(const Arg *arg); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | static int getdwmblockspid(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | static Atom getatomprop(Client *c, Atom prop); | 
			
		
	
		
		
			
				
					
					|  |  |  | static int getrootptr(int *x, int *y); |  |  |  | static int getrootptr(int *x, int *y); | 
			
		
	
		
		
			
				
					
					|  |  |  | static long getstate(Window w); |  |  |  | static long getstate(Window w); | 
			
		
	
		
		
			
				
					
					|  |  |  | static int gettextprop(Window w, Atom atom, char *text, unsigned int size); |  |  |  | static int gettextprop(Window w, Atom atom, char *text, unsigned int size); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -205,6 +208,7 @@ static void setup(void); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void seturgent(Client *c, int urg); |  |  |  | static void seturgent(Client *c, int urg); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void showhide(Client *c); |  |  |  | static void showhide(Client *c); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void sigchld(int unused); |  |  |  | static void sigchld(int unused); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | static void sigdwmblocks(const Arg *arg); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void spawn(const Arg *arg); |  |  |  | static void spawn(const Arg *arg); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void tag(const Arg *arg); |  |  |  | static void tag(const Arg *arg); | 
			
		
	
		
		
			
				
					
					|  |  |  | static void tagmon(const Arg *arg); |  |  |  | static void tagmon(const Arg *arg); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -237,6 +241,9 @@ static void zoom(const Arg *arg); | 
			
		
	
		
		
			
				
					
					|  |  |  | /* variables */ |  |  |  | /* variables */ | 
			
		
	
		
		
			
				
					
					|  |  |  | static const char broken[] = "broken"; |  |  |  | static const char broken[] = "broken"; | 
			
		
	
		
		
			
				
					
					|  |  |  | static char stext[256]; |  |  |  | static char stext[256]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | static char rawstext[256]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | static int dwmblockssig; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | pid_t dwmblockspid = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  | static int screen; |  |  |  | static int screen; | 
			
		
	
		
		
			
				
					
					|  |  |  | static int sw, sh;           /* X display screen geometry width, height */ |  |  |  | static int sw, sh;           /* X display screen geometry width, height */ | 
			
		
	
		
		
			
				
					
					|  |  |  | static int bh, blw = 0;      /* bar geometry */ |  |  |  | static int bh, blw = 0;      /* bar geometry */ | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -439,9 +446,25 @@ buttonpress(XEvent *e) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			arg.ui = 1 << i; |  |  |  | 			arg.ui = 1 << i; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} else if (ev->x < x + blw) |  |  |  | 		} else if (ev->x < x + blw) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			click = ClkLtSymbol; |  |  |  | 			click = ClkLtSymbol; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		else if (ev->x > selmon->ww - TEXTW(stext)) |  |  |  | 		else if (ev->x > (x = selmon->ww - TEXTW(stext) + lrpad)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			click = ClkStatusText; |  |  |  | 			click = ClkStatusText; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		else |  |  |  | 			char *text = rawstext; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			int i = -1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			char ch; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			dwmblockssig = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			while (text[++i]) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				if ((unsigned char)text[i] < ' ') { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					ch = text[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					text[i] = '\0'; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					x += TEXTW(text) - lrpad; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					text[i] = ch; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					text += i+1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					i = -1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					if (x >= ev->x) break; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					dwmblockssig = ch; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} else | 
			
		
	
		
		
			
				
					
					|  |  |  | 			click = ClkWinTitle; |  |  |  | 			click = ClkWinTitle; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} else if ((c = wintoclient(ev->window))) { |  |  |  | 	} else if ((c = wintoclient(ev->window))) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		focus(c); |  |  |  | 		focus(c); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -627,6 +650,19 @@ configurerequest(XEvent *e) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	XSync(dpy, False); |  |  |  | 	XSync(dpy, False); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | copyvalidchars(char *text, char *rawtext) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	int i = -1, j = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	while(rawtext[++i]) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if ((unsigned char)rawtext[i] >= ' ') { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			text[j++] = rawtext[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	text[j] = '\0'; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | Monitor * |  |  |  | Monitor * | 
			
		
	
		
		
			
				
					
					|  |  |  | createmon(void) |  |  |  | createmon(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -695,7 +731,7 @@ dirtomon(int dir) | 
			
		
	
		
		
			
				
					
					|  |  |  | void |  |  |  | void | 
			
		
	
		
		
			
				
					
					|  |  |  | drawbar(Monitor *m) |  |  |  | drawbar(Monitor *m) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	int x, w, sw = 0; |  |  |  | 	int x, w, tw = 0; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	int boxs = drw->fonts->h / 9; |  |  |  | 	int boxs = drw->fonts->h / 9; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	int boxw = drw->fonts->h / 6 + 2; |  |  |  | 	int boxw = drw->fonts->h / 6 + 2; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	unsigned int i, occ = 0, urg = 0; |  |  |  | 	unsigned int i, occ = 0, urg = 0; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -704,8 +740,8 @@ drawbar(Monitor *m) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/* draw status first so it can be overdrawn by tags later */ |  |  |  | 	/* draw status first so it can be overdrawn by tags later */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (m == selmon) { /* status is only drawn on selected monitor */ |  |  |  | 	if (m == selmon) { /* status is only drawn on selected monitor */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		drw_setscheme(drw, scheme[SchemeNorm]); |  |  |  | 		drw_setscheme(drw, scheme[SchemeNorm]); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ |  |  |  | 		tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); |  |  |  | 		drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	for (c = m->clients; c; c = c->next) { |  |  |  | 	for (c = m->clients; c; c = c->next) { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -728,7 +764,7 @@ drawbar(Monitor *m) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	drw_setscheme(drw, scheme[SchemeNorm]); |  |  |  | 	drw_setscheme(drw, scheme[SchemeNorm]); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); |  |  |  | 	x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if ((w = m->ww - sw - x) > bh) { |  |  |  | 	if ((w = m->ww - tw - x) > bh) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		if (m->sel) { |  |  |  | 		if (m->sel) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); |  |  |  | 			drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); |  |  |  | 			drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -871,6 +907,18 @@ getatomprop(Client *c, Atom prop) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return atom; |  |  |  | 	return atom; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | int | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | getdwmblockspid() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	char buf[16]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	FILE *fp = popen("pidof -s dwmblocks", "r"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	fgets(buf, sizeof(buf), fp); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	pid_t pid = strtoul(buf, NULL, 10); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	pclose(fp); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	dwmblockspid = pid; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	return pid != 0 ? 0 : -1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | int |  |  |  | int | 
			
		
	
		
		
			
				
					
					|  |  |  | getrootptr(int *x, int *y) |  |  |  | getrootptr(int *x, int *y) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1520,7 +1568,7 @@ setmfact(const Arg *arg) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!arg || !selmon->lt[selmon->sellt]->arrange) |  |  |  | 	if (!arg || !selmon->lt[selmon->sellt]->arrange) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return; |  |  |  | 		return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; |  |  |  | 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (f < 0.1 || f > 0.9) |  |  |  | 	if (f < 0.05 || f > 0.95) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		return; |  |  |  | 		return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	selmon->mfact = f; |  |  |  | 	selmon->mfact = f; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	arrange(selmon); |  |  |  | 	arrange(selmon); | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1636,6 +1684,23 @@ sigchld(int unused) | 
			
		
	
		
		
			
				
					
					|  |  |  | 	while (0 < waitpid(-1, NULL, WNOHANG)); |  |  |  | 	while (0 < waitpid(-1, NULL, WNOHANG)); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | sigdwmblocks(const Arg *arg) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	union sigval sv; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	sv.sival_int = (dwmblockssig << 8) | arg->i; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	if (!dwmblockspid) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if (getdwmblockspid() == -1) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	if (sigqueue(dwmblockspid, SIGUSR1, sv) == -1) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		if (errno == ESRCH) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			if (!getdwmblockspid()) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				sigqueue(dwmblockspid, SIGUSR1, sv); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | void |  |  |  | void | 
			
		
	
		
		
			
				
					
					|  |  |  | spawn(const Arg *arg) |  |  |  | spawn(const Arg *arg) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1688,10 +1753,12 @@ tile(Monitor *m) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (i < m->nmaster) { |  |  |  | 		if (i < m->nmaster) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			h = (m->wh - my) / (MIN(n, m->nmaster) - i); |  |  |  | 			h = (m->wh - my) / (MIN(n, m->nmaster) - i); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); |  |  |  | 			resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			if (my + HEIGHT(c) < m->wh) | 
			
		
	
		
		
			
				
					
					|  |  |  | 				my += HEIGHT(c); |  |  |  | 				my += HEIGHT(c); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} else { |  |  |  | 		} else { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			h = (m->wh - ty) / (n - i); |  |  |  | 			h = (m->wh - ty) / (n - i); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); |  |  |  | 			resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			if (ty + HEIGHT(c) < m->wh) | 
			
		
	
		
		
			
				
					
					|  |  |  | 				ty += HEIGHT(c); |  |  |  | 				ty += HEIGHT(c); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1987,8 +2054,10 @@ updatesizehints(Client *c) | 
			
		
	
		
		
			
				
					
					|  |  |  | void |  |  |  | void | 
			
		
	
		
		
			
				
					
					|  |  |  | updatestatus(void) |  |  |  | updatestatus(void) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) |  |  |  | 	if (!gettextprop(root, XA_WM_NAME, rawstext, sizeof(rawstext))) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		strcpy(stext, "dwm-"VERSION); |  |  |  | 		strcpy(stext, "dwm-"VERSION); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		copyvalidchars(stext, rawstext); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	drawbar(selmon); |  |  |  | 	drawbar(selmon); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
	
		
		
			
				
					
					|  |  |   |