X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/08c2d924809ca6e397126532c52955c3c04237e2..635b64384dc8723c46615924eab05412e53e86a5:/dwm.c

diff --git a/dwm.c b/dwm.c
index 36ca4eb..c4a705d 100644
--- a/dwm.c
+++ b/dwm.c
@@ -27,14 +27,15 @@
  */
 #include <errno.h>
 #include <locale.h>
-#include <regex.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <sys/select.h>
+#include <sys/types.h>
 #include <sys/wait.h>
+#include <regex.h>
 #include <X11/cursorfont.h>
 #include <X11/keysym.h>
 #include <X11/Xatom.h>
@@ -334,23 +335,23 @@ buttonpress(XEvent *e) {
 		if(CLEANMASK(ev->state) != MODKEY)
 			return;
 		if(ev->button == Button1) {
-			if(!isarrange(floating) && !c->isfloating)
-				togglefloating(NULL);
-			else
+			if(isarrange(floating) || c->isfloating)
 				restack();
+			else
+				togglefloating(NULL);
 			movemouse(c);
 		}
 		else if(ev->button == Button2) {
-			if(isarrange(tile) && !c->isfixed && c->isfloating)
+			if(ISTILE && !c->isfixed && c->isfloating)
 				togglefloating(NULL);
 			else
 				zoom(NULL);
 		}
 		else if(ev->button == Button3 && !c->isfixed) {
-			if(!isarrange(floating) && !c->isfloating)
-				togglefloating(NULL);
-			else
+			if(isarrange(floating) || c->isfloating)
 				restack();
+			else
+				togglefloating(NULL);
 			resizemouse(c);
 		}
 	}
@@ -444,7 +445,7 @@ void
 configurenotify(XEvent *e) {
 	XConfigureEvent *ev = &e->xconfigure;
 
-	if (ev->window == root && (ev->width != sw || ev->height != sh)) {
+	if(ev->window == root && (ev->width != sw || ev->height != sh)) {
 		sw = ev->width;
 		sh = ev->height;
 		XFreePixmap(dpy, dc.drawable);
@@ -645,8 +646,11 @@ enternotify(XEvent *e) {
 
 	if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
 		return;
-	if((c = getclient(ev->window)))
+	if((c = getclient(ev->window))) {
 		focus(c);
+		if(ISTILE && !c->isfloating)
+			restack();
+	}
 	else if(ev->window == root) {
 		selscreen = True;
 		focus(NULL);
@@ -883,7 +887,7 @@ initfont(const char *fontstr) {
 			XFreeFont(dpy, dc.font.xfont);
 		dc.font.xfont = NULL;
 		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
-		|| !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
+		&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
 			eprint("error, cannot load font: '%s'\n", fontstr);
 		dc.font.ascent = dc.font.xfont->ascent;
 		dc.font.descent = dc.font.xfont->descent;
@@ -1398,16 +1402,16 @@ void
 setmwfact(const char *arg) {
 	double delta;
 
-	if(!isarrange(tile))
+	if(!ISTILE)
 		return;
 	/* arg handling, manipulate mwfact */
 	if(arg == NULL)
 		mwfact = MWFACT;
 	else if(1 == sscanf(arg, "%lf", &delta)) {
-		if(arg[0] != '+' && arg[0] != '-')
-			mwfact = delta;
-		else
+		if(arg[0] == '+' || arg[0] == '-')
 			mwfact += delta;
+		else
+			mwfact = delta;
 		if(mwfact < 0.1)
 			mwfact = 0.1;
 		else if(mwfact > 0.9)
@@ -1418,6 +1422,7 @@ setmwfact(const char *arg) {
 
 void
 setup(void) {
+	int d;
 	unsigned int i, j, mask;
 	Window w;
 	XModifierKeymap *modmap;
@@ -1507,7 +1512,7 @@ setup(void) {
 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
 
 	/* multihead support */
-	selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
+	selscreen = XQueryPointer(dpy, root, &w, &w, &d, &d, &d, &d, &mask);
 }
 
 void
@@ -1567,7 +1572,7 @@ textw(const char *text) {
 void
 tile(void) {
 	unsigned int i, n, nx, ny, nw, nh, mw, th;
-	Client *c;
+	Client *c, *mc;
 
 	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
 		n++;
@@ -1580,7 +1585,8 @@ tile(void) {
 
 	nx = wax;
 	ny = way;
-	for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++) {
+	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 */
 			nw = mw - 2 * c->border;
@@ -1589,9 +1595,9 @@ tile(void) {
 		else {  /* tile window */
 			if(i == 1) {
 				ny = way;
-				nx += mw;
+				nx += mc->w + mc->border;
+				nw = waw - nx - 2 * c->border;
 			}
-			nw = waw - mw - 2 * c->border;
 			if(i + 1 == n) /* remainder */
 				nh = (way + wah) - ny - 2 * c->border;
 			else
@@ -1599,7 +1605,7 @@ tile(void) {
 		}
 		resize(c, nx, ny, nw, nh, RESIZEHINTS);
 		if(n > 1 && th != wah)
-			ny += nh + 2 * c->border;
+			ny = c->y + c->h + c->border;
 	}
 }
 
@@ -1644,7 +1650,7 @@ togglemax(const char *arg) {
 	}
 	else {
 		resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
-		if (!sel->wasfloating)
+		if(!sel->wasfloating)
 			togglefloating(NULL);
 	}
 	drawbar();
@@ -1673,7 +1679,7 @@ toggleview(const char *arg) {
 	seltags[i] = !seltags[i];
 	for(j = 0; j < ntags && !seltags[j]; j++);
 	if(j == ntags)
-		seltags[i] = True; /* cannot toggle last view */
+		seltags[i] = True; /* at least one tag must be viewed */
 	arrange();
 }
 
@@ -1849,7 +1855,7 @@ void
 zoom(const char *arg) {
 	Client *c;
 
-	if(!sel || !isarrange(tile) || sel->isfloating)
+	if(!sel || !ISTILE || sel->isfloating)
 		return;
 	if((c = sel) == nexttiled(clients))
 		if(!(c = nexttiled(c->next)))