From 6d63b19999c52c4a83bf4b7770cb119d9eb4dd59 Mon Sep 17 00:00:00 2001 From: bakkeby Date: Wed, 29 Jul 2020 11:19:33 +0200 Subject: [PATCH 2/2] Monitor rules patch on top of pertag This patch allows the user to define layout, mfact, nmaster, showbar, and topbar settings on a per monitor basis. An example use case could be to have a layout with a horizontal split for a secondary vertical monitor. https://github.com/bakkeby/patches/wiki/monitorrules --- config.def.h | 6 +++++ dwm.c | 70 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/config.def.h b/config.def.h index 1c0b587..36bfa8c 100644 --- a/config.def.h +++ b/config.def.h @@ -43,6 +43,12 @@ static const Layout layouts[] = { { "[M]", monocle }, }; +static const MonitorRule monrules[] = { + /* monitor tag layout mfact nmaster showbar topbar */ + { 1, -1, 2, -1, -1, -1, -1 }, // use a different layout for the second monitor + { -1, -1, 0, -1, -1, -1, -1 }, // default +}; + /* key definitions */ #define MODKEY Mod1Mask #define TAGKEYS(KEY,TAG) \ diff --git a/dwm.c b/dwm.c index 55f8f92..357c3d7 100644 --- a/dwm.c +++ b/dwm.c @@ -143,6 +143,16 @@ typedef struct { int monitor; } Rule; +typedef struct { + int monitor; + int tag; + int layout; + float mfact; + int nmaster; + int showbar; + int topbar; +} MonitorRule; + /* function declarations */ static void applyrules(Client *c); static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); @@ -642,38 +652,64 @@ configurerequest(XEvent *e) Monitor * createmon(void) { - Monitor *m; - int i; - + Monitor *m, *mi; + int i, mc, j, layout; + const MonitorRule *mr; m = ecalloc(1, sizeof(Monitor)); m->tagset[0] = m->tagset[1] = 1; m->mfact = mfact; m->nmaster = nmaster; m->showbar = showbar; m->topbar = topbar; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + + for (mc = 0, mi = mons; mi; mi = mi->next, mc++); + for (j = 0; j < LENGTH(monrules); j++) { + mr = &monrules[j]; + if ((mr->monitor == -1 || mr->monitor == mc) + && (mr->tag <= 0 || (m->tagset[0] & (1 << (mr->tag - 1)))) + ) { + layout = MAX(mr->layout, 0); + layout = MIN(layout, LENGTH(layouts) - 1); + m->lt[0] = &layouts[layout]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[layout].symbol, sizeof m->ltsymbol); + + if (mr->mfact > -1) + m->mfact = mr->mfact; + if (mr->nmaster > -1) + m->nmaster = mr->nmaster; + if (mr->showbar > -1) + m->showbar = mr->showbar; + if (mr->topbar > -1) + m->topbar = mr->topbar; + break; + } + } + if (!(m->pertag = (Pertag *)calloc(1, sizeof(Pertag)))) die("fatal: could not malloc() %u bytes\n", sizeof(Pertag)); m->pertag->curtag = m->pertag->prevtag = 1; - for (i = 0; i <= LENGTH(tags); i++) { - /* init nmaster */ - m->pertag->nmasters[i] = m->nmaster; - - /* init mfacts */ - m->pertag->mfacts[i] = m->mfact; + for (i = 0; i <= LENGTH(tags); i++) { /* init layouts */ - m->pertag->ltidxs[i][0] = m->lt[0]; - m->pertag->ltidxs[i][1] = m->lt[1]; m->pertag->sellts[i] = m->sellt; - /* init showbar */ - m->pertag->showbars[i] = m->showbar; - /* swap focus and zoomswap*/ m->pertag->prevzooms[i] = NULL; + + for (j = 0; j < LENGTH(monrules); j++) { + mr = &monrules[j]; + if ((mr->monitor == -1 || mr->monitor == mc) && (mr->tag == -1 || mr->tag == i)) { + layout = MAX(mr->layout, 0); + layout = MIN(layout, LENGTH(layouts) - 1); + m->pertag->ltidxs[i][0] = &layouts[layout]; + m->pertag->ltidxs[i][1] = m->lt[0]; + m->pertag->nmasters[i] = (mr->nmaster > -1 ? mr->nmaster : m->nmaster); + m->pertag->mfacts[i] = (mr->mfact > -1 ? mr->mfact : m->mfact); + m->pertag->showbars[i] = (mr->showbar > -1 ? mr->showbar : m->showbar); + break; + } + } } return m; } -- 2.19.1