From 973d64f51be939daa50d85151262d8602e09e978 Mon Sep 17 00:00:00 2001 From: bakkeby Date: Mon, 9 Sep 2019 19:49:41 +0200 Subject: [PATCH] Adding nrowgrid layout --- README.md | 7 +++- config.def.h | 30 +++++++++----- patch/include.c | 4 ++ patch/include.h | 4 ++ patch/nrowgrid.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++ patch/nrowgrid.h | 1 + patches.h | 5 +++ 7 files changed, 142 insertions(+), 12 deletions(-) create mode 100644 patch/nrowgrid.c create mode 100644 patch/nrowgrid.h diff --git a/README.md b/README.md index c0de444..0540da9 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t ### Changelog: -2019-09-09 - Added deck, fibonacci (dwindle and spiral), gridmode, gapplessgrid and horizgrid layouts +2019-09-09 - Added deck, fibonacci (dwindle and spiral), gridmode, gapplessgrid, horizgrid and nrowgrid layouts 2019-09-08 - Added cfacts and vanitygaps patches, added bstack and bstackhoriz layouts @@ -128,4 +128,7 @@ Refer to [https://dwm.suckless.org/](https://dwm.suckless.org/) for details on t - gridmode (grid) layout - [horizgrid](https://dwm.suckless.org/patches/horizgrid/) - - horizontal grid layout \ No newline at end of file + - horizontal grid layout + + - [nrowgrid](https://dwm.suckless.org/patches/nrowgrid/) + - nrowgrid layout, number of rows in grid controlled by nmaster \ No newline at end of file diff --git a/config.def.h b/config.def.h index e9c1748..426da8c 100644 --- a/config.def.h +++ b/config.def.h @@ -93,39 +93,49 @@ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] static const int nmaster = 1; /* number of clients in master area */ static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +#if NROWGRID_LAYOUT +#define FORCE_VSPLIT 1 +#endif + static const Layout layouts[] = { /* symbol arrange function */ #if TILE_LAYOUT { "[]=", tile }, /* first entry is default */ - #endif // TILE_LAYOUT + #endif { "><>", NULL }, /* no layout function means floating behavior */ #if MONOCLE_LAYOUT { "[M]", monocle }, - #endif // MONOCLE_LAYOUT + #endif #if BSTACK_LAYOUT { "TTT", bstack }, - #endif // BSTACK_LAYOUT + #endif #if BSTACKHORIZ_LAYOUT { "===", bstackhoriz }, - #endif // BSTACKHORIZ_LAYOUT + #endif #if DECK_LAYOUT { "[D]", deck }, - #endif // DECK_LAYOUT + #endif #if FIBONACCI_SPIRAL_LAYOUT { "(@)", spiral }, - #endif // FIBONACCI_SPIRAL_LAYOUT + #endif #if FIBONACCI_DWINDLE_LAYOUT { "[\\]", dwindle }, - #endif // FIBONACCI_DWINDLE_LAYOUT + #endif #if GRIDMODE_LAYOUT { "HHH", grid }, - #endif // GRIDMODE_LAYOUT + #endif #if HORIZGRID_LAYOUT - { "###", horizgrid }, + { "---", horizgrid }, + #endif + #if GAPPLESSGRID_LAYOUT + { ":::", gaplessgrid }, + #endif + #if NROWGRID_LAYOUT + { "###", nrowgrid }, #endif #if CYCLELAYOUTS_PATCH { NULL, NULL }, - #endif // CYCLELAYOUTS_PATCH + #endif }; /* key definitions */ diff --git a/patch/include.c b/patch/include.c index 3eb8ae9..2cd434e 100644 --- a/patch/include.c +++ b/patch/include.c @@ -86,6 +86,10 @@ #include "monocle.c" #endif +#if NROWGRID_LAYOUT +#include "nrowgrid.c" +#endif + #if TILE_LAYOUT #include "tile.c" #endif \ No newline at end of file diff --git a/patch/include.h b/patch/include.h index a5bafa6..280b27a 100644 --- a/patch/include.h +++ b/patch/include.h @@ -82,6 +82,10 @@ #include "monocle.h" #endif +#if NROWGRID_LAYOUT +#include "nrowgrid.h" +#endif + #if TILE_LAYOUT #include "tile.h" #endif \ No newline at end of file diff --git a/patch/nrowgrid.c b/patch/nrowgrid.c new file mode 100644 index 0000000..5709d80 --- /dev/null +++ b/patch/nrowgrid.c @@ -0,0 +1,103 @@ +#if VANITYGAPS_PATCH +void +nrowgrid(Monitor *m) +{ + unsigned int n = 0, i = 0, ri = 0, ci = 0; /* counters */ + int oh, ov, ih, iv; /* vanitygap settings */ + unsigned int cx, cy, cw, ch; /* client geometry */ + unsigned int uw = 0, uh = 0, uc = 0; /* utilization trackers */ + unsigned int cols, rows = m->nmaster + 1; + Client *c; + + /* count clients */ + getgaps(m, &oh, &ov, &ih, &iv, &n); + + /* nothing to do here */ + if (n == 0) + return; + + /* force 2 clients to always split vertically */ + if (FORCE_VSPLIT && n == 2) + rows = 1; + + /* never allow empty rows */ + if (n < rows) + rows = n; + + /* define first row */ + cols = n / rows; + uc = cols; + cy = m->wy + oh; + ch = (m->wh - 2*oh - ih*(rows - 1)) / rows; + uh = ch; + + for (c = nexttiled(m->clients); c; c = nexttiled(c->next), i++, ci++) { + if (ci == cols) { + uw = 0; + ci = 0; + ri++; + + /* next row */ + cols = (n - uc) / (rows - ri); + uc += cols; + cy = m->wy + oh + uh + ih; + uh += ch + ih; + } + + cx = m->wx + ov + uw; + cw = (m->ww - 2*ov - uw) / (cols - ci); + uw += cw + iv; + + resize(c, cx, cy, cw - (2*c->bw), ch - (2*c->bw), 0); + } +} +#else +void +nrowgrid(Monitor *m) +{ + unsigned int n = 0, i = 0, ri = 0, ci = 0; /* counters */ + unsigned int cx, cy, cw, ch; /* client geometry */ + unsigned int uw = 0, uh = 0, uc = 0; /* utilization trackers */ + unsigned int cols, rows = m->nmaster + 1; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + + /* force 2 clients to always split vertically */ + if (FORCE_VSPLIT && n == 2) + rows = 1; + + /* never allow empty rows */ + if (n < rows) + rows = n; + + /* define first row */ + cols = n / rows; + uc = cols; + cy = m->wy; + ch = m->wh / rows; + uh = ch; + + for (c = nexttiled(m->clients); c; c = nexttiled(c->next), i++, ci++) { + if (ci == cols) { + uw = 0; + ci = 0; + ri++; + + /* next row */ + cols = (n - uc) / (rows - ri); + uc += cols; + cy = m->wy + uh; + uh += ch; + } + + cx = m->wx + uw; + cw = (m->ww - uw) / (cols - ci); + uw += cw; + + resize(c, cx, cy, cw - (2*c->bw), ch - (2*c->bw), 0); + } +} +#endif \ No newline at end of file diff --git a/patch/nrowgrid.h b/patch/nrowgrid.h new file mode 100644 index 0000000..de71a50 --- /dev/null +++ b/patch/nrowgrid.h @@ -0,0 +1 @@ +static void nrowgrid(Monitor *m); \ No newline at end of file diff --git a/patches.h b/patches.h index 58a3b5a..858ef7c 100644 --- a/patches.h +++ b/patches.h @@ -227,6 +227,11 @@ */ #define HORIZGRID_LAYOUT 0 +/* Grid layout where nmaster controls the number of rows. + * https://dwm.suckless.org/patches/nrowgrid/ + */ +#define NROWGRID_LAYOUT 0 + /* The default tile layout. * This can be optionally disabled in favour of other layouts. */