<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -238,6 +238,11 @@ static Window root, barwin;
 /* configuration, allows nested code to access above variables */
 #include &quot;config.h&quot;
 
+static int curtag = 1, prevtag = 1;
+static Layout *lts[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 &lt; LENGTH(tags) ? -1 : 1]; };
 
@@ -1307,7 +1312,7 @@ setlayout(const Arg *arg) {
 	if(!arg || !arg-&gt;v || arg-&gt;v != lt[sellt])
 		sellt ^= 1;
 	if(arg &amp;&amp; arg-&gt;v)
-		lt[sellt] = (Layout *)arg-&gt;v;
+		lt[sellt] = lts[curtag] = (Layout *)arg-&gt;v;
 	if(sel)
 		arrange();
 	else
@@ -1324,7 +1329,7 @@ setmfact(const Arg *arg) {
 	f = arg-&gt;f &lt; 1.0 ? arg-&gt;f + mfact : arg-&gt;f - 1.0;
 	if(f &lt; 0.1 || f &gt; 0.9)
 		return;
-	mfact = f;
+	mfact = mfacts[curtag] = f;
 	arrange();
 }
 
@@ -1373,12 +1378,27 @@ setup(void) {
 	if(!dc.font.set)
 		XSetFont(dpy, dc.gc, dc.font.xfont-&gt;fid);
 
+	/* init mfacts */
+	for(i=0; i &lt; LENGTH(tags) + 1 ; i++) {
+		mfacts[i] = mfact;
+	}
+
+	/* init layouts */
+	for(i=0; i &lt; LENGTH(tags) + 1; i++) {
+		lts[i] = &amp;layouts[0];
+	}
+
+
 	/* init bar */
 	for(blw = i = 0; LENGTH(layouts) &gt; 1 &amp;&amp; i &lt; LENGTH(layouts); i++) {
 		w = TEXTW(layouts[i].symbol);
 		blw = MAX(blw, w);
 	}
 
+	for(i=0; i &lt; LENGTH(tags) + 1; i++) {
+		showbars[i] = showbar;
+ 	}
+
 	wa.override_redirect = 1;
 	wa.background_pixmap = ParentRelative;
 	wa.event_mask = ButtonPressMask|ExposureMask;
@@ -1479,7 +1499,7 @@ tile(void) {
 
 void
 togglebar(const Arg *arg) {
-	showbar = !showbar;
+	showbar = showbars[curtag] = !showbar;
 	updategeom();
 	updatebar();
 	arrange();
@@ -1508,9 +1528,23 @@ toggletag(const Arg *arg) {
 void
 toggleview(const Arg *arg) {
 	unsigned int mask = tagset[seltags] ^ (arg-&gt;ui &amp; TAGMASK);
+	unsigned int i;
 
 	if(mask) {
+		if(mask == ~0) {
+			prevtag = curtag;
+			curtag = 0;
+		}
+		if(!(mask &amp; 1 &lt;&lt; (curtag - 1))) {
+			prevtag = curtag;
+			for (i=0; !(mask &amp; 1 &lt;&lt; i); i++);
+			curtag = i + 1;
+		}
 		tagset[seltags] = mask;
+		lt[sellt] = lts[curtag];
+		mfact = mfacts[curtag];
+		if (showbar != showbars[curtag])
+			togglebar(NULL);
 		clearurgent();
 		arrange();
 	}
@@ -1663,11 +1697,29 @@ updatewmhints(Client *c) {
 
 void
 view(const Arg *arg) {
+	unsigned int i;
+
 	if(arg &amp;&amp; (arg-&gt;i &amp; TAGMASK) == tagset[seltags])
 		return;
 	seltags ^= 1; /* toggle sel tagset */
-	if(arg &amp;&amp; (arg-&gt;ui &amp; TAGMASK))
+	if(arg &amp;&amp; (arg-&gt;ui &amp; TAGMASK)) {
 		tagset[seltags] = arg-&gt;i &amp; TAGMASK;
+		prevtag = curtag;
+		if(arg-&gt;ui == ~0)
+			curtag = 0;
+		else {
+			for (i=0; !(arg-&gt;ui &amp; 1 &lt;&lt; i); i++);
+			curtag = i + 1;
+		}
+	} else {
+		prevtag= curtag ^ prevtag;
+		curtag^= prevtag;
+		prevtag= curtag ^ prevtag;
+	}
+	lt[sellt]= lts[curtag];
+	mfact = mfacts[curtag];
+	if(showbar != showbars[curtag])
+		togglebar(NULL);
 	clearurgent();
 	arrange();
 }</diff>
      <filename>dwm.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>1f62c83b59ece9c1960c641664c18a987d91a3b4</id>
    </parent>
  </parents>
  <author>
    <name>Christian Neukirchen</name>
    <email>chneukirchen@gmail.com</email>
  </author>
  <url>http://github.com/chneukirchen/dwm-chris2/commit/f83156e8b1d5e886edfdc4f898a79d9d144d5b23</url>
  <id>f83156e8b1d5e886edfdc4f898a79d9d144d5b23</id>
  <committed-date>2008-08-02T05:23:36-07:00</committed-date>
  <authored-date>2008-08-02T05:23:36-07:00</authored-date>
  <message>Apply dwm-5.1-pertag.diff</message>
  <tree>d7001346c5a5df5add5dc34220c7d1601f02a08e</tree>
  <committer>
    <name>Christian Neukirchen</name>
    <email>chneukirchen@gmail.com</email>
  </committer>
</commit>
