From 560912af52409966092afdf0eb93119c7d33c1d1 Mon Sep 17 00:00:00 2001 From: Oliver Davies Date: Tue, 18 Feb 2025 12:24:39 +0000 Subject: [PATCH] Move dwm and st patches https://github.com/donovanglover/nix-config/blob/9ad246031f5fa4a0ac4cc18cce04629804415195/home/dwm.nix --- flake.nix | 2 +- nix/hosts/t490/services/dwm.nix | 36 +++- nix/overlays/default.nix | 17 +- patches/dwm/dwm-hide_vacant_tags-6.4.diff | 48 ----- patches/dwm/dwm-pertag-20200914-61bb8b2.diff | 177 ------------------- patches/dwm/dwm-switchtotag-6.2.diff | 58 ------ patches/st/st-anysize-20220718-baa9357.diff | 164 ----------------- 7 files changed, 36 insertions(+), 466 deletions(-) delete mode 100644 patches/dwm/dwm-hide_vacant_tags-6.4.diff delete mode 100644 patches/dwm/dwm-pertag-20200914-61bb8b2.diff delete mode 100644 patches/dwm/dwm-switchtotag-6.2.diff delete mode 100644 patches/st/st-anysize-20220718-baa9357.diff diff --git a/flake.nix b/flake.nix index e885b59..590c29a 100644 --- a/flake.nix +++ b/flake.nix @@ -61,7 +61,7 @@ formatter.${system} = pkgs.nixfmt-rfc-style; - overlays = import ./nix/overlays { inherit inputs self; }; + overlays = import ./nix/overlays { inherit inputs; }; nixosModules.default = ./nix/modules/nixos; diff --git a/nix/hosts/t490/services/dwm.nix b/nix/hosts/t490/services/dwm.nix index 422ce2d..edaa3a3 100644 --- a/nix/hosts/t490/services/dwm.nix +++ b/nix/hosts/t490/services/dwm.nix @@ -2,6 +2,7 @@ config, lib, pkgs, + self, ... }: @@ -27,7 +28,27 @@ with lib; xserver = { displayManager.startx.enable = true; - windowManager.dwm.enable = true; + + windowManager.dwm = { + enable = true; + + package = pkgs.dwm.overrideAttrs (oldAttrs: { + patches = with pkgs; [ + "${self}/patches/dwm/add-custom-commands-and-keys.patch" + "${self}/patches/dwm/change-mod-key.patch" + + (fetchpatch { + url = "https://dwm.suckless.org/patches/hide_vacant_tags/dwm-hide_vacant_tags-6.4.diff"; + sha256 = "GIbRW0Inwbp99rsKLfIDGvPwZ3pqihROMBp5vFlHx5Q="; + }) + + (fetchpatch { + url = "https://dwm.suckless.org/patches/pertag/dwm-pertag-20200914-61bb8b2.diff"; + sha256 = "wRZP/27V7xYOBnFAGxqeJFXdoDk4K1EQMA3bEoAXr/0="; + }) + ]; + }); + }; }; }; @@ -37,7 +58,18 @@ with lib; dmenu dmenu-bluetooth networkmanager_dmenu - st + + (st.override { + patches = with pkgs; [ + "${self}/patches/st/change-font.patch" + + (fetchpatch { + url = "https://st.suckless.org/patches/anysize/st-anysize-20220718-baa9357.diff"; + sha256 = "yx9VSwmPACx3EN3CAdQkxeoJKJxQ6ziC9tpBcoWuWHc="; + }) + ]; + }) + xdotool ]; }; diff --git a/nix/overlays/default.nix b/nix/overlays/default.nix index 3f3b213..b6b27fd 100644 --- a/nix/overlays/default.nix +++ b/nix/overlays/default.nix @@ -1,4 +1,4 @@ -{ inputs, self, ... }: +{ inputs, ... }: { additions = @@ -10,21 +10,6 @@ }; modifications = final: prev: { - dwm = prev.dwm.override { - patches = [ - "${self}/patches/dwm/add-custom-commands-and-keys.patch" - "${self}/patches/dwm/change-mod-key.patch" - "${self}/patches/dwm/dwm-hide_vacant_tags-6.4.diff" - "${self}/patches/dwm/dwm-pertag-20200914-61bb8b2.diff" - ]; - }; - - st = prev.st.override { - patches = [ - "${self}/patches/st/change-font.patch" - "${self}/patches/st/st-anysize-20220718-baa9357.diff" - ]; - }; }; stable-packages = final: _prev: { diff --git a/patches/dwm/dwm-hide_vacant_tags-6.4.diff b/patches/dwm/dwm-hide_vacant_tags-6.4.diff deleted file mode 100644 index 42d9c05..0000000 --- a/patches/dwm/dwm-hide_vacant_tags-6.4.diff +++ /dev/null @@ -1,48 +0,0 @@ -:100644 100644 f1d86b2 0000000 M dwm.c - -diff --git a/dwm.c b/dwm.c -index f1d86b2..d41cc14 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -433,9 +433,15 @@ buttonpress(XEvent *e) - } - if (ev->window == selmon->barwin) { - i = x = 0; -- do -+ unsigned int occ = 0; -+ for(c = m->clients; c; c=c->next) -+ occ |= c->tags == TAGMASK ? 0 : c->tags; -+ do { -+ /* Do not reserve space for vacant tags */ -+ if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) -+ continue; - x += TEXTW(tags[i]); -- while (ev->x >= x && ++i < LENGTH(tags)); -+ } while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; -@@ -715,19 +721,18 @@ drawbar(Monitor *m) - } - - for (c = m->clients; c; c = c->next) { -- occ |= c->tags; -+ occ |= c->tags == TAGMASK ? 0 : c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { -+ /* Do not draw vacant tags */ -+ if(!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) -+ continue; - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - 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->tags & 1 << i, -- urg & 1 << i); - x += w; - } - w = TEXTW(m->ltsymbol); diff --git a/patches/dwm/dwm-pertag-20200914-61bb8b2.diff b/patches/dwm/dwm-pertag-20200914-61bb8b2.diff deleted file mode 100644 index c8d7fbc..0000000 --- a/patches/dwm/dwm-pertag-20200914-61bb8b2.diff +++ /dev/null @@ -1,177 +0,0 @@ -diff --git a/dwm.c b/dwm.c -index 664c527..ac8e4ec 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -111,6 +111,7 @@ typedef struct { - void (*arrange)(Monitor *); - } Layout; - -+typedef struct Pertag Pertag; - struct Monitor { - char ltsymbol[16]; - float mfact; -@@ -130,6 +131,7 @@ struct Monitor { - Monitor *next; - Window barwin; - const Layout *lt[2]; -+ Pertag *pertag; - }; - - typedef struct { -@@ -272,6 +274,15 @@ static Window root, wmcheckwin; - /* configuration, allows nested code to access above variables */ - #include "config.h" - -+struct Pertag { -+ unsigned int curtag, prevtag; /* current and previous tag */ -+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ -+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ -+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ -+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ -+ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ -+}; -+ - /* compile-time check if all tags fit into an unsigned int bit array. */ - struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -@@ -632,6 +643,7 @@ Monitor * - createmon(void) - { - Monitor *m; -+ unsigned int i; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; -@@ -642,6 +654,20 @@ createmon(void) - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); -+ m->pertag = ecalloc(1, sizeof(Pertag)); -+ m->pertag->curtag = m->pertag->prevtag = 1; -+ -+ for (i = 0; i <= LENGTH(tags); i++) { -+ m->pertag->nmasters[i] = m->nmaster; -+ m->pertag->mfacts[i] = m->mfact; -+ -+ m->pertag->ltidxs[i][0] = m->lt[0]; -+ m->pertag->ltidxs[i][1] = m->lt[1]; -+ m->pertag->sellts[i] = m->sellt; -+ -+ m->pertag->showbars[i] = m->showbar; -+ } -+ - return m; - } - -@@ -967,7 +993,7 @@ grabkeys(void) - void - incnmaster(const Arg *arg) - { -- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); - } - -@@ -1502,9 +1528,9 @@ void - setlayout(const Arg *arg) - { - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) -- selmon->sellt ^= 1; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; - if (arg && arg->v) -- selmon->lt[selmon->sellt] = (Layout *)arg->v; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); -@@ -1523,7 +1549,7 @@ setmfact(const Arg *arg) - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.05 || f > 0.95) - return; -- selmon->mfact = f; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; - arrange(selmon); - } - -@@ -1702,7 +1728,7 @@ tile(Monitor *m) - void - togglebar(const Arg *arg) - { -- selmon->showbar = !selmon->showbar; -+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -@@ -1741,9 +1767,33 @@ void - toggleview(const Arg *arg) - { - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); -+ int i; - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; -+ -+ if (newtagset == ~0) { -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ selmon->pertag->curtag = 0; -+ } -+ -+ /* test if the user did not select the same tag */ -+ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ for (i = 0; !(newtagset & 1 << i); i++) ; -+ selmon->pertag->curtag = i + 1; -+ } -+ -+ /* apply settings for this view */ -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; -+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; -+ -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); -+ - focus(NULL); - arrange(selmon); - } -@@ -2038,11 +2088,37 @@ updatewmhints(Client *c) - void - view(const Arg *arg) - { -+ int i; -+ unsigned int tmptag; -+ - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ -- if (arg->ui & TAGMASK) -+ if (arg->ui & TAGMASK) { - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ -+ if (arg->ui == ~0) -+ selmon->pertag->curtag = 0; -+ else { -+ for (i = 0; !(arg->ui & 1 << i); i++) ; -+ selmon->pertag->curtag = i + 1; -+ } -+ } else { -+ tmptag = selmon->pertag->prevtag; -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ selmon->pertag->curtag = tmptag; -+ } -+ -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; -+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; -+ -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); -+ - focus(NULL); - arrange(selmon); - } diff --git a/patches/dwm/dwm-switchtotag-6.2.diff b/patches/dwm/dwm-switchtotag-6.2.diff deleted file mode 100644 index 453f8ef..0000000 --- a/patches/dwm/dwm-switchtotag-6.2.diff +++ /dev/null @@ -1,58 +0,0 @@ -diff -up dwm-6.2-original/config.def.h dwm-6.2-modified/config.def.h ---- dwm-6.2-original/config.def.h 2019-02-02 14:55:28.000000000 +0200 -+++ dwm-6.2-modified/config.def.h 2019-11-18 19:36:22.515566509 +0200 -@@ -26,9 +26,9 @@ static const Rule rules[] = { - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ -- /* class instance title tags mask isfloating monitor */ -- { "Gimp", NULL, NULL, 0, 1, -1 }, -- { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -+ /* class instance title tags mask switchtotag isfloating monitor */ -+ { "Gimp", NULL, NULL, 0, 0, 1, -1 }, -+ { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1 }, - }; - - /* layout(s) */ -diff -up dwm-6.2-original/dwm.c dwm-6.2-modified/dwm.c ---- dwm-6.2-original/dwm.c 2019-02-02 14:55:28.000000000 +0200 -+++ dwm-6.2-modified/dwm.c 2019-11-18 19:37:18.792187705 +0200 -@@ -92,6 +92,7 @@ struct Client { - int basew, baseh, incw, inch, maxw, maxh, minw, minh; - int bw, oldbw; - unsigned int tags; -+ unsigned int switchtotag; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; -@@ -137,6 +138,7 @@ typedef struct { - const char *instance; - const char *title; - unsigned int tags; -+ unsigned int switchtotag; - int isfloating; - int monitor; - } Rule; -@@ -302,6 +304,11 @@ applyrules(Client *c) - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; -+ if (r->switchtotag) { -+ Arg a = { .ui = r->tags }; -+ c->switchtotag = selmon->tagset[selmon->seltags]; -+ view(&a); -+ } - } - } - if (ch.res_class) -@@ -1782,6 +1789,10 @@ unmanage(Client *c, int destroyed) - focus(NULL); - updateclientlist(); - arrange(m); -+ if (c->switchtotag) { -+ Arg a = { .ui = c->switchtotag }; -+ view(&a); -+ } - } - - void diff --git a/patches/st/st-anysize-20220718-baa9357.diff b/patches/st/st-anysize-20220718-baa9357.diff deleted file mode 100644 index 675ffdf..0000000 --- a/patches/st/st-anysize-20220718-baa9357.diff +++ /dev/null @@ -1,164 +0,0 @@ -From 8dcdc4b21a73268e167d98aa30f24315c7f3b7ff Mon Sep 17 00:00:00 2001 -From: Bakkeby -Date: Mon, 18 Jul 2022 16:52:03 +0200 -Subject: [PATCH] Adding anysize patch - ---- - x.c | 56 ++++++++++++++++++++++++++++++-------------------------- - 1 file changed, 30 insertions(+), 26 deletions(-) - -diff --git a/x.c b/x.c -index 2a3bd38..f534347 100644 ---- a/x.c -+++ b/x.c -@@ -81,6 +81,7 @@ typedef XftGlyphFontSpec GlyphFontSpec; - typedef struct { - int tw, th; /* tty width and height */ - int w, h; /* window width and height */ -+ int hborderpx, vborderpx; - int ch; /* char height */ - int cw; /* char width */ - int mode; /* window state/mode flags */ -@@ -331,7 +332,7 @@ ttysend(const Arg *arg) - int - evcol(XEvent *e) - { -- int x = e->xbutton.x - borderpx; -+ int x = e->xbutton.x - win.hborderpx; - LIMIT(x, 0, win.tw - 1); - return x / win.cw; - } -@@ -339,7 +340,7 @@ evcol(XEvent *e) - int - evrow(XEvent *e) - { -- int y = e->xbutton.y - borderpx; -+ int y = e->xbutton.y - win.vborderpx; - LIMIT(y, 0, win.th - 1); - return y / win.ch; - } -@@ -739,6 +740,9 @@ cresize(int width, int height) - col = MAX(1, col); - row = MAX(1, row); - -+ win.hborderpx = (win.w - col * win.cw) / 2; -+ win.vborderpx = (win.h - row * win.ch) / 2; -+ - tresize(col, row); - xresize(col, row); - ttyresize(win.tw, win.th); -@@ -869,8 +873,8 @@ xhints(void) - sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; - sizeh->height = win.h; - sizeh->width = win.w; -- sizeh->height_inc = win.ch; -- sizeh->width_inc = win.cw; -+ sizeh->height_inc = 1; -+ sizeh->width_inc = 1; - sizeh->base_height = 2 * borderpx; - sizeh->base_width = 2 * borderpx; - sizeh->min_height = win.ch + 2 * borderpx; -@@ -1152,8 +1156,8 @@ xinit(int cols, int rows) - xloadcols(); - - /* adjust fixed window geometry */ -- win.w = 2 * borderpx + cols * win.cw; -- win.h = 2 * borderpx + rows * win.ch; -+ win.w = 2 * win.hborderpx + 2 * borderpx + cols * win.cw; -+ win.h = 2 * win.vborderpx + 2 * borderpx + rows * win.ch; - if (xw.gm & XNegative) - xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; - if (xw.gm & YNegative) -@@ -1242,7 +1246,7 @@ xinit(int cols, int rows) - int - xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) - { -- float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp; -+ float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp; - ushort mode, prevmode = USHRT_MAX; - Font *font = &dc.font; - int frcflags = FRC_NORMAL; -@@ -1375,7 +1379,7 @@ void - xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) - { - int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); -- int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, -+ int winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, - width = charlen * win.cw; - Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; - XRenderColor colfg, colbg; -@@ -1465,17 +1469,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i - - /* Intelligent cleaning up of the borders. */ - if (x == 0) { -- xclear(0, (y == 0)? 0 : winy, borderpx, -+ xclear(0, (y == 0)? 0 : winy, win.hborderpx, - winy + win.ch + -- ((winy + win.ch >= borderpx + win.th)? win.h : 0)); -+ ((winy + win.ch >= win.vborderpx + win.th)? win.h : 0)); - } -- if (winx + width >= borderpx + win.tw) { -+ if (winx + width >= win.hborderpx + win.tw) { - xclear(winx + width, (y == 0)? 0 : winy, win.w, -- ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); -+ ((winy + win.ch >= win.vborderpx + win.th)? win.h : (winy + win.ch))); - } - if (y == 0) -- xclear(winx, 0, winx + width, borderpx); -- if (winy + win.ch >= borderpx + win.th) -+ xclear(winx, 0, winx + width, win.vborderpx); -+ if (winy + win.ch >= win.vborderpx + win.th) - xclear(winx, winy + win.ch, winx + width, win.h); - - /* Clean up the region we want to draw to. */ -@@ -1569,35 +1573,35 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) - case 3: /* Blinking Underline */ - case 4: /* Steady Underline */ - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + (cy + 1) * win.ch - \ -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + (cy + 1) * win.ch - \ - cursorthickness, - win.cw, cursorthickness); - break; - case 5: /* Blinking bar */ - case 6: /* Steady bar */ - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + cy * win.ch, -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + cy * win.ch, - cursorthickness, win.ch); - break; - } - } else { - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + cy * win.ch, -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + cy * win.ch, - win.cw - 1, 1); - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + cy * win.ch, -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, -- borderpx + (cx + 1) * win.cw - 1, -- borderpx + cy * win.ch, -+ win.hborderpx + (cx + 1) * win.cw - 1, -+ win.vborderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, -- borderpx + cx * win.cw, -- borderpx + (cy + 1) * win.ch - 1, -+ win.hborderpx + cx * win.cw, -+ win.vborderpx + (cy + 1) * win.ch - 1, - win.cw, 1); - } - } --- -2.37.1 -