about summary refs log tree commit diff stats
path: root/tile.c
diff options
context:
space:
mode:
authorAnselm R. Garbe <garbeam@gmail.com>2007-08-11 12:11:50 +0200
committerAnselm R. Garbe <garbeam@gmail.com>2007-08-11 12:11:50 +0200
commit2d81b78b853565a3e34a8a9190e2362a6fdde739 (patch)
treed58d24853f77685588e42f73a01d782980a3b95e /tile.c
parentb5eea45a316a897632578a74c909aa336557b1d6 (diff)
downloaddwm-2d81b78b853565a3e34a8a9190e2362a6fdde739.tar.gz
separated layout-specific stuff into separate .h and .c files which are included in config.h resp. config.mk - this allows writing layouts for dwm without any need to patch existing code
Diffstat (limited to 'tile.c')
-rw-r--r--tile.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/tile.c b/tile.c
new file mode 100644
index 0000000..40e40e2
--- /dev/null
+++ b/tile.c
@@ -0,0 +1,88 @@
+/* See LICENSE file for copyright and license details. */
+#include "dwm.h"
+#include <stdio.h>
+
+/* static */
+
+static double master = MASTER;
+
+/* extern */
+
+void
+incmaster(const char *arg) {
+	double delta;
+
+	if(lt->arrange != tile)
+		return;
+
+	/* arg handling, manipulate master */
+	if(arg && (1 == sscanf(arg, "%lf", &delta))) {
+		if(delta + master > 0.1 && delta + master < 0.9)
+			master += delta;
+	}
+
+	lt->arrange();
+}
+
+void
+tile(void) {
+	unsigned int i, n, nx, ny, nw, nh, mw, th;
+	Client *c;
+
+	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
+		n++;
+
+	/* window geoms */
+	mw = (n == 1) ? waw : master * waw;
+	th = (n > 1) ? wah / (n - 1) : 0;
+	if(n > 1 && th < bh)
+		th = wah;
+
+	nx = wax;
+	ny = way;
+	for(i = 0, c = clients; c; c = c->next)
+		if(isvisible(c)) {
+			unban(c);
+			if(c->isfloating)
+				continue;
+			c->ismax = False;
+			if(i == 0) { /* master */
+				nw = mw - 2 * c->border;
+				nh = wah - 2 * c->border;
+			}
+			else {  /* tile window */
+				if(i == 1) {
+					ny = way;
+					nx += mw;
+				}
+				nw = waw - mw - 2 * c->border;
+				if(i + 1 == n) /* remainder */
+					nh = (way + wah) - ny - 2 * c->border;
+				else
+					nh = th - 2 * c->border;
+			}
+			resize(c, nx, ny, nw, nh, False);
+			if(n > 1 && th != wah)
+				ny += nh + 2 * c->border;
+			i++;
+		}
+		else
+			ban(c);
+	focus(NULL);
+	restack();
+}
+
+void
+zoom(const char *arg) {
+	Client *c;
+
+	if(!sel || lt->arrange == floating || sel->isfloating)
+		return;
+	if((c = sel) == nexttiled(clients))
+		if(!(c = nexttiled(c->next)))
+			return;
+	detach(c);
+	attach(c);
+	focus(c);
+	lt->arrange();
+}