feat(home): switch launcher/menu from fuzzel to rofi 2.0

rofi 2.0 landed in nixpkgs 26.05 with native Wayland (mainline upstreamed
the lbonn rofi-wayland fork — `wayland enabled`), so the original reason
to prefer fuzzel (rofi being X11-only / needing a community fork) is gone.
rofi's `.rasi` is far more expressive than fuzzel's flat INI, which lets
the launcher be a proper themed hero surface and revives the legacy
per-theme launcher designs.

- modules/home/rofi.nix replaces fuzzel.nix: per-element theme generated
  from theme-state.json (accent border, highlighted selection, rounded
  inputbar) via lib.formats.rasi.mkLiteral; themes/<slug>/rofi.rasi
  whole-swap; the nomarchy-menu dispatcher re-pointed to `rofi -dmenu`
  (power/theme/clipboard/calc with -mesg/files/web + root picker).
- SUPER+D is now `rofi -show drun`; the menu binds are unchanged.
- nomarchy.fuzzel.enable → nomarchy.rofi.enable; fuzzel dropped from
  home.packages. Pango handles nf-glyph fallback (no explicit font list
  needed as fuzzel's fcft did). show-icons off until an icon theme ships.

Verified: flake check green, HM generation builds, the generated
theme.rasi parses under `rofi -dump-theme`, Hyprland config verifies.
Not verified: rofi's on-screen rendering needs a real session.

Docs: README menu/override/roadmap sections and the module tree updated;
the per-theme launcher roadmap item now points at porting the legacy
rofi.rasi designs (the whole-swap mechanism is in place).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-06-13 14:41:46 +01:00
parent 76582c1ee9
commit 961314ea86
9 changed files with 532 additions and 201 deletions

View File

@@ -57,7 +57,7 @@ Flat on purpose. Two module trees, one options file each, no hidden layers.
│ ├── waybar.nix
│ ├── ghostty.nix
│ ├── btop.nix
│ ├── fuzzel.nix # launcher + nomarchy-menu (power, clip)
│ ├── rofi.nix # launcher + nomarchy-menu (power, clip)
│ ├── swaync.nix # notifications, same JSON
│ ├── idle.nix # hyprlock + hypridle, same JSON
│ └── yazi.nix # flagship TUI file manager + plugins
@@ -172,7 +172,7 @@ examples: **[docs/OVERRIDES.md](docs/OVERRIDES.md)**.
| `nomarchy.keyboard.variant` | `""` | XKB variant for the session |
| `nomarchy.hyprland.enable` | `true` | Nomarchy's Hyprland config |
| `nomarchy.waybar.enable` | `true` | Nomarchy's Waybar |
| `nomarchy.fuzzel.enable` | `true` | Themed fuzzel + `nomarchy-menu` (power menu) |
| `nomarchy.rofi.enable` | `true` | Themed rofi launcher + `nomarchy-menu` dispatcher |
| `nomarchy.swaync.enable` | `true` | swaync notifications, themed |
| `nomarchy.idle.enable` | `true` | hyprlock + hypridle (idle lock 5 min, display off 10, suspend 30) |
| `nomarchy.yazi.enable` | `true` | yazi TUI file manager, themed + curated plugins |
@@ -224,7 +224,7 @@ per theme — a single place to look, unlike the old distro's split:
| `btop.theme` | baked into the generation (generated from the palette when absent) |
| `waybar.css` | **whole-swap**: replaces the generated bar style entirely (probed at eval time, self-contained) |
| `waybar.jsonc` | whole-swap for the bar *layout* (must be plain JSON) |
| `fuzzel.ini` | **whole-swap**: replaces the generated launcher/menu config entirely |
| `rofi.rasi` | **whole-swap**: replaces the generated launcher/menu theme entirely |
Six ported themes ship a `waybar.css` identity (catppuccin, lumon, nord,
retro-82, summer-day, summer-night). Custom user themes can live in
@@ -261,37 +261,37 @@ close · `SUPER+1..9` workspaces · `Print` region screenshot.
## Roadmap
- **Menu system** (apps launcher + theme switching + system actions), built
on fuzzel — already shipped for SUPER+D/SUPER+T, dmenu mode does nested
menus and per-entry icons, and its INI theme can be baked from
theme-state.json like every other app:
- ✓ shipped: `modules/home/fuzzel.nix` (palette/fonts/border from the
theme JSON, `themes/<slug>/fuzzel.ini` whole-swap) and the
on rofi 2.0 (native Wayland on 26.05) — its `.rasi` theme is baked from
theme-state.json like every other app, with rich per-element styling:
- ✓ shipped: `modules/home/rofi.nix` (per-element theme generated from
the palette, `themes/<slug>/rofi.rasi` whole-swap) and the
`nomarchy-menu` dispatcher: root picker (no args) · `power`
(lock/logout/suspend/hibernate/reboot/shutdown, SUPER+X) ·
`theme` (SUPER+T) · `clipboard` (cliphist, SUPER+CTRL+V) · `calc`
(qalc, copy/chain) · `files` (fd → xdg-open) · `web` (DuckDuckGo)
(qalc, copy/chain) · `files` (fd → xdg-open) · `web` (DuckDuckGo).
SUPER+D is `rofi -show drun`.
- next modules: Network ▸ nmtui · Bluetooth ▸ blueman · Capture ▸
screenshot · **ask Claude**: `--prompt-only`
`$TERMINAL -e claude "<question>"` — the claude CLI auths via OAuth
against a Pro/Max subscription (no API key); REPL stays open for
follow-ups (claude-code in nixpkgs is unfree — allowUnfree is on)
- known limits accepted for now: no live-as-you-type results (dmenu
input is static per invocation) and no image previews
- decision record: this resolves the old Walker/Lua question in favor of
simplicity — no GTK4 launcher, no second theming pipeline, no image
previews (instant `bg next` covers wallpaper browsing); the dispatcher
owns the menu structure, so the renderer stays swappable
screenshot · **ask Claude**: free-text → `$TERMINAL -e claude
"<question>"` — the claude CLI auths via OAuth against a Pro/Max
subscription (no API key); REPL stays open for follow-ups (claude-code
in nixpkgs is unfree — allowUnfree is on)
- launcher icons: `show-icons` is off (no icon theme shipped yet);
enabling it well means shipping an icon theme (Papirus/Adwaita)
- decision record: resolves the old Walker/Lua question — no GTK4
launcher, no second theming pipeline; the dispatcher owns the menu
structure, so the renderer stays swappable (we moved fuzzel → rofi 2.0
once mainline gained native Wayland, for its richer theming)
- **Theme parity with legacy:** summer-day/night now carry their legacy
bar layouts as `waybar.jsonc` whole-swaps (adapted: dead legacy script
modules dropped, Nerd-Fonts-v2 codepoints remapped to FontAwesome/v3,
logo button opens nomarchy-menu); the other four identity themes are
palette recolors and already match. Remaining: a visual pass over all
six on the live ISO
- **Per-theme fuzzel identity:** the `themes/<slug>/fuzzel.ini` whole-swap
mechanism ships; what remains is authoring the inis for the six identity
themes from their legacy rofi.rasi files (per-element colors like
summer-night's green inputbar aren't expressible in fuzzel's flat
scheme — approximate, note the rest as a renderer limitation)
- **Per-theme rofi identity:** the `themes/<slug>/rofi.rasi` whole-swap
mechanism ships; what remains is porting the legacy `rofi.rasi` designs
(summer-day/night already have them in the legacy branch) for the
identity themes — rofi's `.rasi` expresses their per-element looks
(green inputbar, inverted window) directly, unlike the old flat scheme
- **Faster switches:** move `backgrounds/` out of the flake source (the 86 MB
re-copy on every state write is the main eval tax), then pre-built theme
variants if still needed