X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/352cae4380713949d3800ebcda7aff3bb5ab9efc..4e49d5a0ad0936e1492eabf92ff471670742189f:/layout.c

diff --git a/layout.c b/layout.c
index 6a65599..ecd7a16 100644
--- a/layout.c
+++ b/layout.c
@@ -1,7 +1,6 @@
-/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
- * See LICENSE file for license details.
- */
+/* See LICENSE file for copyright and license details. */
 #include "dwm.h"
+#include <stdlib.h>
 
 unsigned int blw = 0;
 Layout *lt = NULL;
@@ -12,6 +11,22 @@ static unsigned int nlayouts = 0;
 static unsigned int masterw = MASTERWIDTH;
 static unsigned int nmaster = NMASTER;
 
+static void
+ban(Client *c) {
+	if (c->isbanned)
+		return;
+	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
+	c->isbanned = True;
+}
+
+static void
+unban(Client *c) {
+	if (!c->isbanned)
+		return;
+	XMoveWindow(dpy, c->win, c->x, c->y);
+	c->isbanned = False;
+}
+
 static void
 tile(void) {
 	unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;
@@ -27,40 +42,39 @@ tile(void) {
 
 	for(i = 0, c = clients; c; c = c->next)
 		if(isvisible(c)) {
-			if(c->isbanned)
-				XMoveWindow(dpy, c->win, c->x, c->y);
-			c->isbanned = False;
-			if(c->isversatile)
+			unban(c);
+			if(c->isfloating)
 				continue;
 			c->ismax = False;
 			nx = wax;
 			ny = way;
 			if(i < nmaster) {
 				ny += i * mh;
-				nw = mw - 2 * BORDERPX;
-				nh = mh - 2 * BORDERPX;
+				nw = mw - 2 * c->border;
+				nh = mh;
+				if(i + 1 == (n < nmaster ? n : nmaster)) /* remainder */
+					nh = wah - mh * i;
+				nh -= 2 * c->border;
 			}
 			else {  /* tile window */
 				nx += mw;
-				nw = tw - 2 * BORDERPX;
-				if(th > 2 * BORDERPX) {
+				nw = tw - 2 * c->border;
+				if(th > 2 * c->border) {
 					ny += (i - nmaster) * th;
-					nh = th - 2 * BORDERPX;
+					nh = th;
+					if(i + 1 == n) /* remainder */
+						nh = wah - th * (i - nmaster);
+					nh -= 2 * c->border;
 				}
-				else /* fallback if th <= 2 * BORDERPX */
-					nh = wah - 2 * BORDERPX;
+				else /* fallback if th <= 2 * c->border */
+					nh = wah - 2 * c->border;
 			}
 			resize(c, nx, ny, nw, nh, False);
 			i++;
 		}
-		else {
-			c->isbanned = True;
-			XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
-		}
-	if(!sel || !isvisible(sel)) {
-		for(c = stack; c && !isvisible(c); c = c->snext);
-		focus(c);
-	}
+		else
+			ban(c);
+	focus(NULL);
 	restack();
 }
 
@@ -69,30 +83,39 @@ LAYOUTS
 /* extern */
 
 void
-focusnext(Arg arg) {
+floating(void) {
 	Client *c;
-   
-	if(!sel)
-		return;
-	for(c = sel->next; c && !isvisible(c); c = c->next);
-	if(!c)
-		for(c = clients; c && !isvisible(c); c = c->next);
-	if(c) {
-		focus(c);
-		restack();
-	}
+
+	for(c = clients; c; c = c->next)
+		if(isvisible(c)) {
+			if(c->isbanned)
+				XMoveWindow(dpy, c->win, c->x, c->y);
+			c->isbanned = False;
+			resize(c, c->x, c->y, c->w, c->h, True);
+		}
+		else
+			ban(c);
+	focus(NULL);
+	restack();
 }
 
 void
-focusprev(Arg arg) {
+focusclient(const char *arg) {
 	Client *c;
-
-	if(!sel)
+   
+	if(!sel || !arg)
 		return;
-	for(c = sel->prev; c && !isvisible(c); c = c->prev);
-	if(!c) {
-		for(c = clients; c && c->next; c = c->next);
-		for(; c && !isvisible(c); c = c->prev);
+	if(atoi(arg) < 0) {
+		for(c = sel->prev; c && !isvisible(c); c = c->prev);
+		if(!c) {
+			for(c = clients; c && c->next; c = c->next);
+			for(; c && !isvisible(c); c = c->prev);
+		}
+	}
+	else {
+		for(c = sel->next; c && !isvisible(c); c = c->next);
+		if(!c)
+			for(c = clients; c && !isvisible(c); c = c->next);
 	}
 	if(c) {
 		focus(c);
@@ -101,26 +124,35 @@ focusprev(Arg arg) {
 }
 
 void
-incmasterw(Arg arg) {
+incmasterw(const char *arg) {
+	int i;
 	if(lt->arrange != tile)
 		return;
-	if(arg.i == 0)
+	if(!arg)
 		masterw = MASTERWIDTH;
 	else {
-		if(waw * (masterw + arg.i) / 1000 >= waw - 2 * BORDERPX
-		|| waw * (masterw + arg.i) / 1000 <= 2 * BORDERPX)
+		i = atoi(arg);
+		if(waw * (masterw + i) / 1000 >= waw - 2 * BORDERPX 
+		|| waw * (masterw + i) / 1000 <= 2 * BORDERPX)
 			return;
-		masterw += arg.i;
+		masterw += i;
 	}
 	lt->arrange();
 }
 
 void
-incnmaster(Arg arg) {
-	if((lt->arrange != tile) || (nmaster + arg.i < 1)
-	|| (wah / (nmaster + arg.i) <= 2 * BORDERPX))
-		return;
-	nmaster += arg.i;
+incnmaster(const char *arg) {
+	int i;
+
+	if(!arg)
+		nmaster = NMASTER;
+	else {
+		i = atoi(arg);
+		if((lt->arrange != tile) || (nmaster + i < 1)
+		|| (wah / (nmaster + i) <= 2 * BORDERPX))
+			return;
+		nmaster += i;
+	}
 	if(sel)
 		lt->arrange();
 	else
@@ -142,7 +174,7 @@ initlayouts(void) {
 
 Client *
 nexttiled(Client *c) {
-	for(; c && (c->isversatile || !isvisible(c)); c = c->next);
+	for(; c && (c->isfloating || !isvisible(c)); c = c->next);
 	return c;
 }
 
@@ -154,10 +186,10 @@ restack(void) {
 	drawstatus();
 	if(!sel)
 		return;
-	if(sel->isversatile || lt->arrange == versatile)
+	if(sel->isfloating || lt->arrange == floating)
 		XRaiseWindow(dpy, sel->win);
-	if(lt->arrange != versatile) {
-		if(!sel->isversatile)
+	if(lt->arrange != floating) {
+		if(!sel->isfloating)
 			XLowerWindow(dpy, sel->win);
 		for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
 			if(c == sel)
@@ -170,20 +202,19 @@ restack(void) {
 }
 
 void
-setlayout(Arg arg) {
-	unsigned int i;
+setlayout(const char *arg) {
+	int i;
 
-	if(arg.i == -1) {
-		for(i = 0; i < nlayouts && lt != &layout[i]; i++);
-		if(i == nlayouts - 1)
-			lt = &layout[0];
-		else
-			lt = &layout[++i];
+	if(!arg) {
+		lt++;
+		if(lt == layout + nlayouts)
+			lt = layout;
 	}
 	else {
-		if(arg.i < 0 || arg.i >= nlayouts)
+		i = atoi(arg);
+		if(i < 0 || i >= nlayouts)
 			return;
-		lt = &layout[arg.i];
+		lt = &layout[i];
 	}
 	if(sel)
 		lt->arrange();
@@ -192,10 +223,20 @@ setlayout(Arg arg) {
 }
 
 void
-togglemax(Arg arg) {
+togglebar(const char *arg) {
+	if(bpos == BarOff)
+		bpos = (BARPOS == BarOff) ? BarTop : BARPOS;
+	else
+		bpos = BarOff;
+	updatebarpos();
+	lt->arrange();
+}
+
+void
+togglemax(const char *arg) {
 	XEvent ev;
 
-	if(!sel || !sel->isversatile || sel->isfixed || lt->arrange != versatile)
+	if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed)
 		return;
 	if((sel->ismax = !sel->ismax)) {
 		sel->rx = sel->x;
@@ -206,41 +247,16 @@ togglemax(Arg arg) {
 	}
 	else
 		resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
+	drawstatus();
 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 }
 
 void
-versatile(void) {
+zoom(const char *arg) {
 	Client *c;
 
-	for(c = clients; c; c = c->next) {
-		if(isvisible(c)) {
-			if(c->isbanned)
-				XMoveWindow(dpy, c->win, c->x, c->y);
-			c->isbanned = False;
-			resize(c, c->x, c->y, c->w, c->h, True);
-		}
-		else {
-			c->isbanned = True;
-			XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
-		}
-	}
-	if(!sel || !isvisible(sel)) {
-		for(c = stack; c && !isvisible(c); c = c->snext);
-		focus(c);
-	}
-	restack();
-}
-
-void
-zoom(Arg arg) {
-	unsigned int n;
-	Client *c;
-
-	if(!sel || lt->arrange != tile || sel->isversatile)
+	if(!sel || lt->arrange == floating || sel->isfloating)
 		return;
-	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
-		n++;
 	if((c = sel) == nexttiled(clients))
 		if(!(c = nexttiled(c->next)))
 			return;