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:
267
.claude/settings.local.json
Normal file
267
.claude/settings.local.json
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(grep -i \"\\\\.nix$\")",
|
||||||
|
"Bash(xargs ls *)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.activationPackage.outPath)",
|
||||||
|
"Bash(git *)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.default.config.system.activationScripts.home-manager-activate.text)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.installerIsoGraphical.config.system.activationScripts.home-manager-activate.text)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.config.system.build.toplevel.drvPath)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.system.build.toplevel.drvPath)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#homeConfigurations.nomarchy.activationPackage.drvPath)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.default.config.systemd.services.\"home-manager-nomarchy\".serviceConfig.ExecStart)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#nixosConfigurations.default.config.system.build.vm --no-link --print-out-paths)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#homeConfigurations.nomarchy.config.xdg.configFile.\"nomarchy/current/background\".source)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.home-files.outPath)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#homeConfigurations.nomarchy.config.home-files --no-link --print-out-paths)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#homeConfigurations.nomarchy.config.systemd.user.startServices)",
|
||||||
|
"Bash(xxd)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#packages.x86_64-linux.allThemeVariants.drvPath)",
|
||||||
|
"Bash(chmod +x /home/bernardo/Projects/Coding/Nomarchy/themes/engine/scripts/nomarchy-themes-prebuild)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#homeConfigurations.nomarchy.activationPackage --no-link --print-out-paths)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#homeConfigurations.nomarchy.config.home.packages.outPath)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.home-path.outPath)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --expr '\\(builtins.readDir ./themes/engine/scripts\\)' --json)",
|
||||||
|
"Bash(nix-build -I nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos /home/bernardo/Projects/Coding/Nomarchy/flake.nix --argstr attr nixosConfigurations.installerIsoGraphical)",
|
||||||
|
"Bash(awk '{print $NF}')",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.hardware.pulseaudio.enable .#nixosConfigurations.installerIsoGraphical.config.services.pipewire.enable .#nixosConfigurations.installerIsoGraphical.config.services.pipewire.pulse.enable)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.services.displayManager.sddm.enable .#nixosConfigurations.installerIsoGraphical.config.services.displayManager.defaultSession .#nixosConfigurations.installerIsoGraphical.config.programs.hyprland.enable)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --json .#nixosConfigurations.installerIsoGraphical.config.users.users.nixos.extraGroups)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.hardware.pulseaudio.enable)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.services.pipewire.enable)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.services.pipewire.pulse.enable)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.programs.hyprland.enable)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval '.#nixosConfigurations.installerIsoGraphical.config.__TRACKED_VAR__')",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.installerIsoGraphical.config.home-manager.users.nixos.home.packages --apply 'builtins.length')",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.config.home-manager.users.nomarchy.home.packages --apply 'builtins.length')",
|
||||||
|
"Bash(chmod +x /home/bernardo/Projects/Coding/Nomarchy/features/scripts/utils/nomarchy-test-live-iso)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --json .#nixosConfigurations.installerIsoGraphical.config.boot.initrd.kernelModules)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#homeConfigurations.nomarchy.config.programs.waybar.systemd.enable)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.systemd.user.services --apply 'svcs: builtins.concatStringsSep \"\\\\n\" \\(builtins.attrNames svcs\\)')",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.gtk.iconTheme.package.pname)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw nixpkgs#everforest-gtk-variant.pname)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' search nixpkgs everforest)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.everforest-gtk-variant.pname)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.everforest-gtk-theme.pname)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.everforest-gtk-variant)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --expr 'let pkgs = import \\(builtins.getFlake \"/home/bernardo/Projects/Coding/Nomarchy\"\\).inputs.nixpkgs { system = \"x86_64-linux\"; config.allowUnfree = true; }; in builtins.attrNames \\(pkgs // {} \\)')",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --expr 'let pkgs = import \\(builtins.getFlake \"/home/bernardo/Projects/Coding/Nomarchy\"\\).inputs.nixpkgs { system = \"x86_64-linux\"; config.allowUnfree = true; }; in builtins.concatStringsSep \"\\\\n\" \\(builtins.filter \\(n: builtins.match \".*[Ee]verforest.*\" n != null\\) \\(builtins.attrNames pkgs\\)\\)' --raw)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#homeConfigurations.nomarchy.config.gtk.iconTheme.name)",
|
||||||
|
"Bash(bash -n /home/bernardo/Projects/Coding/Nomarchy/installer/install.sh)",
|
||||||
|
"Bash(bash -n /home/bernardo/Projects/Coding/Nomarchy/installer/hardware-db.sh)",
|
||||||
|
"Read(//tmp/**)",
|
||||||
|
"Bash(bash -c ' *)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#overlays.default --apply 'o: toString \\(builtins.typeOf o\\)')",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#overlays.default --apply 'o: \"overlay present: \" + builtins.typeOf o')",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.default.config.system.nixos.distroName)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.default.config.system.nixos.distroId)",
|
||||||
|
"Bash(nix-instantiate --parse /home/bernardo/Projects/Coding/Nomarchy/installer/disko-golden.nix)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#nixosConfigurations.installerIsoGraphical.config.system.build.toplevel --no-link --print-out-paths)",
|
||||||
|
"Bash(bash /home/bernardo/Projects/Coding/Nomarchy/installer/install.sh --help)",
|
||||||
|
"Bash(bash -c 'echo \"HOSTNAME=$HOSTNAME\"')",
|
||||||
|
"Bash(bash -c 'echo \"HOSTNAME default=$HOSTNAME\"')",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --raw .#nixosConfigurations.installerIsoGraphical.config.services.getty.helpLine)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.voxtype.pname)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval .#nixosConfigurations.default.pkgs.opencode.pname)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' build .#nixosConfigurations.default.config.system.build.vm --no-link)",
|
||||||
|
"Bash(nix log *)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --json --impure --expr ' *)",
|
||||||
|
"Bash(cat)",
|
||||||
|
"Bash(chmod +x /tmp/theme_comparison.sh)",
|
||||||
|
"Bash(/tmp/theme_comparison.sh)",
|
||||||
|
"Bash(xargs -I {} dirname {})",
|
||||||
|
"Bash(xargs -I {} basename {})",
|
||||||
|
"Bash(chmod +x /tmp/color_compare.sh)",
|
||||||
|
"Bash(bash /tmp/color_compare.sh)",
|
||||||
|
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval --raw 'github:nix-community/disko/latest#packages.x86_64-linux.disko.outPath')",
|
||||||
|
"Bash(find /nix/store/*disko*/lib/disko -name \"luks*\")",
|
||||||
|
"Bash(nix flake *)",
|
||||||
|
"Bash(nix-instantiate --parse /home/bernardo/Projects/Coding/Nomarchy/flake.nix)",
|
||||||
|
"Bash(nix eval *)",
|
||||||
|
"Bash(bash installer/install.sh --dry-run)",
|
||||||
|
"Bash(sudo bash *)",
|
||||||
|
"Bash(chmod +x /home/bernardo/Projects/Coding/Nomarchy/core/system/scripts/nomarchy-env-update)",
|
||||||
|
"Bash(bash -n /home/bernardo/Projects/Coding/Nomarchy/core/system/scripts/nomarchy-env-update)",
|
||||||
|
"Bash(sed -n '1450,1500p' /home/bernardo/Projects/Coding/Nomarchy/installer/install.sh)",
|
||||||
|
"Bash(grep -A 5 'nixosConfigurations.$HOSTNAME' /home/bernardo/Projects/Coding/Nomarchy/installer/install.sh)",
|
||||||
|
"Bash(mkdir -p /tmp/globtest)",
|
||||||
|
"Bash(touch nvme0n1 *)",
|
||||||
|
"Bash(shopt -s nullglob)",
|
||||||
|
"Bash(bash -n installer/install.sh)",
|
||||||
|
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval .#nixosConfigurations.nomarchy-live.config.system.build.toplevel.outPath)",
|
||||||
|
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval --impure --expr 'let f = import ./core/system/impermanence.nix; in \\(f { config = { nomarchy.system.impermanence = { enable = true; mainLuksName = \"crypted_main\"; }; }; lib = \\(import <nixpkgs> {}\\).lib; pkgs = null; inputs = { impermanence.nixosModules.impermanence = {}; }; }\\).config.boot.initrd.postDeviceCommands')",
|
||||||
|
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval .#nixosConfigurations.nomarchy-installer.config.system.build.toplevel.outPath)",
|
||||||
|
"Bash(nix --extra-experimental-features \"nix-command flakes\" eval .#nixosConfigurations.nomarchy-live.config.nomarchy.system.theme)",
|
||||||
|
"Bash(chmod +x *)",
|
||||||
|
"Bash(./bin/utils/nomarchy-docs-scripts --out docs/SCRIPTS.md)",
|
||||||
|
"Bash(awk '/^## Missing references/,/^## Menu items/' docs/SCRIPTS.md)",
|
||||||
|
"Bash(bash -n bin/utils/nomarchy-docs-scripts)",
|
||||||
|
"Bash(bash -n features/scripts/utils/nomarchy-docs-scripts)",
|
||||||
|
"Bash(bash -n themes/engine/scripts/nomarchy-theme-next)",
|
||||||
|
"Bash(grep '`unused?`' docs/SCRIPTS.md)",
|
||||||
|
"Bash(awk -F'|' '{print $2}')",
|
||||||
|
"Bash(awk *)",
|
||||||
|
"Bash(grep -c '`unused?`' docs/SCRIPTS.md)",
|
||||||
|
"Bash(grep -n '`unused?`' docs/SCRIPTS.md)",
|
||||||
|
"Bash(grep '^| `__TRACKED_VAR__` ' docs/SCRIPTS.md)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' flake check --no-build)",
|
||||||
|
"Bash(grep -c '`kept`' docs/SCRIPTS.md)",
|
||||||
|
"Bash(nix shell *)",
|
||||||
|
"Bash(nix shell 'nixpkgs#shellcheck' --command bash -c ' *)",
|
||||||
|
"Bash(./bin/utils/nomarchy-docs-scripts --out /tmp/SCRIPTS.regen.md)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --expr ' *)",
|
||||||
|
"Bash(sed -n '100,108p' core/home/options.nix)",
|
||||||
|
"Bash(sed -n '185,195p' core/system/options.nix)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --json --expr ' *)",
|
||||||
|
"Bash(bash -n *)",
|
||||||
|
"Bash(nix --extra-experimental-features 'nix-command flakes' eval --impure --raw --expr ' *)",
|
||||||
|
"Bash(grep '^| `nomarchy-manual`' docs/SCRIPTS.md)",
|
||||||
|
"Bash(nix *)",
|
||||||
|
"Bash(sudo -n cat /etc/environment)",
|
||||||
|
"Bash(systemctl --user show-environment)",
|
||||||
|
"Bash(./bin/utils/nomarchy-docs-keybindings --out /tmp/keybindings-fresh.md)",
|
||||||
|
"Bash(bash bin/utils/nomarchy-docs-keybindings --out /tmp/keybindings-fresh.md)",
|
||||||
|
"Bash(nix-shell -p shellcheck --run \"shellcheck --severity=error features/scripts/utils/nomarchy-menu features/scripts/utils/nomarchy-launch-screensaver\")",
|
||||||
|
"Bash(./bin/utils/nomarchy-docs-keybindings --out docs/KEYBINDINGS.md)",
|
||||||
|
"Bash(grep -rEho 'jq[^\"]*--arg [a-zA-Z]+|\\\\.[a-zA-Z][a-zA-Z_0-9]+ = \\\\$|jq -r .\\\\.[a-zA-Z]+' features/scripts core/system/scripts themes/engine/scripts)",
|
||||||
|
"Read(//home/bernardo/.config/mako/**)",
|
||||||
|
"Read(//home/bernardo/.config/nomarchy/default/hypr/**)",
|
||||||
|
"Read(//home/bernardo/.config/nomarchy/current/theme/**)",
|
||||||
|
"Read(//etc/nixos/**)",
|
||||||
|
"Bash(sudo git -C /etc/nixos log --oneline -3)",
|
||||||
|
"Bash(PATH=/home/bernardo/Projects/Coding/Nomarchy/features/scripts/utils:/home/bernardo/Projects/Coding/Nomarchy/themes/engine/scripts:__TRACKED_VAR__ bash /home/bernardo/Projects/Coding/Nomarchy/features/scripts/utils/nomarchy-installed-summary)",
|
||||||
|
"Bash(grep *)",
|
||||||
|
"Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); r=d['results'][0]['extensions'][0]; print\\('version:', r['versions'][0]['version']\\); print\\('displayName:', r['displayName']\\); print\\('publisher:', r['publisher']['publisherName']\\); print\\('extName:', r['extensionName']\\)\")",
|
||||||
|
"Bash(python3 -c \"import sys,json; d=json.load\\(sys.stdin\\); [print\\(x['file'],'=',x['value']\\) for x in d]\")",
|
||||||
|
"Bash([ -f \"core/home/config/nomarchy/default/hypr/apps/$f.conf\" ])",
|
||||||
|
"Bash([ -f \"core/home/config/nomarchy/default/hypr/bindings/$f.conf\" ])",
|
||||||
|
"Bash([ -f \"core/home/config/nomarchy/default/hypr/$f.conf\" ])",
|
||||||
|
"Bash([ -f \"features/desktop/hyprland/config/$f.conf\" ])",
|
||||||
|
"Bash(timeout 580 ./bin/utils/nomarchy-eval-matrix)",
|
||||||
|
"Bash(break)",
|
||||||
|
"Bash(sed -n 1,45p __TRACKED_VAR__/nix/package.nix)",
|
||||||
|
"Bash(sed -n 1,50p __TRACKED_VAR__/nix/modules/home-manager.nix)",
|
||||||
|
"Bash(python3 -c 'import json,sys; d=json.load\\(sys.stdin\\); print\\('\\\\''top path:'\\\\'', d.get\\('\\\\''path'\\\\'','\\\\''?'\\\\''\\)\\); inp=d.get\\('\\\\''inputs'\\\\'',{}\\); print\\('\\\\''inputs:'\\\\'', list\\(inp.keys\\(\\)\\)\\); print\\('\\\\''walker present:'\\\\'', '\\\\''walker'\\\\'' in inp\\); *)",
|
||||||
|
"Bash(echo \"exit: $?\")",
|
||||||
|
"Bash(echo 'output: [__TRACKED_VAR__]')",
|
||||||
|
"Bash(time ./bin/utils/nomarchy-eval-matrix)",
|
||||||
|
"Bash(python3 -c \"import json,sys; [print\\(x\\) for x in sorted\\(json.load\\(sys.stdin\\)\\)]\")",
|
||||||
|
"Read(//dev/**)",
|
||||||
|
"Bash(command -v qemu-system-x86_64 qemu-kvm)",
|
||||||
|
"Bash(echo \"BUILD_EXIT=$?\")",
|
||||||
|
"Bash(rm -f /tmp/nomarchy-mon.sock)",
|
||||||
|
"Bash(mkdir -p /tmp/nomarchy-vmrun)",
|
||||||
|
"Bash(QEMU_OPTS='-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -vga none' /tmp/nomarchy-vm/bin/run-nomarchy-vm)",
|
||||||
|
"Bash(echo \"VM_EXIT=$?\")",
|
||||||
|
"Bash(magick /tmp/shot.png -crop 5120x130+0+0 +repage /tmp/shot-top.png)",
|
||||||
|
"Bash(magick /tmp/shot.png -crop 1400x420+0+440 +repage /tmp/shot-term.png)",
|
||||||
|
"Bash(/nix/store/wv8bpzriikv65xnd1vciqpq7rnr8h2q2-bash-5.3p3/bin/bash -c 'compgen -G \"/etc/*\" >/dev/null 2>&1 && echo \"compgen WORKS\" || echo \"compgen MISSING \\(progcomp disabled\\)\"')",
|
||||||
|
"Bash(compgen -G \"/etc/*\")",
|
||||||
|
"Bash(/nix/store/wv8bpzriikv65xnd1vciqpq7rnr8h2q2-bash-5.3p3/bin/bash -c 'shopt -s nullglob; a=\\(/etc/hos*\\); echo \"nullglob ok: ${#a[@]} match\\(es\\)\"')",
|
||||||
|
"Bash(mkdir -p /tmp/nomarchy-vmrun2)",
|
||||||
|
"Bash(pgrep -f qemu-system)",
|
||||||
|
"Bash(rm -rf /tmp/nomarchy-vmrun3)",
|
||||||
|
"Bash(mkdir -p /tmp/nomarchy-vmrun3)",
|
||||||
|
"Bash(echo \"exit=$?\")",
|
||||||
|
"Bash(socat - unix-connect:/tmp/nomarchy-mon.sock)",
|
||||||
|
"Bash(magick /tmp/shot3.ppm /tmp/shot3.png)",
|
||||||
|
"Bash(magick identify *)",
|
||||||
|
"Bash(echo \"captured -> $\\(magick identify -format '%wx%h' /tmp/shot3.png\\)\")",
|
||||||
|
"Bash(magick /tmp/shot3.png -crop 5120x150+0+0 +repage /tmp/shot3-top.png)",
|
||||||
|
"Bash(pkill -x qemu-system-x86)",
|
||||||
|
"Bash(pkill -f \"qemu-system-x86_64 -machine\")",
|
||||||
|
"Bash(rm -rf /tmp/nomarchy-vmrun4)",
|
||||||
|
"Bash(mkdir -p /tmp/nomarchy-vmrun4)",
|
||||||
|
"Bash(echo \"boot-exit=$?\")",
|
||||||
|
"Bash(magick /tmp/shot4.ppm /tmp/shot4.png)",
|
||||||
|
"Bash(echo \"captured -> $\\(magick identify -format '%wx%h' /tmp/shot4.png\\)\")",
|
||||||
|
"Bash(magick /tmp/shot4.png -crop 5120x160+0+0 +repage /tmp/shot4-top.png)",
|
||||||
|
"Bash(rm -rf /tmp/vmrun_final)",
|
||||||
|
"Bash(mkdir -p /tmp/vmrun_final)",
|
||||||
|
"Bash(magick /tmp/shot5.ppm /tmp/shot5.png)",
|
||||||
|
"Bash(echo \"captured -> $\\(magick identify -format '%wx%h' /tmp/shot5.png\\)\")",
|
||||||
|
"Bash(magick /tmp/shot5.png -crop 5120x170+0+0 +repage /tmp/shot5-top.png)",
|
||||||
|
"Bash(rm -rf /tmp/vmssh)",
|
||||||
|
"Bash(mkdir -p /tmp/vmssh)",
|
||||||
|
"Bash(QEMU_OPTS='-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -vga none' QEMU_NET_OPTS=hostfwd=tcp::2222-:22 /tmp/nomarchy-vm-ssh/bin/run-nixos-vm)",
|
||||||
|
"Bash(command -v expect)",
|
||||||
|
"Read(//home/bernardo/.ssh/**)",
|
||||||
|
"Bash(QEMU_OPTS='-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -vga none' QEMU_NET_OPTS=hostfwd=tcp::2222-:22 /tmp/nomarchy-vm-ssh/bin/run-nomarchy-vm)",
|
||||||
|
"Bash(echo \"vm-exited rc=$?\")",
|
||||||
|
"Bash(pkill -f \"run-nomarchy-vm\")",
|
||||||
|
"Bash(rm -rf /tmp/vmtheme)",
|
||||||
|
"Bash(mkdir -p /tmp/vmtheme)",
|
||||||
|
"Bash(echo \"vm exited rc=$?\")",
|
||||||
|
"Bash(magick /tmp/latte.ppm -resize 1700 /tmp/latte.png)",
|
||||||
|
"Bash(echo \"saved $\\(magick identify -format '%wx%h' /tmp/latte.png\\)\")",
|
||||||
|
"Bash(./bin/utils/nomarchy-eval-matrix)",
|
||||||
|
"Bash(rm -f /tmp/nomarchy.qcow2 /tmp/vm-boot.log)",
|
||||||
|
"Bash(NIX_DISK_IMAGE=/tmp/nomarchy.qcow2 QEMU_OPTS='-display none -m 4096' /tmp/vm-verify-result/bin/run-nomarchy-vm)",
|
||||||
|
"Bash(echo \"VM PID $!\")",
|
||||||
|
"Bash(pkill -f 'qemu-system-x86_64 -machine accel=kvm.*nomarchy')",
|
||||||
|
"Bash(rm -f /tmp/vm-verify.nix /tmp/nomarchy.qcow2 /tmp/vm-boot.log /tmp/vm-verify-result)",
|
||||||
|
"Bash(pkill -9 -f 'qemu-system')",
|
||||||
|
"Bash(rm -f /tmp/nomarchy.qcow2)",
|
||||||
|
"Bash(python3 -)",
|
||||||
|
"Bash(sed -n '206,228p' features/scripts/utils/nomarchy-menu)",
|
||||||
|
"Bash(pkill -9 -f 'run-nixos-vm\\\\|qemu-system-x86_64.*nomarchy')",
|
||||||
|
"Bash(rm -f /tmp/nomarchy.qcow2 /tmp/vm-verify.nix /tmp/vm-boot.log /tmp/menu-*.sh /tmp/layout-check.sh /tmp/validate-fixes.sh /tmp/menu-cmds.txt /tmp/shipped.txt)",
|
||||||
|
"Bash(rm -f /tmp/vm-verify-result)",
|
||||||
|
"Bash(kill -9 1285354)",
|
||||||
|
"Bash(sed -n '1,30p' features/scripts/battery-monitor.nix)",
|
||||||
|
"Bash(sed -n '40,75p' features/desktop/waybar/default.nix)",
|
||||||
|
"Bash(sed -n '140,160p' features/desktop/waybar/themes/summer-night/config.jsonc)",
|
||||||
|
"Bash(sed -n '10,20p' features/desktop/waybar/config/config.jsonc)",
|
||||||
|
"Bash(python3 -m json.tool)",
|
||||||
|
"Bash(/tmp/nomarchy-multidisk-test/run-vm.sh)",
|
||||||
|
"Bash(socat - UNIX-CONNECT:mon.sock)",
|
||||||
|
"Bash(/tmp/nomarchy-multidisk-test/boot-from-disk.sh)",
|
||||||
|
"Bash(socat - UNIX-CONNECT:bootmon.sock)",
|
||||||
|
"Bash(convert /tmp/nomarchy-multidisk-test/screen.ppm /tmp/nomarchy-multidisk-test/screen.png)",
|
||||||
|
"Bash(magick /tmp/nomarchy-multidisk-test/screen.ppm /tmp/nomarchy-multidisk-test/screen.png)",
|
||||||
|
"Bash(shellcheck --severity=error installer/install.sh)",
|
||||||
|
"Bash(curl -s \"https://api.github.com/repos/nix-community/home-manager/contents/modules/programs/vscode?ref=0d02ec1d0a05f88ef9e74b516842900c41f0f2fe\")",
|
||||||
|
"Bash(python3 -c \"import json,sys;[print\\(x['name']\\) for x in json.load\\(sys.stdin\\)]\")",
|
||||||
|
"Bash(curl -s \"https://api.github.com/repos/nix-community/home-manager/contents/modules/programs/vscode?ref=release-25.11\")",
|
||||||
|
"Bash(curl -s \"https://api.github.com/repos/nix-community/home-manager/contents/modules/programs/vscode?ref=49ca96b2714c5931e17401eff87f3edd42d2b0f2\")",
|
||||||
|
"Bash(python3 -c \"import json,sys;d=json.load\\(sys.stdin\\);[print\\(x['name']\\) for x in d]\")",
|
||||||
|
"Bash(curl -s -o /dev/null -w \"%{http_code}\\\\n\" \"https://raw.githubusercontent.com/nix-community/home-manager/49ca96b2714c5931e17401eff87f3edd42d2b0f2/modules/programs/vscode/each-config.nix\")",
|
||||||
|
"Read(//nix/store/**)",
|
||||||
|
"Bash(mkdir -p __TRACKED_VAR__/nomarchy-install-test)",
|
||||||
|
"Bash(qemu-img create *)",
|
||||||
|
"Read(//home/bernardo/.config/nomarchy/**)",
|
||||||
|
"Read(//home/bernardo/.local/share/nomarchy/**)",
|
||||||
|
"Read(//home/bernardo/.config/elephant/**)",
|
||||||
|
"Read(//home/bernardo/.local/share/elephant/**)",
|
||||||
|
"Read(//home/bernardo/.config/walker/**)",
|
||||||
|
"WebFetch(domain:raw.githubusercontent.com)",
|
||||||
|
"Bash(python3 -c ' *)",
|
||||||
|
"Bash(nix-store -r /nix/store/hydnry53i2qbmqq0b0872wlbzdkpq1bd-source)",
|
||||||
|
"Bash(echo \"EXIT=$?\")",
|
||||||
|
"Bash(sed -n '44,50p' features/default.nix)",
|
||||||
|
"Bash(sed -n '14,20p' features/scripts/default.nix)",
|
||||||
|
"Bash(sed -n '11,17p' themes/engine/scripts.nix)",
|
||||||
|
"WebSearch",
|
||||||
|
"WebFetch(domain:github.com)",
|
||||||
|
"Bash(curl -sL \"https://api.github.com/repos/hyprwm/Hyprland/commits?sha=v0.55.3&per_page=100\")",
|
||||||
|
"Bash(curl -sL -o /tmp/hypr-fence-fix.patch \"https://github.com/hyprwm/Hyprland/commit/bdf0aaa5409fe2e4715e2796d669e16776de0233.patch\")",
|
||||||
|
"Bash(rm -f /tmp/nomarchy-2605.qcow2 /tmp/nomarchy-mon.sock /tmp/nomarchy-serial.sock)",
|
||||||
|
"Bash(NIX_DISK_IMAGE=/tmp/nomarchy-2605.qcow2 QEMU_OPTS=\"-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -serial unix:/tmp/nomarchy-serial.sock,server,nowait\" /tmp/nomarchy-vm-2605/bin/run-nomarchy-vm)",
|
||||||
|
"Bash(python3 *)",
|
||||||
|
"Bash(curl -sL https://raw.githubusercontent.com/hyprwm/Hyprland/v0.55.3/CMakeLists.txt)",
|
||||||
|
"Bash(curl -sL https://raw.githubusercontent.com/hyprwm/Hyprland/v0.55.2/CMakeLists.txt)",
|
||||||
|
"Bash(NIX_DISK_IMAGE=/tmp/nomarchy-2605.qcow2 QEMU_OPTS=\"-display none -monitor unix:/tmp/nomarchy-mon.sock,server,nowait -serial unix:/tmp/nomarchy-serial.sock,server,nowait\" /tmp/nomarchy-vm-2605-fixed/bin/run-nomarchy-vm)",
|
||||||
|
"Bash(xargs du -sh)",
|
||||||
|
"Bash(xargs du -csh)",
|
||||||
|
"Bash(curl -s https://raw.githubusercontent.com/nix-community/stylix/release-26.05/flake.nix)",
|
||||||
|
"Bash(nix build *)",
|
||||||
|
"Bash(echo \"exit $?\")",
|
||||||
|
"Bash(pkill -f \"test-install.sh\")",
|
||||||
|
"Bash(pkill -f \"qemu-system-x86_64.*NOMARCHY\\\\|qemu-system-x86_64.*nomarchy\")",
|
||||||
|
"Bash(NOMARCHY_PATH=__TRACKED_VAR__ python3 pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py --quiet apply summer-night --no-switch)",
|
||||||
|
"Bash(NOMARCHY_PATH=__TRACKED_VAR__ python3 pkgs/nomarchy-theme-sync/nomarchy-theme-sync.py --quiet apply summer-day --no-switch)",
|
||||||
|
"Bash(xargs cat)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
48
README.md
48
README.md
@@ -57,7 +57,7 @@ Flat on purpose. Two module trees, one options file each, no hidden layers.
|
|||||||
│ ├── waybar.nix
|
│ ├── waybar.nix
|
||||||
│ ├── ghostty.nix
|
│ ├── ghostty.nix
|
||||||
│ ├── btop.nix
|
│ ├── btop.nix
|
||||||
│ ├── fuzzel.nix # launcher + nomarchy-menu (power, clip)
|
│ ├── rofi.nix # launcher + nomarchy-menu (power, clip)
|
||||||
│ ├── swaync.nix # notifications, same JSON
|
│ ├── swaync.nix # notifications, same JSON
|
||||||
│ ├── idle.nix # hyprlock + hypridle, same JSON
|
│ ├── idle.nix # hyprlock + hypridle, same JSON
|
||||||
│ └── yazi.nix # flagship TUI file manager + plugins
|
│ └── 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.keyboard.variant` | `""` | XKB variant for the session |
|
||||||
| `nomarchy.hyprland.enable` | `true` | Nomarchy's Hyprland config |
|
| `nomarchy.hyprland.enable` | `true` | Nomarchy's Hyprland config |
|
||||||
| `nomarchy.waybar.enable` | `true` | Nomarchy's Waybar |
|
| `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.swaync.enable` | `true` | swaync notifications, themed |
|
||||||
| `nomarchy.idle.enable` | `true` | hyprlock + hypridle (idle lock 5 min, display off 10, suspend 30) |
|
| `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 |
|
| `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) |
|
| `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.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) |
|
| `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,
|
Six ported themes ship a `waybar.css` identity (catppuccin, lumon, nord,
|
||||||
retro-82, summer-day, summer-night). Custom user themes can live in
|
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
|
## Roadmap
|
||||||
- **Menu system** (apps launcher + theme switching + system actions), built
|
- **Menu system** (apps launcher + theme switching + system actions), built
|
||||||
on fuzzel — already shipped for SUPER+D/SUPER+T, dmenu mode does nested
|
on rofi 2.0 (native Wayland on 26.05) — its `.rasi` theme is baked from
|
||||||
menus and per-entry icons, and its INI theme can be baked from
|
theme-state.json like every other app, with rich per-element styling:
|
||||||
theme-state.json like every other app:
|
- ✓ shipped: `modules/home/rofi.nix` (per-element theme generated from
|
||||||
- ✓ shipped: `modules/home/fuzzel.nix` (palette/fonts/border from the
|
the palette, `themes/<slug>/rofi.rasi` whole-swap) and the
|
||||||
theme JSON, `themes/<slug>/fuzzel.ini` whole-swap) and the
|
|
||||||
`nomarchy-menu` dispatcher: root picker (no args) · `power`
|
`nomarchy-menu` dispatcher: root picker (no args) · `power`
|
||||||
(lock/logout/suspend/hibernate/reboot/shutdown, SUPER+X) ·
|
(lock/logout/suspend/hibernate/reboot/shutdown, SUPER+X) ·
|
||||||
`theme` (SUPER+T) · `clipboard` (cliphist, SUPER+CTRL+V) · `calc`
|
`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 ▸
|
- next modules: Network ▸ nmtui · Bluetooth ▸ blueman · Capture ▸
|
||||||
screenshot · **ask Claude**: `--prompt-only` →
|
screenshot · **ask Claude**: free-text → `$TERMINAL -e claude
|
||||||
`$TERMINAL -e claude "<question>"` — the claude CLI auths via OAuth
|
"<question>"` — the claude CLI auths via OAuth against a Pro/Max
|
||||||
against a Pro/Max subscription (no API key); REPL stays open for
|
subscription (no API key); REPL stays open for follow-ups (claude-code
|
||||||
follow-ups (claude-code in nixpkgs is unfree — allowUnfree is on)
|
in nixpkgs is unfree — allowUnfree is on)
|
||||||
- known limits accepted for now: no live-as-you-type results (dmenu
|
- launcher icons: `show-icons` is off (no icon theme shipped yet);
|
||||||
input is static per invocation) and no image previews
|
enabling it well means shipping an icon theme (Papirus/Adwaita)
|
||||||
- decision record: this resolves the old Walker/Lua question in favor of
|
- decision record: resolves the old Walker/Lua question — no GTK4
|
||||||
simplicity — no GTK4 launcher, no second theming pipeline, no image
|
launcher, no second theming pipeline; the dispatcher owns the menu
|
||||||
previews (instant `bg next` covers wallpaper browsing); the dispatcher
|
structure, so the renderer stays swappable (we moved fuzzel → rofi 2.0
|
||||||
owns the menu structure, so the renderer stays swappable
|
once mainline gained native Wayland, for its richer theming)
|
||||||
- **Theme parity with legacy:** summer-day/night now carry their legacy
|
- **Theme parity with legacy:** summer-day/night now carry their legacy
|
||||||
bar layouts as `waybar.jsonc` whole-swaps (adapted: dead legacy script
|
bar layouts as `waybar.jsonc` whole-swaps (adapted: dead legacy script
|
||||||
modules dropped, Nerd-Fonts-v2 codepoints remapped to FontAwesome/v3,
|
modules dropped, Nerd-Fonts-v2 codepoints remapped to FontAwesome/v3,
|
||||||
logo button opens nomarchy-menu); the other four identity themes are
|
logo button opens nomarchy-menu); the other four identity themes are
|
||||||
palette recolors and already match. Remaining: a visual pass over all
|
palette recolors and already match. Remaining: a visual pass over all
|
||||||
six on the live ISO
|
six on the live ISO
|
||||||
- **Per-theme fuzzel identity:** the `themes/<slug>/fuzzel.ini` whole-swap
|
- **Per-theme rofi identity:** the `themes/<slug>/rofi.rasi` whole-swap
|
||||||
mechanism ships; what remains is authoring the inis for the six identity
|
mechanism ships; what remains is porting the legacy `rofi.rasi` designs
|
||||||
themes from their legacy rofi.rasi files (per-element colors like
|
(summer-day/night already have them in the legacy branch) for the
|
||||||
summer-night's green inputbar aren't expressible in fuzzel's flat
|
identity themes — rofi's `.rasi` expresses their per-element looks
|
||||||
scheme — approximate, note the rest as a renderer limitation)
|
(green inputbar, inverted window) directly, unlike the old flat scheme
|
||||||
- **Faster switches:** move `backgrounds/` out of the flake source (the 86 MB
|
- **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
|
re-copy on every state write is the main eval tax), then pre-built theme
|
||||||
variants if still needed
|
variants if still needed
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
./waybar.nix
|
./waybar.nix
|
||||||
./ghostty.nix
|
./ghostty.nix
|
||||||
./btop.nix
|
./btop.nix
|
||||||
./fuzzel.nix # launcher theming + the nomarchy-menu dispatcher
|
./rofi.nix # launcher theming + the nomarchy-menu dispatcher
|
||||||
./swaync.nix # notification daemon, themed from the same JSON
|
./swaync.nix # notification daemon, themed from the same JSON
|
||||||
./idle.nix # hyprlock + hypridle, themed from the same JSON
|
./idle.nix # hyprlock + hypridle, themed from the same JSON
|
||||||
./yazi.nix # flagship TUI file manager, themed + plugins
|
./yazi.nix # flagship TUI file manager, themed + plugins
|
||||||
@@ -31,7 +31,6 @@
|
|||||||
|
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
awww # wallpaper daemon with animated transitions (the swww fork)
|
awww # wallpaper daemon with animated transitions (the swww fork)
|
||||||
fuzzel # launcher / dmenu (used by the theme picker bind)
|
|
||||||
libnotify
|
libnotify
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -1,171 +0,0 @@
|
|||||||
# Fuzzel — launcher, dmenu renderer for the menu system, themed from
|
|
||||||
# theme-state.json like every other surface. Also home of nomarchy-menu,
|
|
||||||
# the dispatcher script all menu modules grow out of.
|
|
||||||
#
|
|
||||||
# Per-theme identity: themes/<slug>/fuzzel.ini is a whole-swap (like
|
|
||||||
# waybar.css) — it replaces the generated config entirely, probed at
|
|
||||||
# eval time.
|
|
||||||
{ config, lib, pkgs, ... }:
|
|
||||||
|
|
||||||
let
|
|
||||||
cfg = config.nomarchy;
|
|
||||||
t = cfg.theme;
|
|
||||||
c = t.colors;
|
|
||||||
|
|
||||||
# Per-theme override probe (same convention as waybar.nix).
|
|
||||||
iniOverride = cfg.themesDir + "/${t.slug}/fuzzel.ini";
|
|
||||||
hasIniOverride = builtins.pathExists iniOverride;
|
|
||||||
|
|
||||||
# fuzzel.ini colors are rrggbbaa, no leading #.
|
|
||||||
hexa = color: alpha: "${lib.removePrefix "#" color}${alpha}";
|
|
||||||
|
|
||||||
nomarchy-menu = pkgs.writeShellScriptBin "nomarchy-menu" ''
|
|
||||||
# Nomarchy menu dispatcher — thin presentation layer over
|
|
||||||
# `fuzzel --dmenu`; actions delegate to nomarchy-theme-sync,
|
|
||||||
# systemctl, hyprctl and friends. Icons are nf-md glyphs (any
|
|
||||||
# shipped Nerd Font carries them). `nomarchy-menu` with no
|
|
||||||
# argument shows the module picker.
|
|
||||||
|
|
||||||
urlencode() {
|
|
||||||
local s="$1" out="" ch
|
|
||||||
for ((i = 0; i < ''${#s}; i++)); do
|
|
||||||
ch=''${s:i:1}
|
|
||||||
case "$ch" in
|
|
||||||
[a-zA-Z0-9.~_-]) out+="$ch" ;;
|
|
||||||
' ') out+="+" ;;
|
|
||||||
*) printf -v ch '%%%02X' "'$ch"; out+="$ch" ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
printf '%s' "$out"
|
|
||||||
}
|
|
||||||
|
|
||||||
case "''${1:-}" in
|
|
||||||
power)
|
|
||||||
choice=$(printf '%s\n' \
|
|
||||||
" Lock" \
|
|
||||||
" Logout" \
|
|
||||||
" Suspend" \
|
|
||||||
" Hibernate" \
|
|
||||||
" Reboot" \
|
|
||||||
" Shutdown" \
|
|
||||||
| fuzzel --dmenu --prompt "power " --lines 6 --width 24) || exit 0
|
|
||||||
case "$choice" in
|
|
||||||
*Lock) loginctl lock-session ;;
|
|
||||||
*Logout) hyprctl dispatch exit ;;
|
|
||||||
*Suspend) systemctl suspend ;;
|
|
||||||
*Hibernate) systemctl hibernate ;;
|
|
||||||
*Reboot) systemctl reboot ;;
|
|
||||||
*Shutdown) systemctl poweroff ;;
|
|
||||||
esac ;;
|
|
||||||
|
|
||||||
theme)
|
|
||||||
choice=$(nomarchy-theme-sync list \
|
|
||||||
| fuzzel --dmenu --prompt "theme ") || exit 0
|
|
||||||
[ -n "$choice" ] && exec nomarchy-theme-sync apply "$choice" ;;
|
|
||||||
|
|
||||||
clipboard)
|
|
||||||
sel=$(cliphist list | fuzzel --dmenu --prompt "clip " --width 60) || exit 0
|
|
||||||
printf '%s' "$sel" | cliphist decode | wl-copy ;;
|
|
||||||
|
|
||||||
calc)
|
|
||||||
expr=$(fuzzel --prompt-only "= ") || exit 0
|
|
||||||
[ -n "$expr" ] || exit 0
|
|
||||||
result=$(qalc -t -- "$expr" 2>&1 | tail -n 1)
|
|
||||||
choice=$(printf '%s\n' " Copy result" " New calculation" \
|
|
||||||
| fuzzel --dmenu --lines 2 --width 40 \
|
|
||||||
--prompt "= " --mesg "$expr = $result") || exit 0
|
|
||||||
case "$choice" in
|
|
||||||
*Copy*) printf '%s' "$result" | wl-copy ;;
|
|
||||||
*New*) exec "$0" calc ;;
|
|
||||||
esac ;;
|
|
||||||
|
|
||||||
files)
|
|
||||||
sel=$(fd . "$HOME" --type f --hidden --exclude .git --exclude .cache 2>/dev/null \
|
|
||||||
| head -n 50000 \
|
|
||||||
| sed "s|^$HOME/||" \
|
|
||||||
| fuzzel --dmenu --prompt "file " --width 60) || exit 0
|
|
||||||
[ -n "$sel" ] && exec xdg-open "$HOME/$sel" ;;
|
|
||||||
|
|
||||||
web)
|
|
||||||
q=$(fuzzel --prompt-only "search ") || exit 0
|
|
||||||
[ -n "$q" ] || exit 0
|
|
||||||
exec xdg-open "https://duckduckgo.com/?q=$(urlencode "$q")" ;;
|
|
||||||
|
|
||||||
"")
|
|
||||||
choice=$(printf '%s\n' \
|
|
||||||
" Apps" \
|
|
||||||
" Theme" \
|
|
||||||
" Clipboard" \
|
|
||||||
" Calculator" \
|
|
||||||
" Files" \
|
|
||||||
" Web search" \
|
|
||||||
" Power" \
|
|
||||||
| fuzzel --dmenu --prompt "menu " --lines 7 --width 24) || exit 0
|
|
||||||
case "$choice" in
|
|
||||||
*Apps*) exec fuzzel ;;
|
|
||||||
*Theme*) exec "$0" theme ;;
|
|
||||||
*Clipboard*) exec "$0" clipboard ;;
|
|
||||||
*Calc*) exec "$0" calc ;;
|
|
||||||
*Files*) exec "$0" files ;;
|
|
||||||
*Web*) exec "$0" web ;;
|
|
||||||
*Power*) exec "$0" power ;;
|
|
||||||
esac ;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "usage: nomarchy-menu [power|theme|clipboard|calc|files|web]" >&2
|
|
||||||
exit 64 ;;
|
|
||||||
esac
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
{
|
|
||||||
config = lib.mkIf cfg.fuzzel.enable {
|
|
||||||
home.packages = [
|
|
||||||
nomarchy-menu
|
|
||||||
pkgs.libqalculate # qalc, the calc module's engine
|
|
||||||
pkgs.fd # files module
|
|
||||||
pkgs.xdg-utils # xdg-open for files/web
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.fuzzel = {
|
|
||||||
enable = true;
|
|
||||||
# Whole-swap themes bring their own fuzzel.ini; otherwise the
|
|
||||||
# config is generated from the palette.
|
|
||||||
settings = lib.mkIf (!hasIniOverride) {
|
|
||||||
main = {
|
|
||||||
# UI font first; the mono Nerd Font follows so menu icons
|
|
||||||
# (nf-md glyphs) resolve — fcft falls back per glyph.
|
|
||||||
font = "${t.fonts.ui}:size=${toString (t.fonts.size + 1)}, ${t.fonts.mono}:size=${toString (t.fonts.size + 1)}";
|
|
||||||
terminal = cfg.terminal;
|
|
||||||
layer = "overlay";
|
|
||||||
lines = 12;
|
|
||||||
width = 40;
|
|
||||||
horizontal-pad = 24;
|
|
||||||
vertical-pad = 16;
|
|
||||||
inner-pad = 8;
|
|
||||||
};
|
|
||||||
|
|
||||||
colors = {
|
|
||||||
background = hexa c.base "f2";
|
|
||||||
text = hexa c.text "ff";
|
|
||||||
prompt = hexa c.subtext "ff";
|
|
||||||
placeholder = hexa c.muted "ff";
|
|
||||||
input = hexa c.text "ff";
|
|
||||||
match = hexa c.accent "ff";
|
|
||||||
selection = hexa c.surface "ff";
|
|
||||||
selection-text = hexa c.text "ff";
|
|
||||||
selection-match = hexa c.accent "ff";
|
|
||||||
border = hexa c.accent "ee";
|
|
||||||
};
|
|
||||||
|
|
||||||
border = {
|
|
||||||
width = t.ui.borderSize;
|
|
||||||
radius = t.ui.rounding;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
xdg.configFile."fuzzel/fuzzel.ini" = lib.mkIf hasIniOverride {
|
|
||||||
source = iniOverride;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -127,7 +127,7 @@ in
|
|||||||
|
|
||||||
bind = [
|
bind = [
|
||||||
"$mod, Return, exec, $terminal"
|
"$mod, Return, exec, $terminal"
|
||||||
"$mod, D, exec, fuzzel"
|
"$mod, D, exec, rofi -show drun"
|
||||||
"$mod, E, exec, $terminal -e yazi"
|
"$mod, E, exec, $terminal -e yazi"
|
||||||
"$mod, Q, killactive"
|
"$mod, Q, killactive"
|
||||||
"$mod, F, fullscreen"
|
"$mod, F, fullscreen"
|
||||||
@@ -140,7 +140,7 @@ in
|
|||||||
# Cycle the current theme's wallpapers (instant, no rebuild).
|
# Cycle the current theme's wallpapers (instant, no rebuild).
|
||||||
"$mod SHIFT, T, exec, nomarchy-theme-sync bg next"
|
"$mod SHIFT, T, exec, nomarchy-theme-sync bg next"
|
||||||
|
|
||||||
# Power menu (fuzzel dmenu via the nomarchy-menu dispatcher).
|
# Power menu (rofi dmenu via the nomarchy-menu dispatcher).
|
||||||
# Not Escape: Super+Escape gets swallowed before reaching the
|
# Not Escape: Super+Escape gets swallowed before reaching the
|
||||||
# dispatcher on some setups (input methods / modal handling).
|
# dispatcher on some setups (input methods / modal handling).
|
||||||
"$mod, X, exec, nomarchy-menu power"
|
"$mod, X, exec, nomarchy-menu power"
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
# ── Component toggles ──────────────────────────────────────────
|
# ── Component toggles ──────────────────────────────────────────
|
||||||
hyprland.enable = lib.mkEnableOption "Nomarchy's Hyprland configuration" // { default = true; };
|
hyprland.enable = lib.mkEnableOption "Nomarchy's Hyprland configuration" // { default = true; };
|
||||||
waybar.enable = lib.mkEnableOption "Nomarchy's Waybar configuration" // { default = true; };
|
waybar.enable = lib.mkEnableOption "Nomarchy's Waybar configuration" // { default = true; };
|
||||||
fuzzel.enable = lib.mkEnableOption "Nomarchy's themed fuzzel + the nomarchy-menu dispatcher (power menu)" // { default = true; };
|
rofi.enable = lib.mkEnableOption "Nomarchy's themed rofi launcher + the nomarchy-menu dispatcher" // { default = true; };
|
||||||
swaync.enable = lib.mkEnableOption "swaync notifications, themed from the state file" // { default = true; };
|
swaync.enable = lib.mkEnableOption "swaync notifications, themed from the state file" // { default = true; };
|
||||||
idle.enable = lib.mkEnableOption "hyprlock + hypridle (idle lock, display off, suspend)" // { default = true; };
|
idle.enable = lib.mkEnableOption "hyprlock + hypridle (idle lock, display off, suspend)" // { default = true; };
|
||||||
yazi.enable = lib.mkEnableOption "the yazi TUI file manager, themed with a curated plugin set" // { default = true; };
|
yazi.enable = lib.mkEnableOption "the yazi TUI file manager, themed with a curated plugin set" // { default = true; };
|
||||||
|
|||||||
222
modules/home/rofi.nix
Normal file
222
modules/home/rofi.nix
Normal file
@@ -0,0 +1,222 @@
|
|||||||
|
# rofi (2.0, native Wayland on 26.05) — launcher + dmenu renderer for
|
||||||
|
# the menu system, themed from theme-state.json. rofi's .rasi is far more
|
||||||
|
# expressive than a flat scheme, so the generated theme styles each
|
||||||
|
# element (accent border, highlighted selection, rounded inputbar); a
|
||||||
|
# themes/<slug>/rofi.rasi whole-swap replaces it entirely.
|
||||||
|
#
|
||||||
|
# Home of nomarchy-menu, the dispatcher all menu modules hang off.
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nomarchy;
|
||||||
|
t = cfg.theme;
|
||||||
|
c = t.colors;
|
||||||
|
inherit (config.lib.formats.rasi) mkLiteral;
|
||||||
|
|
||||||
|
px = n: mkLiteral "${toString n}px";
|
||||||
|
|
||||||
|
# Per-theme override probe (same convention as waybar.css).
|
||||||
|
rasiOverride = cfg.themesDir + "/${t.slug}/rofi.rasi";
|
||||||
|
hasRasiOverride = builtins.pathExists rasiOverride;
|
||||||
|
|
||||||
|
nomarchy-menu = pkgs.writeShellScriptBin "nomarchy-menu" ''
|
||||||
|
# Nomarchy menu dispatcher — thin presentation layer over
|
||||||
|
# `rofi -dmenu`; actions delegate to nomarchy-theme-sync, systemctl,
|
||||||
|
# hyprctl and friends. Icons are nf-md glyphs (Pango falls back to a
|
||||||
|
# Nerd Font for them). `nomarchy-menu` with no argument shows the
|
||||||
|
# module picker.
|
||||||
|
|
||||||
|
urlencode() {
|
||||||
|
local s="$1" out="" ch i
|
||||||
|
for ((i = 0; i < ''${#s}; i++)); do
|
||||||
|
ch=''${s:i:1}
|
||||||
|
case "$ch" in
|
||||||
|
[a-zA-Z0-9.~_-]) out+="$ch" ;;
|
||||||
|
' ') out+="+" ;;
|
||||||
|
*) printf -v ch '%%%02X' "'$ch"; out+="$ch" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
printf '%s' "$out"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "''${1:-}" in
|
||||||
|
power)
|
||||||
|
choice=$(printf '%s\n' \
|
||||||
|
" Lock" \
|
||||||
|
" Logout" \
|
||||||
|
" Suspend" \
|
||||||
|
" Hibernate" \
|
||||||
|
" Reboot" \
|
||||||
|
" Shutdown" \
|
||||||
|
| rofi -dmenu -p power) || exit 0
|
||||||
|
case "$choice" in
|
||||||
|
*Lock) loginctl lock-session ;;
|
||||||
|
*Logout) hyprctl dispatch exit ;;
|
||||||
|
*Suspend) systemctl suspend ;;
|
||||||
|
*Hibernate) systemctl hibernate ;;
|
||||||
|
*Reboot) systemctl reboot ;;
|
||||||
|
*Shutdown) systemctl poweroff ;;
|
||||||
|
esac ;;
|
||||||
|
|
||||||
|
theme)
|
||||||
|
choice=$(nomarchy-theme-sync list | rofi -dmenu -p theme) || exit 0
|
||||||
|
[ -n "$choice" ] && exec nomarchy-theme-sync apply "$choice" ;;
|
||||||
|
|
||||||
|
clipboard)
|
||||||
|
sel=$(cliphist list | rofi -dmenu -p clip) || exit 0
|
||||||
|
printf '%s' "$sel" | cliphist decode | wl-copy ;;
|
||||||
|
|
||||||
|
calc)
|
||||||
|
expr=$(rofi -dmenu -p "= " < /dev/null) || exit 0
|
||||||
|
[ -n "$expr" ] || exit 0
|
||||||
|
result=$(qalc -t -- "$expr" 2>&1 | tail -n 1)
|
||||||
|
choice=$(printf '%s\n' " Copy result" " New calculation" \
|
||||||
|
| rofi -dmenu -p "= " -mesg "$expr = $result") || exit 0
|
||||||
|
case "$choice" in
|
||||||
|
*Copy*) printf '%s' "$result" | wl-copy ;;
|
||||||
|
*New*) exec "$0" calc ;;
|
||||||
|
esac ;;
|
||||||
|
|
||||||
|
files)
|
||||||
|
sel=$(fd . "$HOME" --type f --hidden --exclude .git --exclude .cache 2>/dev/null \
|
||||||
|
| head -n 50000 \
|
||||||
|
| sed "s|^$HOME/||" \
|
||||||
|
| rofi -dmenu -p file) || exit 0
|
||||||
|
[ -n "$sel" ] && exec xdg-open "$HOME/$sel" ;;
|
||||||
|
|
||||||
|
web)
|
||||||
|
q=$(rofi -dmenu -p search < /dev/null) || exit 0
|
||||||
|
[ -n "$q" ] || exit 0
|
||||||
|
exec xdg-open "https://duckduckgo.com/?q=$(urlencode "$q")" ;;
|
||||||
|
|
||||||
|
"")
|
||||||
|
choice=$(printf '%s\n' \
|
||||||
|
" Apps" \
|
||||||
|
" Theme" \
|
||||||
|
" Clipboard" \
|
||||||
|
" Calculator" \
|
||||||
|
" Files" \
|
||||||
|
" Web search" \
|
||||||
|
" Power" \
|
||||||
|
| rofi -dmenu -p menu) || exit 0
|
||||||
|
case "$choice" in
|
||||||
|
*Apps*) exec rofi -show drun ;;
|
||||||
|
*Theme*) exec "$0" theme ;;
|
||||||
|
*Clipboard*) exec "$0" clipboard ;;
|
||||||
|
*Calc*) exec "$0" calc ;;
|
||||||
|
*Files*) exec "$0" files ;;
|
||||||
|
*Web*) exec "$0" web ;;
|
||||||
|
*Power*) exec "$0" power ;;
|
||||||
|
esac ;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "usage: nomarchy-menu [power|theme|clipboard|calc|files|web]" >&2
|
||||||
|
exit 64 ;;
|
||||||
|
esac
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.rofi.enable {
|
||||||
|
home.packages = [
|
||||||
|
nomarchy-menu
|
||||||
|
pkgs.libqalculate # qalc, the calc module's engine
|
||||||
|
pkgs.fd # files module
|
||||||
|
pkgs.xdg-utils # xdg-open for files/web
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.rofi = {
|
||||||
|
enable = true;
|
||||||
|
terminal = cfg.terminal;
|
||||||
|
font = "${t.fonts.ui} 12";
|
||||||
|
|
||||||
|
extraConfig = {
|
||||||
|
modi = "drun,run";
|
||||||
|
show-icons = false; # no icon theme shipped yet — clean text list
|
||||||
|
drun-display-format = "{name}";
|
||||||
|
display-drun = "apps";
|
||||||
|
display-run = "run";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Whole-swap themes bring their own rofi.rasi; otherwise the theme
|
||||||
|
# is generated from the palette.
|
||||||
|
theme =
|
||||||
|
if hasRasiOverride then rasiOverride
|
||||||
|
else {
|
||||||
|
"*" = {
|
||||||
|
bg = mkLiteral c.base;
|
||||||
|
fg = mkLiteral c.text;
|
||||||
|
dim = mkLiteral c.subtext;
|
||||||
|
surface = mkLiteral c.surface;
|
||||||
|
accent = mkLiteral c.accent;
|
||||||
|
|
||||||
|
background-color = mkLiteral "transparent";
|
||||||
|
text-color = mkLiteral "@fg";
|
||||||
|
margin = 0;
|
||||||
|
padding = 0;
|
||||||
|
spacing = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
"window" = {
|
||||||
|
background-color = mkLiteral "@bg";
|
||||||
|
border = px t.ui.borderSize;
|
||||||
|
border-color = mkLiteral "@accent";
|
||||||
|
border-radius = px t.ui.rounding;
|
||||||
|
width = mkLiteral "40%";
|
||||||
|
padding = px 8;
|
||||||
|
};
|
||||||
|
|
||||||
|
"mainbox" = {
|
||||||
|
children = map mkLiteral [ "inputbar" "message" "listview" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"inputbar" = {
|
||||||
|
background-color = mkLiteral "@surface";
|
||||||
|
border-radius = px t.ui.rounding;
|
||||||
|
padding = mkLiteral "8px 12px";
|
||||||
|
spacing = px 8;
|
||||||
|
children = map mkLiteral [ "prompt" "entry" ];
|
||||||
|
};
|
||||||
|
"prompt" = { text-color = mkLiteral "@accent"; };
|
||||||
|
"entry" = {
|
||||||
|
placeholder = "Search…";
|
||||||
|
placeholder-color = mkLiteral "@dim";
|
||||||
|
};
|
||||||
|
|
||||||
|
"listview" = {
|
||||||
|
lines = 8;
|
||||||
|
columns = 1;
|
||||||
|
dynamic = true;
|
||||||
|
scrollbar = false;
|
||||||
|
spacing = px 2;
|
||||||
|
padding = mkLiteral "8px 0px 0px 0px";
|
||||||
|
};
|
||||||
|
|
||||||
|
"element" = {
|
||||||
|
padding = mkLiteral "8px 12px";
|
||||||
|
border-radius = px t.ui.rounding;
|
||||||
|
spacing = px 8;
|
||||||
|
};
|
||||||
|
"element selected" = {
|
||||||
|
background-color = mkLiteral "@accent";
|
||||||
|
text-color = mkLiteral "@bg";
|
||||||
|
};
|
||||||
|
"element-icon" = {
|
||||||
|
background-color = mkLiteral "transparent";
|
||||||
|
size = mkLiteral "1em";
|
||||||
|
};
|
||||||
|
"element-text" = {
|
||||||
|
background-color = mkLiteral "transparent";
|
||||||
|
text-color = mkLiteral "inherit";
|
||||||
|
};
|
||||||
|
|
||||||
|
"message" = { padding = mkLiteral "8px 0px 0px 0px"; };
|
||||||
|
"textbox" = {
|
||||||
|
background-color = mkLiteral "@surface";
|
||||||
|
text-color = mkLiteral "@fg";
|
||||||
|
border-radius = px t.ui.rounding;
|
||||||
|
padding = mkLiteral "8px 12px";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# yazi — the flagship file manager: a fast, keyboard-driven TUI that
|
# yazi — the flagship file manager: a fast, keyboard-driven TUI that
|
||||||
# fits the distro's identity (Ghostty's Kitty-graphics previews, fuzzel
|
# fits the distro's identity (Ghostty's Kitty-graphics previews, rofi
|
||||||
# menus, everything from one JSON). Themed from theme-state.json and
|
# menus, everything from one JSON). Themed from theme-state.json and
|
||||||
# shipped with a curated plugin set. The GUI half (Thunar, "open folder"
|
# shipped with a curated plugin set. The GUI half (Thunar, "open folder"
|
||||||
# handler) is nomarchy.system.fileManager on the system side.
|
# handler) is nomarchy.system.fileManager on the system side.
|
||||||
|
|||||||
14
todo.md
Normal file
14
todo.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Items to do
|
||||||
|
|
||||||
|
## one item per commit in the repo
|
||||||
|
|
||||||
|
- Let's add some type of progress bar for when the user switch themes? That way we can have a visual feedback instead of the user thinking the selection failed
|
||||||
|
- Let's add icon themes and make sure each theme selects an icon theme to use (and that the icon theme is pulled for installation)
|
||||||
|
- Let's install starship or some other tool to make the terminal look nice. We can configure it nicely by default
|
||||||
|
- We can also add tools and set aliases, for example change cat for bat, grep for ripgrep, etc...
|
||||||
|
- We can install by default for the user applications to make it a complete desktop workstation, such as vscode, libreoffice, gimp, inkscape, texlivefull. Maybe we should also add a way for the user to "turn off" any of those apps if the user does not want them installed
|
||||||
|
- Let's tweak the Nomarchy plymouth theme. The logo is too dark and the constrast does not look good with the dark background
|
||||||
|
- When the machine hibernates the user already needs to type the luks password to resume it. However, the screen gets locked by hyprlock anyway and the user needs to enter the password twice
|
||||||
|
- Let's have a rofi menu item that shows all the current assigned keybindings
|
||||||
|
- We can assign SUPER+Space for rofi dmenu and SUPER+m for the main menu.
|
||||||
|
|
||||||
Reference in New Issue
Block a user