X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/5473e763f6ed7f2f248bc980c0b210edbcc1393c..6f60b2e1cd74c881688617082dc292b5c89da1a1:/dwm.c?ds=sidebyside

diff --git a/dwm.c b/dwm.c
index 862ec24..257edcc 100644
--- a/dwm.c
+++ b/dwm.c
@@ -145,7 +145,6 @@ Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
 void grabbuttons(Client *c, Bool focused);
 unsigned int idxoftag(const char *tag);
 void initfont(const char *fontstr);
-Bool isarrange(void (*func)());
 Bool isoccupied(unsigned int t);
 Bool isprotodel(Client *c);
 Bool isvisible(Client *c);
@@ -198,9 +197,6 @@ int screen, sx, sy, sw, sh, wax, way, waw, wah;
 int (*xerrorxlib)(Display *, XErrorEvent *);
 unsigned int bh, bpos;
 unsigned int blw = 0;
-unsigned int ltidx = 0; /* default */
-unsigned int nlayouts = 0;
-unsigned int nrules = 0;
 unsigned int numlockmask = 0;
 void (*handler[LASTEvent]) (XEvent *) = {
 	[ButtonPress] = buttonpress,
@@ -217,6 +213,8 @@ void (*handler[LASTEvent]) (XEvent *) = {
 	[UnmapNotify] = unmapnotify
 };
 Atom wmatom[WMLast], netatom[NetLast];
+Bool domwfact = True;
+Bool dozoom = True;
 Bool otherwm, readin;
 Bool running = True;
 Bool selscreen = True;
@@ -226,16 +224,13 @@ Client *stack = NULL;
 Cursor cursor[CurLast];
 Display *dpy;
 DC dc = {0};
+Layout *layout = NULL;
 Window barwin, root;
 Regs *regs = NULL;
 
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
-#define NTAGS (sizeof tags / sizeof tags[0])
-Bool seltags[NTAGS] = {[0] = True};
-Bool prevtags[NTAGS] = {[0] = True};
-
 /* function implementations */
 void
 applyrules(Client *c) {
@@ -250,10 +245,10 @@ applyrules(Client *c) {
 	snprintf(buf, sizeof buf, "%s:%s:%s",
 			ch.res_class ? ch.res_class : "",
 			ch.res_name ? ch.res_name : "", c->name);
-	for(i = 0; i < nrules; i++)
+	for(i = 0; i < LENGTH(rules); i++)
 		if(regs[i].propregex && !regexec(regs[i].propregex, buf, 1, &tmp, 0)) {
 			c->isfloating = rules[i].isfloating;
-			for(j = 0; regs[i].tagregex && j < NTAGS; j++) {
+			for(j = 0; regs[i].tagregex && j < LENGTH(tags); j++) {
 				if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) {
 					matched = True;
 					c->tags[j] = True;
@@ -277,7 +272,7 @@ arrange(void) {
 			unban(c);
 		else
 			ban(c);
-	layouts[ltidx].arrange();
+	layout->arrange();
 	focus(NULL);
 	restack();
 }
@@ -312,7 +307,7 @@ buttonpress(XEvent *e) {
 
 	if(barwin == ev->window) {
 		x = 0;
-		for(i = 0; i < NTAGS; i++) {
+		for(i = 0; i < LENGTH(tags); i++) {
 			x += textw(tags[i]);
 			if(ev->x < x) {
 				if(ev->button == Button1) {
@@ -338,20 +333,20 @@ buttonpress(XEvent *e) {
 		if(CLEANMASK(ev->state) != MODKEY)
 			return;
 		if(ev->button == Button1) {
-			if(isarrange(floating) || c->isfloating)
+			if((floating == layout->arrange) || c->isfloating)
 				restack();
 			else
 				togglefloating(NULL);
 			movemouse(c);
 		}
 		else if(ev->button == Button2) {
-			if((ISTILE) && !c->isfixed && c->isfloating)
+			if((floating != layout->arrange) && c->isfloating)
 				togglefloating(NULL);
 			else
 				zoom(NULL);
 		}
 		else if(ev->button == Button3 && !c->isfixed) {
-			if(isarrange(floating) || c->isfloating)
+			if((floating == layout->arrange) || c->isfloating)
 				restack();
 			else
 				togglefloating(NULL);
@@ -405,9 +400,8 @@ compileregs(void) {
 
 	if(regs)
 		return;
-	nrules = sizeof rules / sizeof rules[0];
-	regs = emallocz(nrules * sizeof(Regs));
-	for(i = 0; i < nrules; i++) {
+	regs = emallocz(LENGTH(rules) * sizeof(Regs));
+	for(i = 0; i < LENGTH(rules); i++) {
 		if(rules[i].prop) {
 			reg = emallocz(sizeof(regex_t));
 			if(regcomp(reg, rules[i].prop, REG_EXTENDED))
@@ -468,7 +462,7 @@ configurerequest(XEvent *e) {
 		c->ismax = False;
 		if(ev->value_mask & CWBorderWidth)
 			c->border = ev->border_width;
-		if(c->isfixed || c->isfloating || isarrange(floating)) {
+		if(c->isfixed || c->isfloating || (floating == layout->arrange)) {
 			if(ev->value_mask & CWX)
 				c->x = ev->x;
 			if(ev->value_mask & CWY)
@@ -536,7 +530,7 @@ drawbar(void) {
 	int i, x;
 
 	dc.x = dc.y = 0;
-	for(i = 0; i < NTAGS; i++) {
+	for(i = 0; i < LENGTH(tags); i++) {
 		dc.w = textw(tags[i]);
 		if(seltags[i]) {
 			drawtext(tags[i], dc.sel);
@@ -549,7 +543,7 @@ drawbar(void) {
 		dc.x += dc.w;
 	}
 	dc.w = blw;
-	drawtext(layouts[ltidx].symbol, dc.norm);
+	drawtext(layout->symbol, dc.norm);
 	x = dc.x + dc.w;
 	dc.w = textw(stext);
 	dc.x = sw - dc.w;
@@ -670,7 +664,7 @@ void
 expose(XEvent *e) {
 	XExposeEvent *ev = &e->xexpose;
 
-	if(ev->count == 0) {
+	if(0 == ev->count) {
 		if(barwin == ev->window)
 			drawbar();
 	}
@@ -680,6 +674,7 @@ void
 floating(void) { /* default floating layout */
 	Client *c;
 
+	domwfact = dozoom = False;
 	for(c = clients; c; c = c->next)
 		if(isvisible(c))
 			resize(c, c->x, c->y, c->w, c->h, True);
@@ -784,7 +779,7 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) {
 	int n;
 	XTextProperty name;
 
-	if(!text || size == 0)
+	if(!text || 0 == size)
 		return False;
 	text[0] = '\0';
 	XGetTextProperty(dpy, w, &name, atom);
@@ -846,8 +841,8 @@ unsigned int
 idxoftag(const char *tag) {
 	unsigned int i;
 
-	for(i = 0; (i < NTAGS) && (tags[i] != tag); i++);
-	return (i < NTAGS) ? i : 0;
+	for(i = 0; (i < LENGTH(tags)) && (tags[i] != tag); i++);
+	return (i < LENGTH(tags)) ? i : 0;
 }
 
 void
@@ -892,12 +887,6 @@ initfont(const char *fontstr) {
 	dc.font.height = dc.font.ascent + dc.font.descent;
 }
 
-Bool
-isarrange(void (*func)())
-{
-	return func == layouts[ltidx].arrange;
-}
-
 Bool
 isoccupied(unsigned int t) {
 	Client *c;
@@ -927,7 +916,7 @@ Bool
 isvisible(Client *c) {
 	unsigned int i;
 
-	for(i = 0; i < NTAGS; i++)
+	for(i = 0; i < LENGTH(tags); i++)
 		if(c->tags[i] && seltags[i])
 			return True;
 	return False;
@@ -936,7 +925,6 @@ isvisible(Client *c) {
 void
 keypress(XEvent *e) {
 	KEYS
-	unsigned int len = sizeof keys / sizeof keys[0];
 	unsigned int i;
 	KeyCode code;
 	KeySym keysym;
@@ -944,7 +932,7 @@ keypress(XEvent *e) {
 
 	if(!e) { /* grabkeys */
 		XUngrabKey(dpy, AnyKey, AnyModifier, root);
-		for(i = 0; i < len; i++) {
+		for(i = 0; i < LENGTH(keys); i++) {
 			code = XKeysymToKeycode(dpy, keys[i].keysym);
 			XGrabKey(dpy, code, keys[i].mod, root, True,
 					GrabModeAsync, GrabModeAsync);
@@ -959,7 +947,7 @@ keypress(XEvent *e) {
 	}
 	ev = &e->xkey;
 	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
-	for(i = 0; i < len; i++)
+	for(i = 0; i < LENGTH(keys); i++)
 		if(keysym == keys[i].keysym
 		&& CLEANMASK(keys[i].mod) == CLEANMASK(ev->state))
 		{
@@ -1270,9 +1258,9 @@ restack(void) {
 	drawbar();
 	if(!sel)
 		return;
-	if(sel->isfloating || isarrange(floating))
+	if(sel->isfloating || (floating == layout->arrange))
 		XRaiseWindow(dpy, sel->win);
-	if(!isarrange(floating)) {
+	if(floating != layout->arrange) {
 		wc.stack_mode = Below;
 		wc.sibling = barwin;
 		if(!sel->isfloating) {
@@ -1378,16 +1366,16 @@ setlayout(const char *arg) {
 	unsigned int i;
 
 	if(!arg) {
-		if(++ltidx == nlayouts)
-			ltidx = 0;;
+		if(++layout == &layouts[LENGTH(layouts)])
+			layout = &layouts[0];
 	}
 	else {
-		for(i = 0; i < nlayouts; i++)
+		for(i = 0; i < LENGTH(layouts); i++)
 			if(!strcmp(arg, layouts[i].symbol))
 				break;
-		if(i == nlayouts)
+		if(i == LENGTH(layouts))
 			return;
-		ltidx = i;
+		layout = &layouts[i];
 	}
 	if(sel)
 		arrange();
@@ -1399,10 +1387,10 @@ void
 setmwfact(const char *arg) {
 	double delta;
 
-	if(!(ISTILE))
+	if(!domwfact)
 		return;
 	/* arg handling, manipulate mwfact */
-	if(arg == NULL)
+	if(NULL == arg)
 		mwfact = MWFACT;
 	else if(1 == sscanf(arg, "%lf", &delta)) {
 		if(arg[0] == '+' || arg[0] == '-')
@@ -1480,8 +1468,8 @@ setup(void) {
 
 	/* init layouts */
 	mwfact = MWFACT;
-	nlayouts = sizeof layouts / sizeof layouts[0];
-	for(blw = i = 0; i < nlayouts; i++) {
+	layout = &layouts[0];
+	for(blw = i = 0; i < LENGTH(layouts); i++) {
 		j = textw(layouts[i].symbol);
 		if(j > blw)
 			blw = j;
@@ -1519,8 +1507,8 @@ spawn(const char *arg) {
 		return;
 	/* The double-fork construct avoids zombie processes and keeps the code
 	 * clean from stupid signal handlers. */
-	if(fork() == 0) {
-		if(fork() == 0) {
+	if(0 == fork()) {
+		if(0 == fork()) {
 			if(dpy)
 				close(ConnectionNumber(dpy));
 			setsid();
@@ -1539,7 +1527,7 @@ tag(const char *arg) {
 
 	if(!sel)
 		return;
-	for(i = 0; i < NTAGS; i++)
+	for(i = 0; i < LENGTH(tags); i++)
 		sel->tags[i] = (NULL == arg);
 	sel->tags[idxoftag(arg)] = True;
 	arrange();
@@ -1566,6 +1554,7 @@ tile(void) {
 	unsigned int i, n, nx, ny, nw, nh, mw, th;
 	Client *c, *mc;
 
+	domwfact = dozoom = True;
 	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
 		n++;
 
@@ -1580,7 +1569,7 @@ tile(void) {
 	nw = 0; /* gcc stupidity requires this */
 	for(i = 0, c = mc = nexttiled(clients); c; c = nexttiled(c->next), i++) {
 		c->ismax = False;
-		if(i == 0) { /* master */
+		if(0 == i) { /* master */
 			nw = mw - 2 * c->border;
 			nh = wah - 2 * c->border;
 		}
@@ -1595,9 +1584,9 @@ tile(void) {
 			else
 				nh = th - 2 * c->border;
 		}
-		resize(c, nx, ny, nw, nh, True);
-		if((c->h < bh) || (c->h > nh) || (c->w < bh) || (c->w > nw))
-			/* client doesn't accept geometry, so enforce it */
+		resize(c, nx, ny, nw, nh, RESIZEHINTS);
+		if((RESIZEHINTS) && ((c->h < bh) || (c->h > nh) || (c->w < bh) || (c->w > nw)))
+			/* client doesn't accept size constraints */
 			resize(c, nx, ny, nw, nh, False);
 		if(n > 1 && th != wah)
 			ny = c->y + c->h + 2 * c->border;
@@ -1631,7 +1620,7 @@ togglemax(const char *arg) {
 	if(!sel || sel->isfixed)
 		return;
 	if((sel->ismax = !sel->ismax)) {
-		if(isarrange(floating) || sel->isfloating)
+		if((floating == layout->arrange) || sel->isfloating)
 			sel->wasfloating = True;
 		else {
 			togglefloating(NULL);
@@ -1660,8 +1649,8 @@ toggletag(const char *arg) {
 		return;
 	i = idxoftag(arg);
 	sel->tags[i] = !sel->tags[i];
-	for(j = 0; j < NTAGS && !sel->tags[j]; j++);
-	if(j == NTAGS)
+	for(j = 0; j < LENGTH(tags) && !sel->tags[j]; j++);
+	if(j == LENGTH(tags))
 		sel->tags[i] = True; /* at least one tag must be enabled */
 	arrange();
 }
@@ -1672,8 +1661,8 @@ toggleview(const char *arg) {
 
 	i = idxoftag(arg);
 	seltags[i] = !seltags[i];
-	for(j = 0; j < NTAGS && !seltags[j]; j++);
-	if(j == NTAGS)
+	for(j = 0; j < LENGTH(tags) && !seltags[j]; j++);
+	if(j == LENGTH(tags))
 		seltags[i] = True; /* at least one tag must be viewed */
 	arrange();
 }
@@ -1839,8 +1828,8 @@ view(const char *arg) {
 	unsigned int i;
 
 	memcpy(prevtags, seltags, sizeof seltags);
-	for(i = 0; i < NTAGS; i++)
-		seltags[i] = arg == NULL;
+	for(i = 0; i < LENGTH(tags); i++)
+		seltags[i] = (NULL == arg);
 	seltags[idxoftag(arg)] = True;
 	arrange();
 }
@@ -1859,7 +1848,7 @@ void
 zoom(const char *arg) {
 	Client *c;
 
-	if(!sel || !(ISTILE) || sel->isfloating)
+	if(!sel || !dozoom || sel->isfloating)
 		return;
 	if((c = sel) == nexttiled(clients))
 		if(!(c = nexttiled(c->next)))