barconfig patch

This commit is contained in:
Rumen 2025-10-24 10:00:33 +02:00
parent 4263f5be4d
commit 1789a291c9
No known key found for this signature in database
2 changed files with 220 additions and 0 deletions

View File

@ -0,0 +1,27 @@
### Description
This patch **requires** the dwl [barconfig](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/bar) patch be applied first! The barconfig patch provides configuration for the dwl bar via the variable
`barlayout`. This determines which of the elements listed below to
display on the bar and in which order:
- 't' -> the tags
- 'l' -> the current layout symbol
- 'n' -> the window name
- 's' -> the status message
- '|' -> elements on the right of this separator will be displayed from
the right
**NOTE**: This patch is a dwl port of the [original](https://dwm.suckless.org/patches/barconfig/) barconfig patch for dwm.
### Known Issues With Patch
Putting the tags after the '|' separator prevents tags 1 to 7 from being displayed. I do not have any plans
to look into this, as I ported this patch for the sole purpose of having the option to omit the layout symbol from
the bar.
### Download
- [0.8](/dwl/dwl-patches/raw/branch/main/patches/barconfig/barconfig.patch)
- [main 2025-10-24](/dwl/dwl-patches/raw/branch/main/patches/barconfig/barconfig.patch)
### Authors - latest at top
- Rumen Mitov, [rumenmitov](https://codeberg.org/rumenmitov)
rumenmitov@protonmail.com

View File

@ -0,0 +1,193 @@
From e733fda4e498c998a104d0d5bb42b9c7373f2c9d Mon Sep 17 00:00:00 2001
From: Rumen <rumenmitov@protonmail.com>
Date: Fri, 24 Oct 2025 09:33:24 +0200
Subject: [PATCH] Barconfig: Configure the dwl bar!
NOTE: This is a port of the original barconfig patch for dwm!
This patch provides configuration for the dwl bar via the variable
`barlayout`. This determines which of the elements listed below to
display on the bar and in which order:
- 't' -> the tags
- 'l' -> the current layout symbol
- 'n' -> the window name
- 's' -> the status message
- '|' -> elements on the right of this separator will be displayed from
the right
---
config.def.h | 1 +
dwl.c | 134 +++++++++++++++++++++++++++++++++++----------------
2 files changed, 93 insertions(+), 42 deletions(-)
diff --git a/config.def.h b/config.def.h
index 1b7472d..c7a33d6 100644
--- a/config.def.h
+++ b/config.def.h
@@ -9,6 +9,7 @@ static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will
static const unsigned int borderpx = 1; /* border pixel of windows */
static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */
+static const char *barlayout = "tln|s";
static const char *fonts[] = {"monospace:size=10"};
static const float rootcolor[] = COLOR(0x000000ff);
/* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */
diff --git a/dwl.c b/dwl.c
index bf340d8..f0d72cf 100644
--- a/dwl.c
+++ b/dwl.c
@@ -1569,10 +1569,10 @@ dirtomon(enum wlr_direction dir)
void
drawbar(Monitor *m)
{
- int x, w, tw = 0;
+ int x = 0, w, tw = 0, moveright = 0;
int boxs = m->drw->font->height / 9;
int boxw = m->drw->font->height / 6 + 2;
- uint32_t i, occ = 0, urg = 0;
+ uint32_t i, j, occ = 0, urg = 0;
Client *c;
Buffer *buf;
@@ -1581,48 +1581,98 @@ drawbar(Monitor *m)
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);
- }
+ if (barlayout[0] == '\0')
+ barlayout = "tln|s";
+
+ drwl_text(m->drw, 0, 0, m->w.width, m->b.height, 0, "", 0); /* draw background */
+
+ for (i = 0; i < strlen(barlayout); i++) {
+ switch (barlayout[i]) {
+ case 'l':
+ w = TEXTW(m, m->ltsymbol);
+ drwl_setscheme(m->drw, colors[SchemeNorm]);
+ if (moveright) {
+ x -= w;
+ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, m->ltsymbol, 0);
+ } else
+ x = drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, m->ltsymbol, 0);
+ break;
- wl_list_for_each(c, &clients, link) {
- if (c->mon != m)
- continue;
- occ |= c->tags;
- if (c->isurgent)
- urg |= c->tags;
- }
- x = 0;
- c = focustop(m);
- 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]);
- drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, tags[i], urg & 1 << i);
- if (occ & 1 << i)
- drwl_rect(m->drw, x + boxs, boxs, boxw, boxw,
- m == selmon && c && c->tags & 1 << i,
- urg & 1 << i);
- x += w;
- }
- 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);
-
- if ((w = m->b.width - tw - x) > m->b.height) {
- if (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);
- if (c && c->isfloating)
- drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0);
- } else {
- drwl_setscheme(m->drw, colors[SchemeNorm]);
- drwl_rect(m->drw, x, 0, w, m->b.height, 1, 1);
- }
- }
+ case 'n':
+ c = focustop(m);
+
+ if (c) {
+ tw = TEXTW(m, client_get_title(c));
+ if (moveright)
+ x -= tw;
+
+ drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]);
+ drwl_text(m->drw, x, 0, moveright ? tw : m->w.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 {
+ drwl_setscheme(m->drw, colors[SchemeNorm]);
+ drwl_rect(m->drw, x, 0, tw, m->b.height, 1, 1);
+ }
+
+ if (!moveright)
+ x += tw;
+ break;
+
+ case 's':
+ 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 */
+ if (moveright) {
+ x -= tw;
+ drwl_text(m->drw, x, 0, tw, m->b.height, 0, stext, 0);
+ } else
+ x = drwl_text(m->drw, x, 0, tw, m->b.height, 0, stext, 0);
+ }
+ break;
+
+ case 't':
+ wl_list_for_each(c, &clients, link) {
+ if (c->mon != m)
+ continue;
+ occ |= c->tags;
+ if (c->isurgent)
+ urg |= c->tags;
+
+ c = focustop(m);
+ }
+ /* tags */
+ if (moveright) {
+ tw = 0;
+ for (j = 0; j < LENGTH(tags); j++) {
+ tw += TEXTW(m, tags[j]);
+ }
+ x -= tw;
+ }
+ for (j = 0; j < LENGTH(tags); j++) {
+ w = TEXTW(m, tags[j]);
+ drwl_setscheme(m->drw, colors[m->tagset[m->seltags] & 1 << j ? SchemeSel : SchemeNorm]);
+ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, tags[j], urg & 1 << j);
+ if (occ & 1 << j)
+ drwl_rect(m->drw, x + boxs, boxs, boxw, boxw,
+ m == selmon && c && c->tags & 1 << j,
+ urg & 1 << i);
+ x += w;
+ }
+ if (moveright)
+ x -= tw;
+ break;
+
+ case '|':
+ moveright = 1;
+ x = m->w.width;
+ break;
+ }
+ }
+
wlr_scene_buffer_set_dest_size(m->scene_buffer,
m->b.real_width, m->b.real_height);
wlr_scene_node_set_position(&m->scene_buffer->node, m->m.x,
--
2.51.1