X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/2c477cf66147d369ae8ff17acdce743c6811ee6a..c95bf3db9dcbf48428140bca6c2f86129977cc6c:/layout.c

diff --git a/layout.c b/layout.c
index 8b4c940..f8c92ee 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;
@@ -27,40 +26,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 +67,37 @@ LAYOUTS
 /* extern */
 
 void
-focusnext(const char *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)) {
+			unban(c);
+			resize(c, c->x, c->y, c->w, c->h, True);
+		}
+		else
+			ban(c);
+	focus(NULL);
+	restack();
 }
 
 void
-focusprev(const char *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);
@@ -109,7 +114,7 @@ incmasterw(const char *arg) {
 		masterw = MASTERWIDTH;
 	else {
 		i = atoi(arg);
-		if(waw * (masterw + i) / 1000 >= waw - 2 * BORDERPX
+		if(waw * (masterw + i) / 1000 >= waw - 2 * BORDERPX 
 		|| waw * (masterw + i) / 1000 <= 2 * BORDERPX)
 			return;
 		masterw += i;
@@ -119,11 +124,17 @@ incmasterw(const char *arg) {
 
 void
 incnmaster(const char *arg) {
-	int i = arg ? atoi(arg) : 0;
-	if((lt->arrange != tile) || (nmaster + i < 1)
-	|| (wah / (nmaster + i) <= 2 * BORDERPX))
-		return;
-	nmaster += i;
+	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
@@ -145,7 +156,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;
 }
 
@@ -153,19 +164,25 @@ void
 restack(void) {
 	Client *c;
 	XEvent ev;
+	XWindowChanges wc;
 
 	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)
-			XLowerWindow(dpy, sel->win);
+	if(lt->arrange != floating) {
+		wc.stack_mode = Below;
+		wc.sibling = barwin;
+		if(!sel->isfloating) {
+			XConfigureWindow(dpy, sel->win, CWSibling | CWStackMode, &wc);
+			wc.sibling = sel->win;
+		}
 		for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
 			if(c == sel)
 				continue;
-			XLowerWindow(dpy, c->win);
+			XConfigureWindow(dpy, c->win, CWSibling | CWStackMode, &wc);
+			wc.sibling = c->win;
 		}
 	}
 	XSync(dpy, False);
@@ -174,14 +191,12 @@ restack(void) {
 
 void
 setlayout(const char *arg) {
-	unsigned int i;
+	int i;
 
 	if(!arg) {
-		for(i = 0; i < nlayouts && lt != &layout[i]; i++);
-		if(i == nlayouts - 1)
-			lt = &layout[0];
-		else
-			lt = &layout[++i];
+		lt++;
+		if(lt == layout + nlayouts)
+			lt = layout;
 	}
 	else {
 		i = atoi(arg);
@@ -195,18 +210,28 @@ setlayout(const char *arg) {
 		drawstatus();
 }
 
+void
+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 || (lt->arrange != versatile && !sel->isversatile) || sel->isfixed)
+	if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed)
 		return;
 	if((sel->ismax = !sel->ismax)) {
 		sel->rx = sel->x;
 		sel->ry = sel->y;
 		sel->rw = sel->w;
 		sel->rh = sel->h;
-		resize(sel, wax, way, waw - 2 * BORDERPX, wah - 2 * BORDERPX, True);
+		resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->border, True);
 	}
 	else
 		resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
@@ -214,38 +239,12 @@ togglemax(const char *arg) {
 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 }
 
-void
-versatile(void) {
-	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(const char *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;