about summary refs log tree commit diff stats
path: root/screen.c
diff options
context:
space:
mode:
authorAnselm R. Garbe <garbeam@wmii.de>2006-07-14 22:33:38 +0200
committerAnselm R. Garbe <garbeam@wmii.de>2006-07-14 22:33:38 +0200
commit29355bd38284ed9aec8d3ffabde61db73947c9f9 (patch)
treee8c9d94e52b57df9c93bc58bdd5c37b9e3262e65 /screen.c
parent91a1f6926e2594156219c1caaf4729c5d86498a5 (diff)
downloaddwm-29355bd38284ed9aec8d3ffabde61db73947c9f9.tar.gz
rearranged
Diffstat (limited to 'screen.c')
-rw-r--r--screen.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/screen.c b/screen.c
new file mode 100644
index 0000000..f2891cf
--- /dev/null
+++ b/screen.c
@@ -0,0 +1,100 @@
+/*
+ * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include "dwm.h"
+
+void (*arrange)(Arg *) = tiling;
+
+void
+view(Arg *arg)
+{
+	Client *c;
+
+	tsel = arg->i;
+	arrange(NULL);
+
+	for(c = clients; c; c = next(c->next))
+		draw_client(c);
+	draw_bar();
+}
+
+void
+floating(Arg *arg)
+{
+	Client *c;
+
+	arrange = floating;
+	for(c = clients; c; c = c->next) {
+		if(c->tags[tsel])
+			resize(c, True);
+		else
+			ban_client(c);
+	}
+	if(sel && !sel->tags[tsel]) {
+		if((sel = next(clients))) {
+			craise(sel);
+			focus(sel);
+		}
+	}
+	draw_bar();
+}
+
+void
+tiling(Arg *arg)
+{
+	Client *c;
+	int n, i, w, h;
+
+	w = sw - mw;
+	arrange = tiling;
+	for(n = 0, c = clients; c; c = c->next)
+		if(c->tags[tsel] && !c->floating)
+			n++;
+
+	if(n > 1)
+		h = (sh - bh) / (n - 1);
+	else
+		h = sh - bh;
+
+	for(i = 0, c = clients; c; c = c->next) {
+		if(c->tags[tsel]) {
+			if(c->floating) {
+				craise(c);
+				resize(c, True);
+				continue;
+			}
+			if(n == 1) {
+				c->x = sx;
+				c->y = sy + bh;
+				c->w = sw - 2 * c->border;
+				c->h = sh - 2 * c->border - bh;
+			}
+			else if(i == 0) {
+				c->x = sx;
+				c->y = sy + bh;
+				c->w = mw - 2 * c->border;
+				c->h = sh - 2 * c->border - bh;
+			}
+			else {
+				c->x = sx + mw;
+				c->y = sy + (i - 1) * h + bh;
+				c->w = w - 2 * c->border;
+				c->h = h - 2 * c->border;
+			}
+			resize(c, False);
+			i++;
+		}
+		else
+			ban_client(c);
+	}
+	if(!sel || (sel && !sel->tags[tsel])) {
+		if((sel = next(clients))) {
+			craise(sel);
+			focus(sel);
+		}
+	}
+	draw_bar();
+}
+