about summary refs log tree commit diff stats
path: root/dwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwm.c')
-rw-r--r--dwm.c100
1 files changed, 49 insertions, 51 deletions
diff --git a/dwm.c b/dwm.c
index 66daba3..ff9e66a 100644
--- a/dwm.c
+++ b/dwm.c
@@ -99,9 +99,10 @@ typedef struct {
 	const char *arg;
 } Key;
 
+typedef struct Monitor Monitor;
 typedef struct {
 	const char *symbol;
-	void (*arrange)(void);
+	void (*arrange)(Monitor *);
 } Layout;
 
 typedef struct {
@@ -116,14 +117,16 @@ typedef struct {
 	regex_t *tagregex;
 } Regs;
 
-typedef struct {
-	Window barwin;
+struct Monitor {
+	unsigned int id;
 	int sx, sy, sw, sh, wax, way, wah, waw;
+	double mwfact;
 	Bool *seltags;
 	Bool *prevtags;
 	Layout *layout;
-	double mwfact;
-} Monitor;
+	Window barwin;
+};
+
 
 /* function declarations */
 void applyrules(Client *c);
@@ -148,7 +151,7 @@ void *emallocz(unsigned int size);
 void enternotify(XEvent *e);
 void eprint(const char *errstr, ...);
 void expose(XEvent *e);
-void floating(void); /* default floating layout */
+void floating(Monitor *m); /* default floating layout */
 void focus(Client *c);
 void focusin(XEvent *e);
 void focusnext(const char *arg);
@@ -188,7 +191,7 @@ void spawn(const char *arg);
 void tag(const char *arg);
 unsigned int textnw(const char *text, unsigned int len);
 unsigned int textw(const char *text);
-void tile(void);
+void tile(Monitor *m);
 void togglebar(const char *arg);
 void togglefloating(const char *arg);
 void toggletag(const char *arg);
@@ -304,7 +307,7 @@ arrange(void) {
 		else
 			ban(c);
 
-	monitors[selmonitor].layout->arrange();
+	monitors[selmonitor].layout->arrange(&monitors[selmonitor]);
 	focus(NULL);
 	restack();
 }
@@ -719,12 +722,12 @@ expose(XEvent *e) {
 }
 
 void
-floating(void) { /* default floating layout */
+floating(Monitor *m) { /* default floating layout */
 	Client *c;
 
 	domwfact = dozoom = False;
 	for(c = clients; c; c = c->next)
-		if(isvisible(c, selmonitor))
+		if(isvisible(c, m->id))
 			resize(c, c->x, c->y, c->w, c->h, True);
 }
 
@@ -1598,6 +1601,7 @@ setup(void) {
 	for(i = 0; i < mcount; i++) {
 		/* init geometry */
 		m = &monitors[i];
+		m->id = i;
 
 		if (mcount != 1 && isxinerama) {
 			m->sx = info[i].x_org;
@@ -1714,56 +1718,50 @@ textw(const char *text) {
 }
 
 void
-tile(void) {
-	unsigned int i, j, n, nx, ny, nw, nh, mw, th;
+tile(Monitor *m) {
+	unsigned int i, n, nx, ny, nw, nh, mw, th;
 	Client *c, *mc;
 
 	domwfact = dozoom = True;
 
 	nx = ny = nw = 0; /* gcc stupidity requires this */
 
-	for (i = 0; i < mcount; i++) {
-		Monitor *m = &monitors[i];
-
-		for(n = 0, c = nexttiled(clients, i); c; c = nexttiled(c->next, i))
-			n++;
-
-		/* window geoms */
-		mw = (n == 1) ? m->waw : m->mwfact * m->waw;
-		th = (n > 1) ? m->wah / (n - 1) : 0;
-		if(n > 1 && th < bh)
-			th = m->wah;
-
-		for(j = 0, c = mc = nexttiled(clients, i); c; c = nexttiled(c->next, i)) {
-			if(j == 0) { /* master */
-				nx = m->wax;
+	for(n = 0, c = nexttiled(clients, m->id); c; c = nexttiled(c->next, m->id))
+		n++;
+
+	/* window geoms */
+	mw = (n == 1) ? m->waw : m->mwfact * m->waw;
+	th = (n > 1) ? m->wah / (n - 1) : 0;
+	if(n > 1 && th < bh)
+		th = m->wah;
+
+	for(i = 0, c = mc = nexttiled(clients, m->id); c; c = nexttiled(c->next, m->id)) {
+		if(i == 0) { /* master */
+			nx = m->wax;
+			ny = m->way;
+			nw = mw - 2 * c->border;
+			nh = m->wah - 2 * c->border;
+		}
+		else {  /* tile window */
+			if(i == 1) {
 				ny = m->way;
-				nw = mw - 2 * c->border;
-				nh = m->wah - 2 * c->border;
-			}
-			else {  /* tile window */
-				if(j == 1) {
-					ny = m->way;
-					nx += mc->w + 2 * mc->border;
-					nw = m->waw - mw - 2 * c->border;
-				}
-				if(j + 1 == n) /* remainder */
-					nh = (m->way + m->wah) - ny - 2 * c->border;
-				else
-					nh = th - 2 * c->border;
+				nx += mc->w + 2 * mc->border;
+				nw = m->waw - mw - 2 * c->border;
 			}
-			fprintf(stderr, "tile(%d, %d, %d, %d)\n", nx, ny, nw, nh);
-			resize(c, nx, ny, nw, nh, RESIZEHINTS);
-			if((RESIZEHINTS) && ((c->h < bh) || (c->h > nh) || (c->w < bh) || (c->w > nw)))
-				/* client doesn't accept size constraints */
-				resize(c, nx, ny, nw, nh, False);
-			if(n > 1 && th != m->wah)
-				ny = c->y + c->h + 2 * c->border;
-
-			j++;
+			if(i + 1 == n) /* remainder */
+				nh = (m->way + m->wah) - ny - 2 * c->border;
+			else
+				nh = th - 2 * c->border;
 		}
+		resize(c, nx, ny, nw, nh, RESIZEHINTS);
+		if((RESIZEHINTS) && ((c->h < bh) || (c->h > nh) || (c->w < bh) || (c->w > nw)))
+			/* client doesn't accept size constraints */
+			resize(c, nx, ny, nw, nh, False);
+		if(n > 1 && th != m->wah)
+			ny = c->y + c->h + 2 * c->border;
+
+		i++;
 	}
-	fprintf(stderr, "done\n");
 }
 void
 togglebar(const char *arg) {
@@ -2045,7 +2043,7 @@ selectmonitor(const char *arg) {
 int
 main(int argc, char *argv[]) {
 	if(argc == 2 && !strcmp("-v", argv[1]))
-		eprint("dwm-"VERSION", © 2006-2007 Anselm R. Garbe, Sander van Dijk, "
+		eprint("dwm-"VERSION", © 2006-2008 Anselm R. Garbe, Sander van Dijk, "
 		       "Jukka Salmi, Premysl Hruby, Szabolcs Nagy, Christof Musik\n");
 	else if(argc != 1)
 		eprint("usage: dwm [-v]\n");