From 507f76f981aa9dacd35e817c9f7050e200e20f3d Mon Sep 17 00:00:00 2001 From: nate zhou Date: Sun, 8 Mar 2026 11:48:37 +0800 Subject: [PATCH] Add: bar-modes patch Add modes_labels indicator to bar, which behaves like river-classic's dam bar. This patch has to be applied after the bar and modes patch. --- patches/bar-modes/README.md | 31 +++++++ patches/bar-modes/bar-modes.patch | 131 ++++++++++++++++++++++++++++++ patches/bar-modes/example.png | Bin 0 -> 6555 bytes 3 files changed, 162 insertions(+) create mode 100644 patches/bar-modes/README.md create mode 100644 patches/bar-modes/bar-modes.patch create mode 100644 patches/bar-modes/example.png diff --git a/patches/bar-modes/README.md b/patches/bar-modes/README.md new file mode 100644 index 0000000..e7dc12d --- /dev/null +++ b/patches/bar-modes/README.md @@ -0,0 +1,31 @@ +![dwl bar-modes patch example](./example.png) + +### Description + +Add a mode indicator to bar that tells which mode you are in, just like +river-classic's [dam](https://codeberg.org/sewn/dam) bar. + +The string from `modes_labels` defined in `config.h` is used, while normal mode +is ignored. + +Another usage is to serve as a hint for each modes keybindings: + +```c +enum { + BROWSER, +}; +const char *modes_lablels[] = { + "[f]irefox [b]rave [c]hromium [q]utebrowser", +}; +``` + +### Dependencies +this patch depends on: +- [bar](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/bar/) patch +- [modes](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/modes/) patch + +### Download +- [v0.8](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/bar-modes/bar-modes.patch) + +### Authors +- [unixchad](https://codeberg.org/unixchad/) diff --git a/patches/bar-modes/bar-modes.patch b/patches/bar-modes/bar-modes.patch new file mode 100644 index 0000000..8e239a2 --- /dev/null +++ b/patches/bar-modes/bar-modes.patch @@ -0,0 +1,131 @@ +From 4f2c8a99720d90a551bf38f2c8d25ad239346eef Mon Sep 17 00:00:00 2001 +From: nate zhou +Date: Mon, 2 Mar 2026 21:54:03 +0800 +Subject: [PATCH] Patch: bar-modes for 0.8 + +Add modes_labels indicator to bar, which behaves like river-classic's +dam bar. This patch has to be applied after the bar and modes patch. +--- + dwl.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 59 insertions(+), 11 deletions(-) + +diff --git a/dwl.c b/dwl.c +index ae290ad..df525d3 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -1585,19 +1585,26 @@ drawbar(Monitor *m) + uint32_t i, occ = 0, urg = 0; + Client *c; + Buffer *buf; ++ char mode_text[256] = ""; ++ int mode_width = 0; + + if (!m->scene_buffer->node.enabled) + return; + if (!(buf = bufmon(m))) + return; + +- /* draw status first so it can be overdrawn by tags later */ +- if (m == selmon) { /* status is only drawn on selected monitor */ +- drwl_setscheme(m->drw, colors[SchemeNorm]); +- tw = TEXTW(m, stext) - m->lrpad + 2; /* 2px right padding */ +- drwl_text(m->drw, m->b.width - tw, 0, tw, m->b.height, 0, stext, 0); ++ /* get current mode text if in a mode (not normal) */ ++ if (active_mode_index >= 0 && active_mode_index < LENGTH(modes_labels) && ++ modes_labels[active_mode_index]) { ++ strncpy(mode_text, modes_labels[active_mode_index], sizeof(mode_text) - 1); ++ mode_text[sizeof(mode_text) - 1] = '\0'; ++ mode_width = TEXTW(m, mode_text); + } + ++ /* calculate status text width */ ++ drwl_setscheme(m->drw, colors[SchemeNorm]); ++ tw = TEXTW(m, stext) - m->lrpad + 2; ++ + wl_list_for_each(c, &clients, link) { + if (c->mon != m) + continue; +@@ -1607,6 +1614,8 @@ drawbar(Monitor *m) + } + x = 0; + c = focustop(m); ++ ++ /* draw tags (always shown) */ + for (i = 0; i < LENGTH(tags); i++) { + w = TEXTW(m, tags[i]); + drwl_setscheme(m->drw, colors[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); +@@ -1617,19 +1626,57 @@ drawbar(Monitor *m) + urg & 1 << i); + x += w; + } ++ ++ /* draw mode indicator after tags if in a mode */ ++ if (mode_text[0]) { ++ drwl_setscheme(m->drw, colors[SchemeSel]); ++ drwl_text(m->drw, x, 0, mode_width, m->b.height, m->lrpad / 2, mode_text, 0); ++ x += mode_width; ++ } ++ ++ /* draw layout symbol after mode */ + w = TEXTW(m, m->ltsymbol); + drwl_setscheme(m->drw, colors[SchemeNorm]); +- x = drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, m->ltsymbol, 0); ++ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, m->ltsymbol, 0); ++ x += w; ++ ++ int remaining = m->b.width - x; + +- if ((w = m->b.width - tw - x) > m->b.height) { +- if (c) { ++ if (mode_text[0]) { ++ int title_width = remaining; ++ ++ if (title_width > m->b.height && c) { + drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]); +- drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0); ++ drwl_text(m->drw, x, 0, title_width, m->b.height, m->lrpad / 2, ++ client_get_title(c), 0); + if (c && c->isfloating) + drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0); +- } else { ++ } else if (title_width > 0) { ++ drwl_setscheme(m->drw, colors[SchemeNorm]); ++ drwl_rect(m->drw, x, 0, title_width, m->b.height, 1, 1); ++ } ++ /* no status text when in a mode - completely omitted */ ++ } else { ++ /* not in a mode - normal behavior with status */ ++ if (remaining >= tw) { ++ drwl_setscheme(m->drw, colors[SchemeNorm]); ++ drwl_text(m->drw, m->b.width - tw, 0, tw, m->b.height, 0, stext, 0); ++ ++ int title_space = remaining - tw; ++ if (title_space > m->b.height && c) { ++ drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]); ++ drwl_text(m->drw, x, 0, title_space, m->b.height, m->lrpad / 2, ++ client_get_title(c), 0); ++ if (c && c->isfloating) ++ drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0); ++ } else if (title_space > 0) { ++ drwl_setscheme(m->drw, colors[SchemeNorm]); ++ drwl_rect(m->drw, x, 0, title_space, m->b.height, 1, 1); ++ } ++ } else if (remaining > 0) { + drwl_setscheme(m->drw, colors[SchemeNorm]); +- drwl_rect(m->drw, x, 0, w, m->b.height, 1, 1); ++ drwl_text(m->drw, m->b.width - remaining, 0, remaining, m->b.height, 0, ++ stext, 0); + } + } + +@@ -3437,6 +3484,7 @@ entermode(const Arg *arg) + { + active_mode_index = arg->i; + printstatus(); ++ drawbars(); + } + + #ifdef XWAYLAND +-- +2.53.0 + diff --git a/patches/bar-modes/example.png b/patches/bar-modes/example.png new file mode 100644 index 0000000000000000000000000000000000000000..185b4fe161d2788e5271392774fd4381deef1e7d GIT binary patch literal 6555 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 JiWhH#{twG5q=Wzf literal 0 HcmV?d00001