diff options
| -rw-r--r-- | dwm.c | 123 | ||||
| -rw-r--r-- | dwm.c.orig | 17 | ||||
| -rw-r--r-- | dwm.c.rej | 32 |
3 files changed, 157 insertions, 15 deletions
@@ -150,6 +150,7 @@ typedef struct { void (*arrange)(Monitor *); } Layout; +typedef struct Pertag Pertag; struct Monitor { char ltsymbol[16]; float mfact; @@ -170,6 +171,7 @@ struct Monitor { Monitor *next; Window barwin; const Layout *lt[2]; + Pertag *pertag; }; typedef struct { @@ -347,6 +349,15 @@ static xcb_connection_t *xcon; static unsigned int scratchtag = 1 << LENGTH(tags); +struct Pertag { + unsigned int curtag, prevtag; /* current and previous tag */ + int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ + float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ + unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ + const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ + int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ +}; + /* compile-time check if all tags fit into an unsigned int bit array. */ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; @@ -821,6 +832,7 @@ Monitor * createmon(void) { Monitor *m; + unsigned int i; m = ecalloc(1, sizeof(Monitor)); m->tagset[0] = m->tagset[1] = 1; @@ -832,6 +844,20 @@ createmon(void) m->lt[0] = &layouts[0]; m->lt[1] = &layouts[1 % LENGTH(layouts)]; strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + m->pertag = ecalloc(1, sizeof(Pertag)); + m->pertag->curtag = m->pertag->prevtag = 1; + + for (i = 0; i <= LENGTH(tags); i++) { + m->pertag->nmasters[i] = m->nmaster; + m->pertag->mfacts[i] = m->mfact; + + m->pertag->ltidxs[i][0] = m->lt[0]; + m->pertag->ltidxs[i][1] = m->lt[1]; + m->pertag->sellts[i] = m->sellt; + + m->pertag->showbars[i] = m->showbar; + } + return m; } @@ -1199,7 +1225,16 @@ grabkeys(void) void incnmaster(const Arg *arg) { + unsigned int i; selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); + for(i=0; i<LENGTH(tags); ++i) + if(selmon->tagset[selmon->seltags] & 1<<i) + selmon->pertag->nmasters[i+1] = selmon->nmaster; + + if(selmon->pertag->curtag == 0) + { + selmon->pertag->nmasters[0] = selmon->nmaster; + } arrange(selmon); } @@ -1887,11 +1922,26 @@ setgaps(const Arg *arg) void setlayout(const Arg *arg) { + unsigned int i; if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) selmon->sellt ^= 1; if (arg && arg->v) selmon->lt[selmon->sellt] = (Layout *)arg->v; strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + + for(i=0; i<LENGTH(tags); ++i) + if(selmon->tagset[selmon->seltags] & 1<<i) + { + selmon->pertag->ltidxs[i+1][selmon->sellt] = selmon->lt[selmon->sellt]; + selmon->pertag->sellts[i+1] = selmon->sellt; + } + + if(selmon->pertag->curtag == 0) + { + selmon->pertag->ltidxs[0][selmon->sellt] = selmon->lt[selmon->sellt]; + selmon->pertag->sellts[0] = selmon->sellt; + } + if (selmon->sel) arrange(selmon); else @@ -1903,13 +1953,25 @@ void setmfact(const Arg *arg) { float f; + unsigned int i; if (!arg || !selmon->lt[selmon->sellt]->arrange) return; f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if (arg->f == 0.0) + f = mfact; if (f < 0.05 || f > 0.95) return; selmon->mfact = f; + for(i=0; i<LENGTH(tags); ++i) + if(selmon->tagset[selmon->seltags] & 1<<i) + selmon->pertag->mfacts[i+1] = f; + + if(selmon->pertag->curtag == 0) + { + selmon->pertag->mfacts[0] = f; + } + arrange(selmon); } @@ -2102,7 +2164,16 @@ tile(Monitor *m) void togglebar(const Arg *arg) { + unsigned int i; selmon->showbar = !selmon->showbar; + for(i=0; i<LENGTH(tags); ++i) + if(selmon->tagset[selmon->seltags] & 1<<i) + selmon->pertag->showbars[i+1] = selmon->showbar; + + if(selmon->pertag->curtag == 0) + { + selmon->pertag->showbars[0] = selmon->showbar; + } updatebarpos(selmon); resizebarwin(selmon); if (showsystray) { @@ -2174,9 +2245,33 @@ void toggleview(const Arg *arg) { unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + int i; if (newtagset) { selmon->tagset[selmon->seltags] = newtagset; + + if (newtagset == ~0) { + selmon->pertag->prevtag = selmon->pertag->curtag; + selmon->pertag->curtag = 0; + } + + /* test if the user did not select the same tag */ + if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { + selmon->pertag->prevtag = selmon->pertag->curtag; + for (i = 0; !(newtagset & 1 << i); i++) ; + selmon->pertag->curtag = i + 1; + } + + /* apply settings for this view */ + selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; + selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; + selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; + selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; + selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; + + if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) + togglebar(NULL); + focus(NULL); arrange(selmon); } @@ -2621,11 +2716,37 @@ updatewmhints(Client *c) void view(const Arg *arg) { + int i; + unsigned int tmptag; + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) return; selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) + if (arg->ui & TAGMASK) { selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; + selmon->pertag->prevtag = selmon->pertag->curtag; + + if (arg->ui == ~0) + selmon->pertag->curtag = 0; + else { + for (i = 0; !(arg->ui & 1 << i); i++) ; + selmon->pertag->curtag = i + 1; + } + } else { + tmptag = selmon->pertag->prevtag; + selmon->pertag->prevtag = selmon->pertag->curtag; + selmon->pertag->curtag = tmptag; + } + + selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; + selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; + selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; + selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; + selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; + + if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) + togglebar(NULL); + focus(NULL); arrange(selmon); } @@ -558,9 +558,15 @@ buttonpress(XEvent *e) } if (ev->window == selmon->barwin) { i = x = 0; - do + unsigned int occ = 0; + for(c = m->clients; c; c=c->next) + occ |= c->tags; + do { + /* Do not reserve space for vacant tags */ + if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) + continue; x += TEXTW(tags[i]); - while (ev->x >= x && ++i < LENGTH(tags)); + } while (ev->x >= x && ++i < LENGTH(tags)); if (i < LENGTH(tags)) { click = ClkTagBar; arg.ui = 1 << i; @@ -914,13 +920,12 @@ drawbar(Monitor *m) } x = 0; for (i = 0; i < LENGTH(tags); i++) { + /* Do not draw vacant tags */ + if(!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) + continue; w = TEXTW(tags[i]); drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); x += w; } w = TEXTW(m->ltsymbol); @@ -1,12 +1,28 @@ ---- dwm.c -+++ dwm.c -@@ -723,6 +790,9 @@ destroynotify(XEvent *e) +--- dwm.c 2020-05-23 00:20:34.877944603 +0200 ++++ dwm.c 2020-06-22 12:49:55.298859682 +0200 +@@ -1566,13 +1616,24 @@ void + setmfact(const Arg *arg) + { + float f; ++ unsigned int i; - if ((c = wintoclient(ev->window))) - unmanage(c, 1); + if (!arg || !selmon->lt[selmon->sellt]->arrange) + return; + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; +- if (f < 0.1 || f > 0.9) ++ if (arg->f == 0.0) ++ f = mfact; ++ if (f < 0.05 || f > 0.95) + return; + selmon->mfact = f; ++ for(i=0; i<LENGTH(tags); ++i) ++ if(selmon->tagset[selmon->seltags] & 1<<i) ++ selmon->pertag->mfacts[i+1] = f; + -+ else if ((c = swallowingclient(ev->window))) -+ unmanage(c->swallowing, 1); ++ if(selmon->pertag->curtag == 0) ++ { ++ selmon->pertag->mfacts[0] = f; ++ } + arrange(selmon); } - void |
