On Tue 06-11-2007 15:27 -0500, Jeremy O'Brien wrote:

> I just found a bug. Your patch gets confused if you try any
> viewprevtag() magic. For example, turn the bar off on tag 1, and
> viewprevtag(). The bar stays magically turned off. Probably not the
> intended behavior. :) Thank you otherwise for your patch!

I fixed the bug and updated float-border, moveresize, nmaster and tagall
to 4.7.

Good night.
-- 
Jan Christoph Ebersbach
Fear God and keep his commandments, for this is the whole duty of man.
Eccl 12,13
diff -r ac233c362502 dwm.c
--- a/dwm.c	Sat Sep 22 21:55:19 2007 +0200
+++ b/dwm.c	Sun Sep 23 01:42:54 2007 +0200
@@ -169,6 +169,7 @@ void setup(void);
 void setup(void);
 void spawn(const char *arg);
 void tag(const char *arg);
+void tagall(const char *arg);
 unsigned int textnw(const char *text, unsigned int len);
 unsigned int textw(const char *text);
 void tile(void);
@@ -1549,6 +1550,30 @@ tag(const char *arg) {
 	arrange();
 }
 
+void
+tagall(const char *arg) {
+	if (!clients)
+		return;
+	int floating_only = arg && arg[0] == 'F' ? 1 : 0;
+	int tag = arg ? atoi(arg + floating_only) : 0;
+	int j;
+	Client* c;
+	if(tag >= 0 && tag < LENGTH(tags))
+		for(c = clients; c; c = c->next)
+		{
+			if(!floating_only || c->isfloating)
+				for(j = 0; j < LENGTH(tags); j++)
+				{
+					if(c->tags[j] && seltags[j])
+					{
+						c->tags[j] = !c->tags[j];
+						c->tags[tag-1] = True;
+					}
+				}
+		}
+	arrange();
+}
+
 unsigned int
 textnw(const char *text, unsigned int len) {
 	XRectangle r;
diff -r 767e76426fda dwm.c
--- a/dwm.c	Sat Nov 10 20:21:22 2007 +0100
+++ b/dwm.c	Sun Nov 11 22:38:11 2007 +0100
@@ -125,6 +125,7 @@ void configure(Client *c);
 void configure(Client *c);
 void configurenotify(XEvent *e);
 void configurerequest(XEvent *e);
+void deinitpertag(void);
 void destroynotify(XEvent *e);
 void detach(Client *c);
 void detachstack(Client *c);
@@ -194,11 +195,11 @@ void zoom(const char *arg);
 
 /* variables */
 char stext[256];
-double mwfact;
 int screen, sx, sy, sw, sh, wax, way, waw, wah;
 int (*xerrorxlib)(Display *, XErrorEvent *);
-unsigned int bh, bpos;
+unsigned int bh;
 unsigned int blw = 0;
+unsigned int csel = 0;
 unsigned int numlockmask = 0;
 void (*handler[LASTEvent]) (XEvent *) = {
 	[ButtonPress] = buttonpress,
@@ -229,6 +230,11 @@ Layout *layout = NULL;
 Layout *layout = NULL;
 Window barwin, root;
 Regs *regs = NULL;
+
+unsigned int *bpos;
+unsigned int *ltidxs;
+unsigned int *nmasters;
+double *mwfacts;
 
 /* configuration, allows nested code to access above variables */
 #include "config.h"
@@ -276,7 +282,7 @@ arrange(void) {
 			unban(c);
 		else
 			ban(c);
-	layout->arrange();
+	layouts[ltidxs[csel]].arrange();
 	focus(NULL);
 	restack();
 }
@@ -337,20 +343,20 @@ buttonpress(XEvent *e) {
 		if(CLEANMASK(ev->state) != MODKEY)
 			return;
 		if(ev->button == Button1) {
-			if((layout->arrange == floating) || c->isfloating)
+			if((layouts[ltidxs[csel]].arrange == floating) || c->isfloating)
 				restack();
 			else
 				togglefloating(NULL);
 			movemouse(c);
 		}
 		else if(ev->button == Button2) {
-			if((floating != layout->arrange) && c->isfloating)
+			if((floating != layouts[ltidxs[csel]].arrange) && c->isfloating)
 				togglefloating(NULL);
 			else
 				zoom(NULL);
 		}
 		else if(ev->button == Button3 && !c->isfixed) {
-			if((floating == layout->arrange) || c->isfloating)
+			if((floating == layouts[ltidxs[csel]].arrange) || c->isfloating)
 				restack();
 			else
 				togglefloating(NULL);
@@ -395,6 +401,7 @@ cleanup(void) {
 	XFreeCursor(dpy, cursor[CurMove]);
 	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
 	XSync(dpy, False);
+	deinitpertag();
 }
 
 void
@@ -466,7 +473,7 @@ configurerequest(XEvent *e) {
 		c->ismax = False;
 		if(ev->value_mask & CWBorderWidth)
 			c->border = ev->border_width;
-		if(c->isfixed || c->isfloating || (floating == layout->arrange)) {
+		if(c->isfixed || c->isfloating || (floating == layouts[ltidxs[csel]].arrange)) {
 			if(ev->value_mask & CWX)
 				c->x = ev->x;
 			if(ev->value_mask & CWY)
@@ -499,6 +506,15 @@ configurerequest(XEvent *e) {
 		XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
 	}
 	XSync(dpy, False);
+}
+
+void
+deinitpertag(void)
+{
+	free(bpos);
+	free(ltidxs);
+	free(mwfacts);
+	free(nmasters);
 }
 
 void
@@ -547,7 +563,7 @@ drawbar(void) {
 		dc.x += dc.w;
 	}
 	dc.w = blw;
-	drawtext(layout->symbol, dc.norm);
+	drawtext(layouts[ltidxs[csel]].symbol, dc.norm);
 	x = dc.x + dc.w;
 	dc.w = textw(stext);
 	dc.x = sw - dc.w;
@@ -1264,9 +1280,9 @@ restack(void) {
 	drawbar();
 	if(!sel)
 		return;
-	if(sel->isfloating || (layout->arrange == floating))
+	if(sel->isfloating || (layouts[ltidxs[csel]].arrange == floating))
 		XRaiseWindow(dpy, sel->win);
-	if(layout->arrange != floating) {
+	if(layouts[ltidxs[csel]].arrange != floating) {
 		wc.stack_mode = Below;
 		wc.sibling = barwin;
 		if(!sel->isfloating) {
@@ -1384,8 +1400,8 @@ setlayout(const char *arg) {
 	unsigned int i;
 
 	if(!arg) {
-		if(++layout == &layouts[LENGTH(layouts)])
-			layout = &layouts[0];
+		if(&layouts[++ltidxs[csel]] == &layouts[LENGTH(layouts)])
+			ltidxs[csel] = 0;;
 	}
 	else {
 		for(i = 0; i < LENGTH(layouts); i++)
@@ -1393,7 +1409,7 @@ setlayout(const char *arg) {
 				break;
 		if(i == LENGTH(layouts))
 			return;
-		layout = &layouts[i];
+		ltidxs[csel] = i;
 	}
 	if(sel)
 		arrange();
@@ -1409,16 +1425,16 @@ setmwfact(const char *arg) {
 		return;
 	/* arg handling, manipulate mwfact */
 	if(arg == NULL)
-		mwfact = MWFACT;
+		mwfacts[csel] = MWFACT;
 	else if(sscanf(arg, "%lf", &delta) == 1) {
 		if(arg[0] == '+' || arg[0] == '-')
-			mwfact += delta;
+			mwfacts[csel] += delta;
 		else
-			mwfact = delta;
-		if(mwfact < 0.1)
-			mwfact = 0.1;
-		else if(mwfact > 0.9)
-			mwfact = 0.9;
+			mwfacts[csel] = delta;
+		if(mwfacts[csel] < 0.1)
+			mwfacts[csel] = 0.1;
+		else if(mwfacts[csel] > 0.9)
+			mwfacts[csel] = 0.9;
 	}
 	arrange();
 }
@@ -1486,8 +1502,13 @@ setup(void) {
 	dc.h = bh = dc.font.height + 2;
 
 	/* init layouts */
-	mwfact = MWFACT;
-	layout = &layouts[0];
+	ltidxs = (unsigned int*)emallocz(sizeof(unsigned int) * LENGTH(tags));
+	mwfacts = (double*)emallocz(sizeof(double) * LENGTH(tags));
+	for(i = 0; i < LENGTH(tags); i++)
+	{
+		ltidxs[i] = 0;
+		mwfacts[i] = MWFACT;
+	}
 	for(blw = i = 0; i < LENGTH(layouts); i++) {
 		j = textw(layouts[i].symbol);
 		if(j > blw)
@@ -1495,7 +1516,9 @@ setup(void) {
 	}
 
 	/* init bar */
-	bpos = BARPOS;
+	bpos = (unsigned int*)emallocz(sizeof(unsigned int) * LENGTH(tags));
+	for(i = 0; i < LENGTH(tags); i++)
+		bpos[i] = BARPOS;
 	wa.override_redirect = 1;
 	wa.background_pixmap = ParentRelative;
 	wa.event_mask = ButtonPressMask | ExposureMask;
@@ -1578,8 +1601,8 @@ tile(void) {
 		n++;
 
 	/* window geoms */
-	mw = (n == 1) ? waw : mwfact * waw;
-	th = (n > 1) ? wah / (n - 1) : 0;
+	mw = (n == 1) ? waw : mwfacts[csel] * waw;
+	th = (n > nmasters[csel]) ? wah / (n - nmasters[csel]) : 0;
 	if(n > 1 && th < bh)
 		th = wah;
 
@@ -1614,10 +1637,10 @@ tile(void) {
 
 void
 togglebar(const char *arg) {
-	if(bpos == BarOff)
-		bpos = (BARPOS == BarOff) ? BarTop : BARPOS;
+	if(bpos[csel] == BarOff)
+		bpos[csel] = (BARPOS == BarOff) ? BarTop : BARPOS;
 	else
-		bpos = BarOff;
+		bpos[csel] = BarOff;
 	updatebarpos();
 	arrange();
 }
@@ -1639,7 +1662,7 @@ togglemax(const char *arg) {
 	if(!sel || sel->isfixed)
 		return;
 	if((sel->ismax = !sel->ismax)) {
-		if((layout->arrange == floating) || sel->isfloating)
+		if((layouts[ltidxs[csel]].arrange == floating) || sel->isfloating)
 			sel->wasfloating = True;
 		else {
 			togglefloating(NULL);
@@ -1681,8 +1704,12 @@ toggleview(const char *arg) {
 	i = idxoftag(arg);
 	seltags[i] = !seltags[i];
 	for(j = 0; j < LENGTH(tags) && !seltags[j]; j++);
-	if(j == LENGTH(tags))
+	if(j == LENGTH(tags)) {
 		seltags[i] = True; /* at least one tag must be viewed */
+		j = i;
+	}
+	if(csel == i)
+		csel = j;
 	arrange();
 }
 
@@ -1734,7 +1761,7 @@ updatebarpos(void) {
 	way = sy;
 	wah = sh;
 	waw = sw;
-	switch(bpos) {
+	switch(bpos[csel]) {
 	default:
 		wah -= bh;
 		way += bh;
@@ -1844,22 +1871,33 @@ xerrorstart(Display *dsply, XErrorEvent 
 
 void
 view(const char *arg) {
-	unsigned int i;
+	unsigned int i, prevcsel;
 
 	memcpy(prevtags, seltags, sizeof seltags);
 	for(i = 0; i < LENGTH(tags); i++)
 		seltags[i] = (NULL == arg);
 	seltags[idxoftag(arg)] = True;
+	prevcsel = csel;
+	csel = idxoftag(arg);
+	if (bpos[prevcsel] != bpos[csel])
+		updatebarpos();
 	arrange();
 }
 
 void
 viewprevtag(const char *arg) {
 	static Bool tmp[LENGTH(tags)];
+	unsigned int i, prevcsel;
 
+	i = 0;
+	while(i < LENGTH(tags) && !prevtags[i]) i++;
+	prevcsel = csel;
+	csel = i;
 	memcpy(tmp, seltags, sizeof seltags);
 	memcpy(seltags, prevtags, sizeof seltags);
 	memcpy(prevtags, tmp, sizeof seltags);
+	if (bpos[prevcsel] != bpos[csel])
+		updatebarpos();
 	arrange();
 }
 
diff -r 699b25e7dd64 dwm.c
--- a/dwm.c	Sun Nov 11 22:42:35 2007 +0100
+++ b/dwm.c	Sun Nov 11 22:43:46 2007 +0100
@@ -125,6 +125,7 @@ void configure(Client *c);
 void configure(Client *c);
 void configurenotify(XEvent *e);
 void configurerequest(XEvent *e);
+void deinitpertag(void);
 void destroynotify(XEvent *e);
 void detach(Client *c);
 void detachstack(Client *c);
@@ -195,12 +196,11 @@ void zoom(const char *arg);
 
 /* variables */
 char stext[256];
-double mwfact;
-unsigned int nmaster;
 int screen, sx, sy, sw, sh, wax, way, waw, wah;
 int (*xerrorxlib)(Display *, XErrorEvent *);
-unsigned int bh, bpos;
+unsigned int bh;
 unsigned int blw = 0;
+unsigned int csel = 0;
 unsigned int numlockmask = 0;
 void (*handler[LASTEvent]) (XEvent *) = {
 	[ButtonPress] = buttonpress,
@@ -231,6 +231,11 @@ Layout *layout = NULL;
 Layout *layout = NULL;
 Window barwin, root;
 Regs *regs = NULL;
+
+unsigned int *bpos;
+unsigned int *ltidxs;
+unsigned int *nmasters;
+double *mwfacts;
 
 /* configuration, allows nested code to access above variables */
 #include "config.h"
@@ -278,7 +283,7 @@ arrange(void) {
 			unban(c);
 		else
 			ban(c);
-	layout->arrange();
+	layouts[ltidxs[csel]].arrange();
 	focus(NULL);
 	restack();
 }
@@ -339,20 +344,20 @@ buttonpress(XEvent *e) {
 		if(CLEANMASK(ev->state) != MODKEY)
 			return;
 		if(ev->button == Button1) {
-			if((layout->arrange == floating) || c->isfloating)
+			if((layouts[ltidxs[csel]].arrange == floating) || c->isfloating)
 				restack();
 			else
 				togglefloating(NULL);
 			movemouse(c);
 		}
 		else if(ev->button == Button2) {
-			if((floating != layout->arrange) && c->isfloating)
+			if((floating != layouts[ltidxs[csel]].arrange) && c->isfloating)
 				togglefloating(NULL);
 			else
 				zoom(NULL);
 		}
 		else if(ev->button == Button3 && !c->isfixed) {
-			if((floating == layout->arrange) || c->isfloating)
+			if((floating == layouts[ltidxs[csel]].arrange) || c->isfloating)
 				restack();
 			else
 				togglefloating(NULL);
@@ -397,6 +402,7 @@ cleanup(void) {
 	XFreeCursor(dpy, cursor[CurMove]);
 	XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
 	XSync(dpy, False);
+	deinitpertag();
 }
 
 void
@@ -468,7 +474,7 @@ configurerequest(XEvent *e) {
 		c->ismax = False;
 		if(ev->value_mask & CWBorderWidth)
 			c->border = ev->border_width;
-		if(c->isfixed || c->isfloating || (floating == layout->arrange)) {
+		if(c->isfixed || c->isfloating || (floating == layouts[ltidxs[csel]].arrange)) {
 			if(ev->value_mask & CWX)
 				c->x = ev->x;
 			if(ev->value_mask & CWY)
@@ -501,6 +507,15 @@ configurerequest(XEvent *e) {
 		XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
 	}
 	XSync(dpy, False);
+}
+
+void
+deinitpertag(void)
+{
+	free(bpos);
+	free(ltidxs);
+	free(mwfacts);
+	free(nmasters);
 }
 
 void
@@ -549,7 +564,7 @@ drawbar(void) {
 		dc.x += dc.w;
 	}
 	dc.w = blw;
-	drawtext(layout->symbol, dc.norm);
+	drawtext(layouts[ltidxs[csel]].symbol, dc.norm);
 	x = dc.x + dc.w;
 	dc.w = textw(stext);
 	dc.x = sw - dc.w;
@@ -1266,9 +1281,9 @@ restack(void) {
 	drawbar();
 	if(!sel)
 		return;
-	if(sel->isfloating || (layout->arrange == floating))
+	if(sel->isfloating || (layouts[ltidxs[csel]].arrange == floating))
 		XRaiseWindow(dpy, sel->win);
-	if(layout->arrange != floating) {
+	if(layouts[ltidxs[csel]].arrange != floating) {
 		wc.stack_mode = Below;
 		wc.sibling = barwin;
 		if(!sel->isfloating) {
@@ -1386,8 +1401,8 @@ setlayout(const char *arg) {
 	unsigned int i;
 
 	if(!arg) {
-		if(++layout == &layouts[LENGTH(layouts)])
-			layout = &layouts[0];
+		if(&layouts[++ltidxs[csel]] == &layouts[LENGTH(layouts)])
+			ltidxs[csel] = 0;;
 	}
 	else {
 		for(i = 0; i < LENGTH(layouts); i++)
@@ -1395,7 +1410,7 @@ setlayout(const char *arg) {
 				break;
 		if(i == LENGTH(layouts))
 			return;
-		layout = &layouts[i];
+		ltidxs[csel] = i;
 	}
 	if(sel)
 		arrange();
@@ -1411,16 +1426,16 @@ setmwfact(const char *arg) {
 		return;
 	/* arg handling, manipulate mwfact */
 	if(arg == NULL)
-		mwfact = MWFACT;
+		mwfacts[csel] = MWFACT;
 	else if(sscanf(arg, "%lf", &delta) == 1) {
 		if(arg[0] == '+' || arg[0] == '-')
-			mwfact += delta;
+			mwfacts[csel] += delta;
 		else
-			mwfact = delta;
-		if(mwfact < 0.1)
-			mwfact = 0.1;
-		else if(mwfact > 0.9)
-			mwfact = 0.9;
+			mwfacts[csel] = delta;
+		if(mwfacts[csel] < 0.1)
+			mwfacts[csel] = 0.1;
+		else if(mwfacts[csel] > 0.9)
+			mwfacts[csel] = 0.9;
 	}
 	arrange();
 }
@@ -1429,15 +1444,15 @@ setnmaster(const char *arg) {
 setnmaster(const char *arg) {
 	int i;
 
-	if(layout->arrange != tile)
+	if(layouts[ltidxs[csel]].arrange != tile)
 		return;
 	if(!arg)
-		nmaster = NMASTER;
+		nmasters[csel] = NMASTER;
 	else {
 		i = atoi(arg);
-		if((nmaster + i) < 1 || wah / (nmaster + i) <= 2 * BORDERPX)
+		if((nmasters[csel] + i) < 1 || wah / (nmasters[csel] + i) <= 2 * BORDERPX)
 			return;
-		nmaster += i;
+		nmasters[csel] += i;
 	}
 	if(sel)
 		arrange();
@@ -1508,9 +1523,15 @@ setup(void) {
 	dc.h = bh = dc.font.height + 2;
 
 	/* init layouts */
-	mwfact = MWFACT;
-	nmaster = NMASTER;
-	layout = &layouts[0];
+	ltidxs = (unsigned int*)emallocz(sizeof(unsigned int) * LENGTH(tags));
+	mwfacts = (double*)emallocz(sizeof(double) * LENGTH(tags));
+	nmasters = (unsigned int*)emallocz(sizeof(unsigned int) * LENGTH(tags));
+	for(i = 0; i < LENGTH(tags); i++)
+	{
+		ltidxs[i] = 0;
+		mwfacts[i] = MWFACT;
+		nmasters[i] = NMASTER;
+	}
 	for(blw = i = 0; i < LENGTH(layouts); i++) {
 		j = textw(layouts[i].symbol);
 		if(j > blw)
@@ -1518,7 +1539,9 @@ setup(void) {
 	}
 
 	/* init bar */
-	bpos = BARPOS;
+	bpos = (unsigned int*)emallocz(sizeof(unsigned int) * LENGTH(tags));
+	for(i = 0; i < LENGTH(tags); i++)
+		bpos[i] = BARPOS;
 	wa.override_redirect = 1;
 	wa.background_pixmap = ParentRelative;
 	wa.event_mask = ButtonPressMask | ExposureMask;
@@ -1601,10 +1624,10 @@ tile(void) {
 		n++;
 
 	/* window geoms */
-	mh = (n <= nmaster) ? wah / (n > 0 ? n : 1) : wah / nmaster;
-	mw = (n <= nmaster) ? waw : mwfact * waw;
-	th = (n > nmaster) ? wah / (n - nmaster) : 0;
-	if(n > nmaster && th < bh)
+	mh = (n <= nmasters[csel]) ? wah / (n > 0 ? n : 1) : wah / nmasters[csel];
+	mw = (n == 1) ? waw : mwfacts[csel] * waw;
+	th = (n > nmasters[csel]) ? wah / (n - nmasters[csel]) : 0;
+	if(n > nmasters[csel] && th < bh)
 		th = wah;
 
 	nx = wax;
@@ -1612,17 +1635,17 @@ tile(void) {
 	nw = 0; /* gcc stupidity requires this */
 	for(i = 0, c = mc = nexttiled(clients); c; c = nexttiled(c->next), i++) {
 		c->ismax = False;
-		if(i < nmaster) { /* master */
+		if(i < nmasters[csel]) { /* master */
 			ny = way + i * mh;
 			nw = mw - 2 * c->border;
 			nh = wah - 2 * c->border;
 			nh = mh;
-			if(i + 1 == (n < nmaster ? n : nmaster)) /* remainder */
+			if(i + 1 == (n < nmasters[csel] ? n : nmasters[csel])) /* remainder */
 				nh = wah - mh * i;
 			nh -= 2 * c->border;
 		}
 		else {  /* tile window */
-			if(i == nmaster) {
+			if(i == nmasters[csel]) {
 				ny = way;
 				nx += mc->w + 2 * mc->border;
 				nw = waw - nx - 2 * c->border;
@@ -1636,17 +1659,17 @@ tile(void) {
 		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 > nmaster && th != wah)
+		if(n > nmasters[csel] && th != wah)
 			ny = c->y + c->h + 2 * c->border;
 	}
 }
 
 void
 togglebar(const char *arg) {
-	if(bpos == BarOff)
-		bpos = (BARPOS == BarOff) ? BarTop : BARPOS;
+	if(bpos[csel] == BarOff)
+		bpos[csel] = (BARPOS == BarOff) ? BarTop : BARPOS;
 	else
-		bpos = BarOff;
+		bpos[csel] = BarOff;
 	updatebarpos();
 	arrange();
 }
@@ -1668,7 +1691,7 @@ togglemax(const char *arg) {
 	if(!sel || sel->isfixed)
 		return;
 	if((sel->ismax = !sel->ismax)) {
-		if((layout->arrange == floating) || sel->isfloating)
+		if((layouts[ltidxs[csel]].arrange == floating) || sel->isfloating)
 			sel->wasfloating = True;
 		else {
 			togglefloating(NULL);
@@ -1710,8 +1733,12 @@ toggleview(const char *arg) {
 	i = idxoftag(arg);
 	seltags[i] = !seltags[i];
 	for(j = 0; j < LENGTH(tags) && !seltags[j]; j++);
-	if(j == LENGTH(tags))
+	if(j == LENGTH(tags)) {
 		seltags[i] = True; /* at least one tag must be viewed */
+		j = i;
+	}
+	if(csel == i)
+		csel = j;
 	arrange();
 }
 
@@ -1763,7 +1790,7 @@ updatebarpos(void) {
 	way = sy;
 	wah = sh;
 	waw = sw;
-	switch(bpos) {
+	switch(bpos[csel]) {
 	default:
 		wah -= bh;
 		way += bh;
@@ -1873,22 +1900,33 @@ xerrorstart(Display *dsply, XErrorEvent 
 
 void
 view(const char *arg) {
-	unsigned int i;
+	unsigned int i, prevcsel;
 
 	memcpy(prevtags, seltags, sizeof seltags);
 	for(i = 0; i < LENGTH(tags); i++)
 		seltags[i] = (NULL == arg);
 	seltags[idxoftag(arg)] = True;
+	prevcsel = csel;
+	csel = idxoftag(arg);
+	if (bpos[prevcsel] != bpos[csel])
+		updatebarpos();
 	arrange();
 }
 
 void
 viewprevtag(const char *arg) {
 	static Bool tmp[LENGTH(tags)];
+	unsigned int i, prevcsel;
 
+	i = 0;
+	while(i < LENGTH(tags) && !prevtags[i]) i++;
+	prevcsel = csel;
+	csel = i;
 	memcpy(tmp, seltags, sizeof seltags);
 	memcpy(seltags, prevtags, sizeof seltags);
 	memcpy(prevtags, tmp, sizeof seltags);
+	if (bpos[prevcsel] != bpos[csel])
+		updatebarpos();
 	arrange();
 }
 
diff -r 767e76426fda config.def.h
--- a/config.def.h	Sat Nov 10 20:21:22 2007 +0100
+++ b/config.def.h	Sun Nov 11 22:42:15 2007 +0100
@@ -24,6 +24,7 @@ Rule rules[] = {
 
 /* layout(s) */
 #define MWFACT			0.6	/* master width factor [0.1 .. 0.9] */
+#define NMASTER			1	/* clients in master area */
 #define RESIZEHINTS		True	/* False - respect size hints in tiled resizals */
 #define SNAP			32	/* snap pixel */
 Layout layouts[] = {
@@ -46,6 +47,8 @@ Key keys[] = {
 	{ MODKEY,			XK_k,		focusprev,	NULL },
 	{ MODKEY,			XK_h,		setmwfact,	"-0.05" },
 	{ MODKEY,			XK_l,		setmwfact,	"+0.05" },
+	{ MODKEY|ShiftMask,		XK_h,		setnmaster,	"-1" }, \
+	{ MODKEY|ShiftMask,		XK_l,		setnmaster,	"+1" }, \
 	{ MODKEY,			XK_m,		togglemax,	NULL },
 	{ MODKEY,			XK_Return,	zoom,		NULL },
 	{ MODKEY,			XK_Tab,		viewprevtag,	NULL },
diff -r 767e76426fda dwm.1
--- a/dwm.1	Sat Nov 10 20:21:22 2007 +0100
+++ b/dwm.1	Sun Nov 11 22:42:15 2007 +0100
@@ -80,6 +80,12 @@ Increases the master area width about 5%
 .B Mod1\-m
 Toggles maximization of current window.
 .TP
+.B Mod1\-Shift\-h
+Decrease the number of windows in the master area (tiled layout only).
+.TP
+.B Mod1\-Shift\-l
+Increase the number of windows in the master area (tiled layout only).
+.TP
 .B Mod1\-Shift\-[1..n]
 Apply
 .RB nth
diff -r 767e76426fda dwm.c
--- a/dwm.c	Sat Nov 10 20:21:22 2007 +0100
+++ b/dwm.c	Sun Nov 11 22:42:16 2007 +0100
@@ -168,6 +168,7 @@ void setclientstate(Client *c, long stat
 void setclientstate(Client *c, long state);
 void setlayout(const char *arg);
 void setmwfact(const char *arg);
+void setnmaster(const char *arg);
 void setup(void);
 void spawn(const char *arg);
 void tag(const char *arg);
@@ -195,6 +196,7 @@ void zoom(const char *arg);
 /* variables */
 char stext[256];
 double mwfact;
+unsigned int nmaster;
 int screen, sx, sy, sw, sh, wax, way, waw, wah;
 int (*xerrorxlib)(Display *, XErrorEvent *);
 unsigned int bh, bpos;
@@ -1424,6 +1426,26 @@ setmwfact(const char *arg) {
 }
 
 void
+setnmaster(const char *arg) {
+	int i;
+
+	if(layout->arrange != tile)
+		return;
+	if(!arg)
+		nmaster = NMASTER;
+	else {
+		i = atoi(arg);
+		if((nmaster + i) < 1 || wah / (nmaster + i) <= 2 * BORDERPX)
+			return;
+		nmaster += i;
+	}
+	if(sel)
+		arrange();
+	else
+		drawbar();
+}
+
+void
 setup(void) {
 	int d;
 	unsigned int i, j, mask;
@@ -1487,6 +1509,7 @@ setup(void) {
 
 	/* init layouts */
 	mwfact = MWFACT;
+	nmaster = NMASTER;
 	layout = &layouts[0];
 	for(blw = i = 0; i < LENGTH(layouts); i++) {
 		j = textw(layouts[i].symbol);
@@ -1570,7 +1593,7 @@ textw(const char *text) {
 
 void
 tile(void) {
-	unsigned int i, n, nx, ny, nw, nh, mw, th;
+	unsigned int i, n, nx, ny, nw, nh, mw, mh, th;
 	Client *c, *mc;
 
 	domwfact = dozoom = True;
@@ -1578,9 +1601,10 @@ tile(void) {
 		n++;
 
 	/* window geoms */
-	mw = (n == 1) ? waw : mwfact * waw;
-	th = (n > 1) ? wah / (n - 1) : 0;
-	if(n > 1 && th < bh)
+	mh = (n <= nmaster) ? wah / (n > 0 ? n : 1) : wah / nmaster;
+	mw = (n <= nmaster) ? waw : mwfact * waw;
+	th = (n > nmaster) ? wah / (n - nmaster) : 0;
+	if(n > nmaster && th < bh)
 		th = wah;
 
 	nx = wax;
@@ -1588,12 +1612,17 @@ tile(void) {
 	nw = 0; /* gcc stupidity requires this */
 	for(i = 0, c = mc = nexttiled(clients); c; c = nexttiled(c->next), i++) {
 		c->ismax = False;
-		if(i == 0) { /* master */
+		if(i < nmaster) { /* master */
+			ny = way + i * mh;
 			nw = mw - 2 * c->border;
 			nh = wah - 2 * c->border;
+			nh = mh;
+			if(i + 1 == (n < nmaster ? n : nmaster)) /* remainder */
+				nh = wah - mh * i;
+			nh -= 2 * c->border;
 		}
 		else {  /* tile window */
-			if(i == 1) {
+			if(i == nmaster) {
 				ny = way;
 				nx += mc->w + 2 * mc->border;
 				nw = waw - nx - 2 * c->border;
@@ -1607,7 +1636,7 @@ tile(void) {
 		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 != wah)
+		if(n > nmaster && th != wah)
 			ny = c->y + c->h + 2 * c->border;
 	}
 }
diff -r 3027df4b2c0d dwm.c
--- a/dwm.c	Thu Sep 27 20:08:21 2007 +0200
+++ b/dwm.c	Sat Sep 29 13:20:10 2007 +0200
@@ -156,6 +156,7 @@ void mappingnotify(XEvent *e);
 void mappingnotify(XEvent *e);
 void maprequest(XEvent *e);
 void movemouse(Client *c);
+void moveresize(const char *arg);
 Client *nexttiled(Client *c);
 void propertynotify(XEvent *e);
 void quit(const char *arg);
@@ -1120,6 +1121,39 @@ movemouse(Client *c) {
 	}
 }
 
+void
+moveresize(const char *arg) {
+	int x, y, w, h, nx, ny, nw, nh, ox, oy, ow, oh;
+	char xAbs, yAbs, wAbs, hAbs;
+	int mx, my, dx, dy, nmx, nmy;
+	unsigned int dui;
+	Window dummy;
+
+	if (layout->arrange != floating)
+		if (!sel || !sel->isfloating || !arg)
+			return;
+	if(sscanf(arg, "%d%c %d%c %d%c %d%c", &x, &xAbs, &y, &yAbs, &w, &wAbs, &h, &hAbs) != 8)
+		return;
+	nx = xAbs == 'X' ? x : sel->x + x;
+	ny = yAbs == 'Y' ? y : sel->y + y;
+	nw = wAbs == 'W' ? w : sel->w + w;
+	nh = hAbs == 'H' ? h : sel->h + h;
+
+	ox = sel->x;
+	oy = sel->y;
+	ow = sel->w;
+	oh = sel->h;
+
+	Bool xqp = XQueryPointer(dpy, root, &dummy, &dummy, &mx, &my, &dx, &dy, &dui);
+	resize(sel, nx, ny, nw, nh, True);
+	if (xqp && ox <= mx && (ox + ow) >= mx && oy <= my && (oy + oh) >= my)
+	{
+		nmx = mx-ox+sel->w-ow-1 < 0 ? 0 : mx-ox+sel->w-ow-1;
+		nmy = my-oy+sel->h-oh-1 < 0 ? 0 : my-oy+sel->h-oh-1;
+		XWarpPointer(dpy, None, sel->win, 0, 0, 0, 0, nmx, nmy);
+	}
+}
+
 Client *
 nexttiled(Client *c) {
 	for(; c && (c->isfloating || !isvisible(c)); c = c->next);
diff -r 107746bd83f0 config.def.h
--- a/config.def.h	Fri Oct 05 18:30:01 2007 +0200
+++ b/config.def.h	Sat Oct 06 10:27:54 2007 +0200
@@ -10,6 +10,8 @@
 #define SELBORDERCOLOR		"#0066ff"
 #define SELBGCOLOR		"#0066ff"
 #define SELFGCOLOR		"#ffffff"
+#define FLOATNORMBORDERCOLOR		NORMBORDERCOLOR
+#define FLOATSELBORDERCOLOR		SELBORDERCOLOR
 
 /* tagging */
 const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "www" };
diff -r 107746bd83f0 dwm.c
--- a/dwm.c	Fri Oct 05 18:30:01 2007 +0200
+++ b/dwm.c	Sat Oct 06 10:27:54 2007 +0200
@@ -51,7 +51,7 @@
 /* enums */
 enum { BarTop, BarBot, BarOff };			/* bar position */
 enum { CurNormal, CurResize, CurMove, CurLast };	/* cursor */
-enum { ColBorder, ColFG, ColBG, ColLast };		/* color */
+enum { ColBorder, ColFG, ColBG, ColBorderFloat, ColLast };		/* color */
 enum { NetSupported, NetWMName, NetLast };		/* EWMH atoms */
 enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
 
@@ -689,7 +689,10 @@ focus(Client *c) {
 		for(c = stack; c && !isvisible(c); c = c->snext);
 	if(sel && sel != c) {
 		grabbuttons(sel, False);
-		XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
+		if(sel->isfloating)
+			XSetWindowBorder(dpy, sel->win, dc.norm[ColBorderFloat]);
+		else
+			XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
 	}
 	if(c) {
 		detachstack(c);
@@ -701,7 +704,10 @@ focus(Client *c) {
 	if(!selscreen)
 		return;
 	if(c) {
-		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
+		if(c->isfloating)
+			XSetWindowBorder(dpy, c->win, dc.sel[ColBorderFloat]);
+		else
+			XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
 		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 	}
 	else
@@ -1475,9 +1481,11 @@ setup(void) {
 	dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR);
 	dc.norm[ColBG] = getcolor(NORMBGCOLOR);
 	dc.norm[ColFG] = getcolor(NORMFGCOLOR);
+	dc.norm[ColBorderFloat] = getcolor(FLOATNORMBORDERCOLOR);
 	dc.sel[ColBorder] = getcolor(SELBORDERCOLOR);
 	dc.sel[ColBG] = getcolor(SELBGCOLOR);
 	dc.sel[ColFG] = getcolor(SELFGCOLOR);
+	dc.sel[ColBorderFloat] = getcolor(FLOATSELBORDERCOLOR);
 	initfont(FONT);
 	dc.h = bh = dc.font.height + 2;
 

Attachment: signature.asc
Description: Digital signature

Reply via email to