Updated to also support toggle layout per tag.

/Fredrik


On 9/13/08, Fredrik Ternerot <[EMAIL PROTECTED]> wrote:
> Updated pertag patch for dwm-5.2.
>
--- a/dwm.c	2008-09-14 17:20:52.382689970 +0200
+++ b/dwm.c	2008-09-14 17:26:40.875771413 +0200
@@ -240,6 +240,12 @@ static Window root, barwin;
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
+static int curtag = 1, prevtag = 1;
+static Layout *lts[LENGTH(tags) + 1][2];
+static unsigned int sellts[LENGTH(tags) + 1];
+static double mfacts[LENGTH(tags) + 1];
+static Bool showbars[LENGTH(tags) + 1];
+
 /* compile-time check if all tags fit into an unsigned int bit array. */
 struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; };
 
@@ -1270,9 +1276,9 @@ setclientstate(Client *c, long state) {
 void
 setlayout(const Arg *arg) {
 	if(!arg || !arg->v || arg->v != lt[sellt])
-		sellt ^= 1;
+		sellt = sellts[curtag] ^= 1;
 	if(arg && arg->v)
-		lt[sellt] = (Layout *)arg->v;
+		lt[sellt] = lts[curtag][sellt] = (Layout *)arg->v;
 	if(sel)
 		arrange();
 	else
@@ -1289,7 +1295,7 @@ setmfact(const Arg *arg) {
 	f = arg->f < 1.0 ? arg->f + mfact : arg->f - 1.0;
 	if(f < 0.1 || f > 0.9)
 		return;
-	mfact = f;
+	mfact = mfacts[curtag] = f;
 	arrange();
 }
 
@@ -1337,12 +1343,27 @@ setup(void) {
 	if(!dc.font.set)
 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
 
+	/* init mfacts */
+	for(i=0; i < LENGTH(tags) + 1 ; i++)
+		mfacts[i] = mfact;
+
+	/* init layouts */
+	for(i=0; i < LENGTH(tags) + 1; i++) {
+		lts[i][0] = lt[0];
+		lts[i][1] = lt[1];
+		sellts[i] = 0;
+	}
+
 	/* init bar */
 	for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
 		w = TEXTW(layouts[i].symbol);
 		blw = MAX(blw, w);
 	}
 
+	for(i=0; i < LENGTH(tags) + 1; i++) {
+		showbars[i] = showbar;
+ 	}
+
 	wa.override_redirect = 1;
 	wa.background_pixmap = ParentRelative;
 	wa.event_mask = ButtonPressMask|ExposureMask;
@@ -1457,7 +1478,7 @@ tile(void) {
 
 void
 togglebar(const Arg *arg) {
-	showbar = !showbar;
+	showbar = showbars[curtag] = !showbar;
 	updategeom();
 	updatebar();
 	arrange();
@@ -1490,9 +1511,25 @@ toggletag(const Arg *arg) {
 void
 toggleview(const Arg *arg) {
 	unsigned int mask = tagset[seltags] ^ (arg->ui & TAGMASK);
+	unsigned int i;
 
 	if(mask) {
+		if(mask == ~0) {
+			prevtag = curtag;
+			curtag = 0;
+		}
+		if(!(mask & 1 << (curtag - 1))) {
+			prevtag = curtag;
+			for (i=0; !(mask & 1 << i); i++);
+			curtag = i + 1;
+		}
 		tagset[seltags] = mask;
+		sellt = sellts[curtag];
+		lt[0] = lts[curtag][0];
+		lt[1] = lts[curtag][1];
+		mfact = mfacts[curtag];
+		if (showbar != showbars[curtag])
+			togglebar(NULL);
 		clearurgent();
 		arrange();
 	}
@@ -1661,11 +1698,31 @@ updatewmhints(Client *c) {
 
 void
 view(const Arg *arg) {
+	unsigned int i;
+
 	if((arg->ui & TAGMASK) == tagset[seltags])
 		return;
 	seltags ^= 1; /* toggle sel tagset */
-	if(arg->ui & TAGMASK)
+	if(arg->ui & TAGMASK) {
 		tagset[seltags] = arg->ui & TAGMASK;
+		prevtag = curtag;
+		if(arg->ui == ~0)
+			curtag = 0;
+		else {
+			for (i=0; !(arg->ui & 1 << i); i++);
+			curtag = i + 1;
+		}
+	} else {
+		prevtag= curtag ^ prevtag;
+		curtag^= prevtag;
+		prevtag= curtag ^ prevtag;
+	}
+	sellt = sellts[curtag];
+	lt[0]= lts[curtag][0];
+	lt[1]= lts[curtag][1];
+	mfact = mfacts[curtag];
+	if(showbar != showbars[curtag])
+		togglebar(NULL);
 	clearurgent();
 	arrange();
 }

Reply via email to