floatingstatus - dwm statusbar customization - sites - public wiki contents of … | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
commit 071c065179f28bae42bb876cf4bae4f680dd2baf | |
parent 1b7632929d73201194aefb8772df68b9459f52c2 | |
Author: uint23 <[email protected]> | |
Date: Tue, 8 Apr 2025 21:52:42 +0100 | |
floatingstatus - dwm statusbar customization | |
lets dwm statusbar to float with vertical and horizontal padding and | |
height | |
Diffstat: | |
A dwm.suckless.org/patches/floatings… | 282 +++++++++++++++++++++++++++… | |
A dwm.suckless.org/patches/floatings… | 22 ++++++++++++++++++++++ | |
A dwm.suckless.org/patches/floatings… | 0 | |
3 files changed, 304 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/dwm.suckless.org/patches/floatingstatus/floatingstatus-20250408-cf… | |
@@ -0,0 +1,282 @@ | |
+From 74a90e7f249961c6d5d8f430a404d70628d6e3ea Mon Sep 17 00:00:00 2001 | |
+From: uint23 <[email protected]> | |
+Date: Tue, 8 Apr 2025 17:33:20 +0100 | |
+Subject: [PATCH] floating status bar patch | |
+ | |
+--- | |
+ config.def.h | 6 ++ | |
+ dwm.c | 182 ++++++++++++++++++++++++++++----------------------- | |
+ 2 files changed, 106 insertions(+), 82 deletions(-) | |
+ | |
+diff --git a/config.def.h b/config.def.h | |
+index 9efa774..4febd22 100644 | |
+--- a/config.def.h | |
++++ b/config.def.h | |
+@@ -2,6 +2,11 @@ | |
+ | |
+ /* appearance */ | |
+ static const unsigned int borderpx = 1; /* border pixel of windows */ | |
++static const unsigned int barpadv = 10; /* bar vertical… | |
++static const unsigned int barpadh = 200; /* bar vertica… | |
++static const unsigned int barheight = 2; /* bar vertica… | |
++static const unsigned int barborder = 2; /* bar vertica… | |
++static const unsigned int floatbar = 1; /* 0 means bar … | |
+ static const unsigned int snap = 32; /* snap pixel */ | |
+ static const int showbar = 1; /* 0 means no bar */ | |
+ static const int topbar = 1; /* 0 means bottom bar */ | |
+@@ -16,6 +21,7 @@ static const char *colors[][3] = { | |
+ /* fg bg border */ | |
+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, | |
+ [SchemeSel] = { col_gray4, col_cyan, col_cyan }, | |
++ [SchemeBar] = { NULL, NULL, col_cyan }, | |
+ }; | |
+ | |
+ /* tagging */ | |
+diff --git a/dwm.c b/dwm.c | |
+index 1443802..10fa1e8 100644 | |
+--- a/dwm.c | |
++++ b/dwm.c | |
+@@ -58,7 +58,7 @@ | |
+ | |
+ /* enums */ | |
+ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ | |
+-enum { SchemeNorm, SchemeSel }; /* color schemes */ | |
++enum { SchemeNorm, SchemeSel, SchemeBar }; /* color schemes */ | |
+ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, | |
+ NetWMFullscreen, NetActiveWindow, NetWMWindowType, | |
+ NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ | |
+@@ -338,10 +338,10 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h… | |
+ if (*y + *h + 2 * c->bw <= m->wy) | |
+ *y = m->wy; | |
+ } | |
+- if (*h < bh) | |
+- *h = bh; | |
+- if (*w < bh) | |
+- *w = bh; | |
++ if (*h < bh + barheight) | |
++ *h = bh + barheight; | |
++ if (*w < bh + barheight) | |
++ *w = bh + barheight; | |
+ if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arran… | |
+ if (!c->hintsvalid) | |
+ updatesizehints(c); | |
+@@ -563,13 +563,13 @@ configurenotify(XEvent *e) | |
+ sw = ev->width; | |
+ sh = ev->height; | |
+ if (updategeom() || dirty) { | |
+- drw_resize(drw, sw, bh); | |
++ drw_resize(drw, sw, bh + barheight); | |
+ updatebars(); | |
+ for (m = mons; m; m = m->next) { | |
+ for (c = m->clients; c; c = c->next) | |
+ if (c->isfullscreen) | |
+ resizeclient(c, m->mx, m->my,… | |
+- XMoveResizeWindow(dpy, m->barwin, m->wx, m->b… | |
++ XMoveResizeWindow(dpy, m->barwin, m->wx, m->b… | |
+ } | |
+ focus(NULL); | |
+ arrange(NULL); | |
+@@ -697,54 +697,57 @@ dirtomon(int dir) | |
+ void | |
+ drawbar(Monitor *m) | |
+ { | |
+- int x, w, tw = 0; | |
+- int boxs = drw->fonts->h / 9; | |
+- int boxw = drw->fonts->h / 6 + 2; | |
+- unsigned int i, occ = 0, urg = 0; | |
+- Client *c; | |
+- | |
+- if (!m->showbar) | |
+- return; | |
+- | |
+- /* draw status first so it can be overdrawn by tags later */ | |
+- if (m == selmon) { /* status is only drawn on selected monitor */ | |
+- drw_setscheme(drw, scheme[SchemeNorm]); | |
+- tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ | |
+- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); | |
+- } | |
+- | |
+- for (c = m->clients; c; c = c->next) { | |
+- occ |= c->tags; | |
+- if (c->isurgent) | |
+- urg |= c->tags; | |
+- } | |
+- x = 0; | |
+- for (i = 0; i < LENGTH(tags); i++) { | |
+- w = TEXTW(tags[i]); | |
+- drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? Sc… | |
+- 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->ta… | |
+- urg & 1 << i); | |
+- x += w; | |
+- } | |
+- w = TEXTW(m->ltsymbol); | |
+- drw_setscheme(drw, scheme[SchemeNorm]); | |
+- x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); | |
+- | |
+- if ((w = m->ww - tw - x) > bh) { | |
+- if (m->sel) { | |
+- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : S… | |
+- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0… | |
+- if (m->sel->isfloating) | |
+- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->… | |
+- } else { | |
+- drw_setscheme(drw, scheme[SchemeNorm]); | |
+- drw_rect(drw, x, 0, w, bh, 1, 1); | |
+- } | |
+- } | |
+- drw_map(drw, m->barwin, 0, 0, m->ww, bh); | |
++ int x, w, tw = 0; | |
++ int boxs = drw->fonts->h / 9; | |
++ int boxw = drw->fonts->h / 6 + 2; | |
++ unsigned int i, occ = 0, urg = 0; | |
++ Client *c; | |
++ | |
++ // Calculate the actual bar width depending on if it's floating | |
++ int barwidth = floatbar ? (m->ww - 2 * barpadh) : m->ww; | |
++ | |
++ if (!m->showbar) | |
++ return; | |
++ | |
++ /* draw status first so it can be overdrawn by tags later */ | |
++ if (m == selmon) { /* status is only drawn on selected monitor */ | |
++ drw_setscheme(drw, scheme[SchemeNorm]); | |
++ tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ | |
++ drw_text(drw, barwidth - tw, 0, tw, bh + barheight, 0, stext, 0); | |
++ } | |
++ | |
++ for (c = m->clients; c; c = c->next) { | |
++ occ |= c->tags; | |
++ if (c->isurgent) | |
++ urg |= c->tags; | |
++ } | |
++ x = 0; | |
++ for (i = 0; i < LENGTH(tags); i++) { | |
++ w = TEXTW(tags[i]); | |
++ drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel … | |
++ drw_text(drw, x, 0, w, bh + barheight, lrpad / 2, tags[i], urg & 1 <<… | |
++ 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); | |
++ drw_setscheme(drw, scheme[SchemeNorm]); | |
++ x = drw_text(drw, x, 0, w, bh + barheight, lrpad / 2, m->ltsymbol, 0); | |
++ | |
++ if ((w = barwidth - tw - x) > bh + barheight) { | |
++ if (m->sel) { | |
++ drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); | |
++ drw_text(drw, x, 0, w, bh + barheight, lrpad / 2, m->sel->name, 0… | |
++ if (m->sel->isfloating) | |
++ drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); | |
++ } else { | |
++ drw_setscheme(drw, scheme[SchemeNorm]); | |
++ drw_rect(drw, x, 0, w, bh + barheight, 1, 1); | |
++ } | |
++ } | |
++ drw_map(drw, m->barwin, 0, 0, barwidth, bh + barheight); | |
+ } | |
+ | |
+ void | |
+@@ -1561,7 +1564,7 @@ setup(void) | |
+ if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) | |
+ die("no fonts could be loaded."); | |
+ lrpad = drw->fonts->h; | |
+- bh = drw->fonts->h + 2; | |
++ bh = drw->fonts->h + 2 + barheight; | |
+ updategeom(); | |
+ /* init atoms */ | |
+ utf8string = XInternAtom(dpy, "UTF8_STRING", False); | |
+@@ -1716,7 +1719,7 @@ togglebar(const Arg *arg) | |
+ { | |
+ selmon->showbar = !selmon->showbar; | |
+ updatebarpos(selmon); | |
+- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon… | |
++ XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon… | |
+ arrange(selmon); | |
+ } | |
+ | |
+@@ -1817,36 +1820,51 @@ unmapnotify(XEvent *e) | |
+ void | |
+ updatebars(void) | |
+ { | |
+- Monitor *m; | |
+- XSetWindowAttributes wa = { | |
+- .override_redirect = True, | |
+- .background_pixmap = ParentRelative, | |
+- .event_mask = ButtonPressMask|ExposureMask | |
+- }; | |
+- XClassHint ch = {"dwm", "dwm"}; | |
+- for (m = mons; m; m = m->next) { | |
+- if (m->barwin) | |
+- continue; | |
+- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh,… | |
+- CopyFromParent, DefaultVisual(dpy, screen), | |
+- CWOverrideRedirect|CWBackPixmap|CWEventMask, … | |
+- XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); | |
+- XMapRaised(dpy, m->barwin); | |
+- XSetClassHint(dpy, m->barwin, &ch); | |
+- } | |
++ Monitor *m; | |
++ XSetWindowAttributes wa = { | |
++ .override_redirect = True, | |
++ .background_pixmap = ParentRelative, | |
++ .event_mask = ButtonPressMask|ExposureMask | |
++ }; | |
++ XClassHint ch = {"dwm", "dwm"}; | |
++ for (m = mons; m; m = m->next) { | |
++ if (m->barwin) | |
++ continue; | |
++ if (floatbar) { | |
++ m->barwin = XCreateWindow(dpy, root, barpadh, barpadv, m->ww - 2 … | |
++ CopyFromParent, DefaultVisual(dpy, scre… | |
++ CWOverrideRedirect|CWBackPixmap|CWEvent… | |
++ XSetWindowBorder(dpy, m->barwin, scheme[SchemeBar][Co… | |
++ XSetWindowBorderWidth(dpy, m->barwin, barborder); | |
++ } else { | |
++ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh + ba… | |
++ CopyFromParent, DefaultVisual(dpy, scre… | |
++ CWOverrideRedirect|CWBackPixmap|CWEvent… | |
++ } | |
++ XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); | |
++ XMapRaised(dpy, m->barwin); | |
++ XSetClassHint(dpy, m->barwin, &ch); | |
++ } | |
+ } | |
+ | |
+ void | |
+ updatebarpos(Monitor *m) | |
+ { | |
+- m->wy = m->my; | |
+- m->wh = m->mh; | |
+- if (m->showbar) { | |
+- m->wh -= bh; | |
+- m->by = m->topbar ? m->wy : m->wy + m->wh; | |
+- m->wy = m->topbar ? m->wy + bh : m->wy; | |
+- } else | |
+- m->by = -bh; | |
++ if (floatbar) { | |
++ /* IF YOU ARE USING GAPS, PLEASE ADD BARBORDER TO THE END */ | |
++ m->wy = m->my + (barheight + bh + barpadv * 2 + barborder); /… | |
++ m->wh = m->mh - (barheight + bh + barpadv * 2 + barborder); /… | |
++ m->by = barpadv; … | |
++ } else { | |
++ m->wy = m->my; | |
++ m->wh = m->mh; | |
++ if (m->showbar) { | |
++ m->wh -= bh + barheight; | |
++ m->by = m->topbar ? m->wy : m->wy + m->wh; | |
++ m->wy = m->topbar ? m->wy + bh : m->wy; | |
++ } else | |
++ m->by = -bh + barheight; | |
++ } | |
+ } | |
+ | |
+ void | |
+-- | |
+2.49.0 | |
+ | |
diff --git a/dwm.suckless.org/patches/floatingstatus/index.md b/dwm.suckless.or… | |
@@ -0,0 +1,22 @@ | |
+floatingstatus | |
+============== | |
+ | |
+Description | |
+----------- | |
+This is a patch that lets you transform the status bar into a floating bar. Yo… | |
+ | |
+Config | |
+------ | |
+Everything is in config.h | |
+* `barpadv` - [int] Vertical padding. How far from the top it is. | |
+* `barpadh` - [int] Horizontal padding. How far from each side the bar is. | |
+* `barheight` - [int] Height of the bar. How long the bar is vertically. | |
+* `floatbar` - [Bool] Value to show / hide the bar | |
+ | |
+Download | |
+-------- | |
+* [floatingstatus-20250408-cfb8627.diff](floatingstatus-20250408-cfb8627.diff)… | |
+ | |
+Authors | |
+------- | |
+* Abhinav Prasai - <[email protected]> | |
diff --git a/dwm.suckless.org/patches/floatingstatus/screenshot.png b/dwm.suckl… | |
Binary files differ. |