diff -uNrp dwm.colstack/dwm.c dwm.pertag/dwm.c --- dwm.colstack/dwm.c 2007-09-19 13:35:50.000000000 +0100 +++ dwm.pertag/dwm.c 2007-09-20 11:22:32.000000000 +0100 @@ -194,13 +194,14 @@ void zoom(const char *arg); /* variables */ char stext[256]; -double mwfact; -unsigned int nmaster, nrows, ncols; +double *mwfact; +unsigned int *nmaster, *nrows, *ncols; int screen, sx, sy, sw, sh, wax, way, waw, wah; int (*xerrorxlib)(Display *, XErrorEvent *); unsigned int bh, bpos, ntags; +unsigned int seltag = 0; unsigned int blw = 0; -unsigned int ltidx = 0; /* default */ +unsigned int *ltidx; unsigned int nlayouts = 0; unsigned int nrules = 0; unsigned int numlockmask = 0; @@ -277,7 +278,7 @@ arrange(void) { unban(c); else ban(c); - layouts[ltidx].arrange(); + layouts[ltidx[seltag]].arrange(); focus(NULL); restack(); } @@ -397,6 +398,11 @@ cleanup(void) { XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); XSync(dpy, False); free(seltags); + free(ltidx); + free(mwfact); + free(nmaster); + free(nrows); + free(ncols); } void @@ -550,7 +556,7 @@ drawbar(void) { dc.x += dc.w; } dc.w = blw; - drawtext(layouts[ltidx].symbol, dc.norm); + drawtext(layouts[ltidx[seltag]].symbol, dc.norm); x = dc.x + dc.w; dc.w = textw(stext); dc.x = sw - dc.w; @@ -898,7 +904,7 @@ initfont(const char *fontstr) { Bool isarrange(void (*func)()) { - return func == layouts[ltidx].arrange; + return func == layouts[ltidx[seltag]].arrange; } Bool @@ -1381,8 +1387,8 @@ setlayout(const char *arg) { unsigned int i; if(!arg) { - if(++ltidx == nlayouts) - ltidx = 0;; + if(++ltidx[seltag] == nlayouts) + ltidx[seltag] = 0;; } else { for(i = 0; i < nlayouts; i++) @@ -1390,7 +1396,7 @@ setlayout(const char *arg) { break; if(i == nlayouts) return; - ltidx = i; + ltidx[seltag] = i; } if(sel) arrange(); @@ -1406,16 +1412,16 @@ setmwfact(const char *arg) { return; /* arg handling, manipulate mwfact */ if(arg == NULL) - mwfact = MWFACT; + mwfact[seltag] = MWFACT; else if(1 == sscanf(arg, "%lf", &delta)) { if(arg[0] != '+' && arg[0] != '-') - mwfact = delta; + mwfact[seltag] = delta; else - mwfact += delta; - if(mwfact < 0.1) - mwfact = 0.1; - else if(mwfact > 0.9) - mwfact = 0.9; + mwfact[seltag] += delta; + if(mwfact[seltag] < 0.1) + mwfact[seltag] = 0.1; + else if(mwfact[seltag] > 0.9) + mwfact[seltag] = 0.9; } arrange(); } @@ -1430,10 +1436,10 @@ setncols(const char *arg) { else if(arg[0] != '+' && arg[0] != '-') i = atoi(arg); else - i = ncols + atoi(arg); - if(i < 1 || waw * mwfact <= 2 * BORDERPX * i) + i = ncols[seltag] + atoi(arg); + if(i < 1 || waw * mwfact[seltag] <= 2 * BORDERPX * i) return; - ncols = i; + ncols[seltag] = i; if(sel) arrange(); else @@ -1450,10 +1456,10 @@ setnmaster(const char *arg) { else if(arg[0] != '+' && arg[0] != '-') i = atoi(arg); else - i = nmaster + atoi(arg); + i = nmaster[seltag] + atoi(arg); if(i < 0 || wah <= 2 * BORDERPX * i) return; - nmaster = i; + nmaster[seltag] = i; if(sel) arrange(); else @@ -1470,10 +1476,10 @@ setnrows(const char *arg) { else if(arg[0] != '+' && arg[0] != '-') i = atoi(arg); else - i = nrows + atoi(arg); + i = nrows[seltag] + atoi(arg); if(i < 1 || wah <= 2 * BORDERPX * i) return; - nrows = i; + nrows[seltag] = i; if(sel) arrange(); else @@ -1544,10 +1550,18 @@ setup(void) { dc.h = bh = dc.font.height + 2; /* init layouts */ - mwfact = MWFACT; - nmaster = NMASTER; - nrows = NROWS; - ncols = NCOLS; + ltidx = (unsigned int *) emallocz(ntags * sizeof(unsigned int)); + mwfact = (double *) emallocz(ntags * sizeof(double)); + nmaster = (unsigned int *) emallocz(ntags * sizeof(unsigned int)); + nrows = (unsigned int *) emallocz(ntags * sizeof(unsigned int)); + ncols = (unsigned int *) emallocz(ntags * sizeof(unsigned int)); + for(i = 0; i < ntags; i++) { + ltidx[i] = 0; /* default */ + mwfact[i] = MWFACT; + nmaster[i] = NMASTER; + nrows[i] = NROWS; + ncols[i] = NCOLS; + } nlayouts = sizeof layouts / sizeof layouts[0]; for(blw = i = 0; i < nlayouts; i++) { j = textw(layouts[i].symbol); @@ -1640,33 +1654,34 @@ tile(void) { n++; /* calculate correct number of stack rows */ - if(n - nmaster > nrows * ncols) - rows = (n - nmaster) / ncols + ((n - nmaster) % ncols ? 1 : 0); + if(n - nmaster[seltag] > nrows[seltag] * ncols[seltag]) + rows = (n - nmaster[seltag]) / ncols[seltag] + + ((n - nmaster[seltag]) % ncols[seltag] ? 1 : 0); else - rows = nrows; + rows = nrows[seltag]; /* master area geoms */ - if(nmaster == 0) { + if(nmaster[seltag] == 0) { mh = mw = 0; } - else if(n <= nmaster) { + else if(n <= nmaster[seltag]) { mh = wah / (n > 0 ? n : 1); mw = waw; } else { - mh = wah / (nmaster > 0 ? nmaster : 1); - mw = waw * mwfact; + mh = wah / (nmaster[seltag] > 0 ? nmaster[seltag] : 1); + mw = waw * mwfact[seltag]; } /* stacking area geoms */ - if(n <= nmaster + rows) { - rows1 = n > nmaster ? n - nmaster : 1; + if(n <= nmaster[seltag] + rows) { + rows1 = n > nmaster[seltag] ? n - nmaster[seltag] : 1; tw = tw1 = waw - mw; th = wah / rows1; } else { - rows1 = 1 + (n - nmaster - 1) % rows; - cols = (n - nmaster) / rows + ((n - nmaster) % rows ? 1 : 0); + rows1 = 1 + (n - nmaster[seltag] - 1) % rows; + cols = (n - nmaster[seltag]) / rows + ((n - nmaster[seltag]) % rows ? 1 : 0); tw = (waw - mw) / cols; tw1 = waw - mw - (cols - 1) * tw; th = wah / rows; @@ -1677,14 +1692,14 @@ tile(void) { for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++) { c->ismax = False; - if(i < nmaster) { /* master column */ + if(i < nmaster[seltag]) { /* master column */ nw = mw - 2 * c->border; nh = mh - 2 * c->border; if(i == 0) - nh += wah - mh * (n < nmaster ? n : nmaster); + nh += wah - mh * (n < nmaster[seltag] ? n : nmaster[seltag]); } - else if(i < nmaster + rows1) { /* first stack column */ - if(i == nmaster) { /* initialise */ + else if(i < nmaster[seltag] + rows1) { /* first stack column */ + if(i == nmaster[seltag]) { /* initialise */ ny = way; nx += mw; nh = wah - 2*c->border - (rows1 - 1) * th; @@ -1694,7 +1709,7 @@ tile(void) { nw = tw1 - 2 * c->border; } else { /* successive stack columns - rows > 0 if we reach here */ - if((i - nmaster - rows1) % rows == 0) { /* reinitialise */ + if((i - nmaster[seltag] - rows1) % rows == 0) { /* reinitialise */ ny = way; nx += nw + 2 * c-> border; nh = wah - 2*c->border - (rows - 1) * th; @@ -1777,8 +1792,12 @@ toggleview(const char *arg) { i = idxoftag(arg); seltags[i] = !seltags[i]; for(j = 0; j < ntags && !seltags[j]; j++); - if(j == ntags) + if(j == ntags) { seltags[i] = True; /* cannot toggle last view */ + j = i; + } + if (seltag == i) + seltag = j; arrange(); } @@ -1944,9 +1963,10 @@ view(const char *arg) { for(i = 0; i < ntags; i++) seltags[i] = arg == NULL; - i = idxoftag(arg); - if(i >= 0 && i < ntags) - seltags[i] = True; + if(arg) { + seltag = idxoftag(arg); + seltags[seltag] = True; + } arrange(); }