--- 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(); }