From b5263bcef899db442cab7ab37ef75bae71e49d6e Mon Sep 17 00:00:00 2001 From: Bernardo Magri Date: Fri, 10 Jul 2026 13:06:47 +0100 Subject: [PATCH] fix(desktop): tighter bar icon pad + case-insensitive rofi match - Double-space pad on volume (esp. high), battery, keyboard layout glyphs - rofi: matching=normal,fuzzy; case-smart off (ste finds Steam) - Queue: unfree+calendar PASS; retest spacing + rofi search V0: nix flake check --no-build green. V3: bar/rofi on session. --- agent/HARDWARE-QUEUE.md | 22 +++---- modules/home/rofi.nix | 21 ++++--- modules/home/waybar.nix | 21 +++---- themes/boreal/waybar.jsonc | 38 ++++++------ themes/executive-slate/waybar.jsonc | 38 ++++++------ themes/summer-day/waybar.jsonc | 89 +++++++++++++++++------------ themes/summer-night/waybar.jsonc | 89 +++++++++++++++++------------ 7 files changed, 177 insertions(+), 141 deletions(-) diff --git a/agent/HARDWARE-QUEUE.md b/agent/HARDWARE-QUEUE.md index 61da91b..56fd3ad 100644 --- a/agent/HARDWARE-QUEUE.md +++ b/agent/HARDWARE-QUEUE.md @@ -8,16 +8,18 @@ the failure as a NOW bug in BACKLOG.md. Machines: the **AMD dev box** QA machine), the **T14s** (webcam case). ## Any machine (dev box is fine) -- [ ] **Unfree CLI default (2026-07-10)** — after `sys-rebuild` + new - shell/login: `echo $NIXPKGS_ALLOW_UNFREE` → `1`; `nix-shell -p - vscode --run 'code --version'` (or another unfree pkg) succeeds - without a manual export; `cat ~/.config/nixpkgs/config.nix` has - `allowUnfree = true`. (Flake-pure `nix shell nixpkgs#…` still may - need `--impure` — that is expected.) -- [ ] **Waybar icon+percentage spacing (2026-07-10)** — switch to - executive-slate (and spot-check boreal/summer): battery glyph and - capacity% do not collide; volume glyph and volume% do not collide. - Unified clock reads as one module (`HH:MM · Day DD Mon`). +- [x] **Unfree CLI default (2026-07-10)** — PASS (Bernardo, Latitude). +- [ ] **Waybar icon+percentage spacing (2026-07-10, retest)** — after + `home-update`: executive-slate (and boreal/summer) — high-volume + glyph + `%`, keyboard layout glyph + code, battery glyph + `%` + each have a clear gap (double-pad + mono face). Unified clock is + one module (`HH:MM · Day DD Mon`). First pass: volume-high and + keyboard still tight → pad doubled. +- [x] **Calendar on unified clock (2026-07-10)** — PASS (Bernardo). +- [ ] **Rofi case-insensitive search (2026-07-10)** — SUPER+Space: type + `ste` → Steam listed (not only `Ste`/`STE`); type `sys` → System + menu row if testing nomarchy-menu. Config: matching normal,fuzzy + + case-sensitive false + case-smart false. - [ ] **Charge-limit live apply (2026-07-10)** — on a laptop with `charge_control_end_threshold`: System › Battery limit → 80%; confirm `cat …/charge_control_end_threshold` is 80 without rebuild; diff --git a/modules/home/rofi.nix b/modules/home/rofi.nix index 67078e3..5edd1c1 100644 --- a/modules/home/rofi.nix +++ b/modules/home/rofi.nix @@ -1159,19 +1159,18 @@ in # reserving `lines` (8) — so a 6-entry menu doesn't leave empty space, # while the app launcher still fills + scrolls past `lines`. fixed-num-lines = false; - # Search: case-insensitive fuzzy across every menu + the launcher, so - # "system" finds "System" and "fzr" finds "Firefox". `normal` sorting - # ranks by match distance so the closest match lands on top (the - # per-keystroke modules — calc/emoji — opt out per-invocation with - # -no-sort). + # Search: case-insensitive, substring first + fuzzy forgiveness. + # "ste" must find "Steam", "system" finds "System", "fzr" still + # reaches "Firefox". Comma list = match if ANY method hits (rofi 1.7+). # - # NOT `fzf`: rofi 2.0.0's fzf sorter mis-ranks with fuzzy matching — - # typing "steam" left ghostty selected on top instead of Steam - # (confirmed on hardware: `-sorting-method normal` and `-matching - # normal` both fixed it, `-no-sort` did not). Keep fuzzy matching for - # forgiveness; use the normal sorter to rank it (item 31). - matching = "fuzzy"; + # History: fuzzy-only + fzf sorter mis-ranked (ghostty over Steam); + # fuzzy-only still failed short lowercase queries on hardware + # 2026-07-10 despite case-sensitive=false. normal covers the + # prefix/substring case; fuzzy stays for typo-tolerant hits. + # case-smart off so all-lowercase never flips to case-sensitive. + matching = "normal,fuzzy"; case-sensitive = false; + case-smart = false; sort = true; sorting-method = "normal"; }; diff --git a/modules/home/waybar.nix b/modules/home/waybar.nix index de2d27f..b8b1f4d 100644 --- a/modules/home/waybar.nix +++ b/modules/home/waybar.nix @@ -215,17 +215,18 @@ let # Active keyboard layout (per focused device) — only placed in # modules-right when showLanguage (see above). "hyprland/language" = { - format = "󰌌 {short}"; + # Two spaces after the glyph: the keyboard icon's right bearing + # otherwise kisses the layout code (esp. mono Nerd faces). + format = "󰌌 {short}"; tooltip = false; }; pulseaudio = { - # Trailing spaces on icons (not only between span and text): Nerd Font - # glyphs often have tight right bearings and otherwise collide with - # the percentage digits. - format = "{icon} {volume}%"; + # Two trailing spaces on every icon level: high-volume glyphs are the + # widest and still kissed the % with a single pad (hardware report). + format = "{icon}{volume}%"; format-muted = "󰝟"; - format-icons.default = [ "󰕿 " "󰖀 " "󰕾 " ]; + format-icons.default = [ "󰕿 " "󰖀 " "󰕾 " ]; on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; # Right-click → the full mixer (per-app volumes) in a floating window # (item 35). pwvucontrol ships in the template suite; the Hyprland @@ -251,10 +252,10 @@ let battery = { states = { warning = 25; critical = 10; }; - # Same icon-bearing fix as pulseaudio (see format-icons note there). - format = "{icon} {capacity}%"; - format-charging = "󰂄 {capacity}%"; - format-icons = [ "󰁺 " "󰁼 " "󰁾 " "󰂀 " "󰁹 " ]; + # Same double-pad as pulseaudio (single space still tight on some glyphs). + format = "{icon}{capacity}%"; + format-charging = "󰂄 {capacity}%"; + format-icons = [ "󰁺 " "󰁼 " "󰁾 " "󰂀 " "󰁹 " ]; # Click either the battery or the power-profile icon → the combined # power menu (profile + charge cap). The granular System rows stay. on-click = "nomarchy-menu powermgmt"; diff --git a/themes/boreal/waybar.jsonc b/themes/boreal/waybar.jsonc index 937f621..638362e 100644 --- a/themes/boreal/waybar.jsonc +++ b/themes/boreal/waybar.jsonc @@ -85,7 +85,7 @@ "on-click": "nomarchy-nightlight toggle" }, "hyprland/language": { - "format": "󰌌 {short}", + "format": "󰌌 {short}", "tooltip": false }, "custom/vpn": { @@ -97,20 +97,20 @@ "pulseaudio": { "scroll-step": 5, "format": "{icon}{volume}%", - "format-bluetooth": "{icon} {volume}%", + "format-bluetooth": "{icon} {volume}%", "format-bluetooth-muted": " {icon}", - "format-muted": "muted", + "format-muted": "muted", "format-icons": { - "headphone": " ", - "hands-free": " ", - "headset": " ", - "phone": " ", - "portable": " ", - "car": " ", + "headphone": " ", + "hands-free": " ", + "headset": " ", + "phone": " ", + "portable": " ", + "car": " ", "default": [ - " ", - " ", - " " + " ", + " ", + " " ] }, "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", @@ -124,14 +124,14 @@ "critical": 10 }, "format": "{icon}{capacity}%", - "format-charging": "{capacity}%", - "format-plugged": "{capacity}%", + "format-charging": "{capacity}%", + "format-plugged": "{capacity}%", "format-icons": [ - " ", - " ", - " ", - " ", - " " + " ", + " ", + " ", + " ", + " " ], "on-click": "nomarchy-menu powermgmt", "tooltip-format": "Battery status" diff --git a/themes/executive-slate/waybar.jsonc b/themes/executive-slate/waybar.jsonc index 5a29998..602b672 100644 --- a/themes/executive-slate/waybar.jsonc +++ b/themes/executive-slate/waybar.jsonc @@ -70,7 +70,7 @@ "on-click": "nomarchy-nightlight toggle" }, "hyprland/language": { - "format": "󰌌 {short}", + "format": "󰌌 {short}", "tooltip": false }, "custom/updates": { @@ -83,20 +83,20 @@ "pulseaudio": { "scroll-step": 5, "format": "{icon}{volume}%", - "format-bluetooth": "{icon} {volume}%", + "format-bluetooth": "{icon} {volume}%", "format-bluetooth-muted": " {icon}", - "format-muted": "muted", + "format-muted": "muted", "format-icons": { - "headphone": " ", - "hands-free": " ", - "headset": " ", - "phone": " ", - "portable": " ", - "car": " ", + "headphone": " ", + "hands-free": " ", + "headset": " ", + "phone": " ", + "portable": " ", + "car": " ", "default": [ - " ", - " ", - " " + " ", + " ", + " " ] }, "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", @@ -116,14 +116,14 @@ "critical": 10 }, "format": "{icon}{capacity}%", - "format-charging": "{capacity}%", - "format-plugged": "{capacity}%", + "format-charging": "{capacity}%", + "format-plugged": "{capacity}%", "format-icons": [ - " ", - " ", - " ", - " ", - " " + " ", + " ", + " ", + " ", + " " ], "on-click": "nomarchy-menu powermgmt", "tooltip-format": "Battery status" diff --git a/themes/summer-day/waybar.jsonc b/themes/summer-day/waybar.jsonc index 9aae8c6..0c7a227 100644 --- a/themes/summer-day/waybar.jsonc +++ b/themes/summer-day/waybar.jsonc @@ -8,11 +8,28 @@ "position": "top", "spacing": 15, "reload_style_on_change": true, - - "modules-left": ["custom/launcher", "clock"], - "modules-center": ["hyprland/workspaces"], - "modules-right": ["custom/recording", "idle_inhibitor", "pulseaudio", "custom/powerprofile", "custom/nightlight", "hyprland/language", "custom/updates", "battery", "tray", "custom/vpn", "custom/doctor", "custom/notification", "custom/powermenu"], - + "modules-left": [ + "custom/launcher", + "clock" + ], + "modules-center": [ + "hyprland/workspaces" + ], + "modules-right": [ + "custom/recording", + "idle_inhibitor", + "pulseaudio", + "custom/powerprofile", + "custom/nightlight", + "hyprland/language", + "custom/updates", + "battery", + "tray", + "custom/vpn", + "custom/doctor", + "custom/notification", + "custom/powermenu" + ], "hyprland/workspaces": { "disable-scroll": true, "all-outputs": true, @@ -20,14 +37,12 @@ "on-scroll-up": "hyprctl dispatch workspace r+1", "on-scroll-down": "hyprctl dispatch workspace r-1" }, - "custom/launcher": { "interval": "once", - "format": "\uf000", + "format": "", "on-click": "nomarchy-menu", "tooltip-format": "Nomarchy menu" }, - "idle_inhibitor": { "format": "{icon}", "format-icons": { @@ -35,55 +50,64 @@ "deactivated": " 󰾪 " } }, - "pulseaudio": { "format": "{icon}{volume}%", - "format-bluetooth": "{icon}  {volume}%", + "format-bluetooth": "{icon}  {volume}%", "format-bluetooth-muted": "  muted", - "format-muted": "muted", + "format-muted": "muted", "format-icons": { - "headphone": " ", - "hands-free": " ", - "headset": " ", - "phone": " ", - "portable": " ", - "car": " ", - "default": [" ", " ", " "] + "headphone": " ", + "hands-free": " ", + "headset": " ", + "phone": " ", + "portable": " ", + "car": " ", + "default": [ + " ", + " ", + " " + ] }, "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", "on-click-right": "pwvucontrol", "tooltip-format": "Playing at {volume}%" }, - "battery": { "interval": 60, - "states": { "warning": 25, "critical": 10 }, + "states": { + "warning": 25, + "critical": 10 + }, "max-length": 14, "format": "{icon}{capacity}%", - "format-charging": "{capacity}%", - "format-plugged": "{capacity}%", + "format-charging": "{capacity}%", + "format-plugged": "{capacity}%", "format-full": " 100%", - "format-icons": [" ", " ", " ", " ", " "], + "format-icons": [ + " ", + " ", + " ", + " ", + " " + ], "on-click": "nomarchy-menu powermgmt", "tooltip-format": "Battery status" }, - "clock": { "format": " {:%H:%M · %a %d %b}", "on-click": "nomarchy-calendar", "tooltip": true, "tooltip-format": "{:%A %d %B %Y}\n{:%Z (UTC%z)}\n{calendar}" }, - - "tray": { "spacing": 8 }, - + "tray": { + "spacing": 8 + }, "custom/powerprofile": { "return-type": "json", "interval": 5, "exec": "nomarchy-powerprofile-status", "on-click": "nomarchy-menu powermgmt" }, - "custom/recording": { "return-type": "json", "interval": 10, @@ -91,7 +115,6 @@ "exec": "nomarchy-record status", "on-click": "nomarchy-record stop" }, - "custom/doctor": { "return-type": "json", "format": "{}", @@ -100,26 +123,22 @@ "exec": "nomarchy-doctor-status", "on-click": "nomarchy-menu doctor" }, - "custom/vpn": { "return-type": "json", "interval": 5, "exec": "nomarchy-vpn-status", "on-click": "nomarchy-vpn" }, - "hyprland/language": { - "format": "󰌌 {short}", + "format": "󰌌 {short}", "tooltip": false }, - "custom/nightlight": { "return-type": "json", "interval": 3, "exec": "nomarchy-nightlight status", "on-click": "nomarchy-nightlight toggle" }, - "custom/updates": { "return-type": "json", "interval": 1800, @@ -127,7 +146,6 @@ "exec": "nomarchy-updates status", "on-click": "sh -c '$TERMINAL -e nomarchy-updates upgrade'" }, - "custom/notification": { "format": "{icon}", "return-type": "json", @@ -148,7 +166,6 @@ "dnd-inhibited-notification": "" } }, - "custom/powermenu": { "format": "", "on-click": "nomarchy-menu power", diff --git a/themes/summer-night/waybar.jsonc b/themes/summer-night/waybar.jsonc index 7435824..4e81bfe 100644 --- a/themes/summer-night/waybar.jsonc +++ b/themes/summer-night/waybar.jsonc @@ -8,11 +8,28 @@ "position": "top", "spacing": 15, "reload_style_on_change": true, - - "modules-left": ["custom/nomarchy", "clock"], - "modules-center": ["hyprland/workspaces"], - "modules-right": ["custom/recording", "idle_inhibitor", "pulseaudio", "custom/powerprofile", "custom/nightlight", "hyprland/language", "custom/updates", "battery", "tray", "custom/vpn", "custom/doctor", "custom/notification", "custom/powermenu"], - + "modules-left": [ + "custom/nomarchy", + "clock" + ], + "modules-center": [ + "hyprland/workspaces" + ], + "modules-right": [ + "custom/recording", + "idle_inhibitor", + "pulseaudio", + "custom/powerprofile", + "custom/nightlight", + "hyprland/language", + "custom/updates", + "battery", + "tray", + "custom/vpn", + "custom/doctor", + "custom/notification", + "custom/powermenu" + ], "hyprland/workspaces": { "disable-scroll": true, "all-outputs": true, @@ -20,14 +37,12 @@ "on-scroll-up": "hyprctl dispatch workspace r+1", "on-scroll-down": "hyprctl dispatch workspace r-1" }, - "custom/nomarchy": { "interval": "once", - "format": "\uf000", + "format": "", "on-click": "nomarchy-menu", "tooltip-format": "Nomarchy menu" }, - "idle_inhibitor": { "format": "{icon}", "format-icons": { @@ -35,54 +50,63 @@ "deactivated": " 󰾪 " } }, - "pulseaudio": { "scroll-step": 5, "format": "{icon}{volume}%", - "format-bluetooth": "{icon} {volume}%", + "format-bluetooth": "{icon} {volume}%", "format-bluetooth-muted": " {icon}", - "format-muted": "muted", + "format-muted": "muted", "format-icons": { - "headphone": " ", - "hands-free": " ", - "headset": " ", - "phone": " ", - "portable": " ", - "car": " ", - "default": [" ", " ", " "] + "headphone": " ", + "hands-free": " ", + "headset": " ", + "phone": " ", + "portable": " ", + "car": " ", + "default": [ + " ", + " ", + " " + ] }, "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", "on-click-right": "pwvucontrol", "tooltip-format": "{desc} | {volume}%" }, - "battery": { "interval": 30, - "states": { "warning": 25, "critical": 10 }, + "states": { + "warning": 25, + "critical": 10 + }, "format": "{icon}{capacity}%", - "format-charging": "{capacity}%", - "format-plugged": "{capacity}%", - "format-icons": [" ", " ", " ", " ", " "], + "format-charging": "{capacity}%", + "format-plugged": "{capacity}%", + "format-icons": [ + " ", + " ", + " ", + " ", + " " + ], "on-click": "nomarchy-menu powermgmt", "tooltip-format": "Battery status" }, - "clock": { "format": " {:%H:%M · %a %d %b}", "on-click": "nomarchy-calendar", "tooltip": true, "tooltip-format": "{:%A %d %B %Y}\n{:%Z (UTC%z)}\n{calendar}" }, - - "tray": { "spacing": 8 }, - + "tray": { + "spacing": 8 + }, "custom/powerprofile": { "return-type": "json", "interval": 5, "exec": "nomarchy-powerprofile-status", "on-click": "nomarchy-menu powermgmt" }, - "custom/recording": { "return-type": "json", "interval": 10, @@ -90,7 +114,6 @@ "exec": "nomarchy-record status", "on-click": "nomarchy-record stop" }, - "custom/doctor": { "return-type": "json", "format": "{}", @@ -99,26 +122,22 @@ "exec": "nomarchy-doctor-status", "on-click": "nomarchy-menu doctor" }, - "custom/vpn": { "return-type": "json", "interval": 5, "exec": "nomarchy-vpn-status", "on-click": "nomarchy-vpn" }, - "hyprland/language": { - "format": "󰌌 {short}", + "format": "󰌌 {short}", "tooltip": false }, - "custom/nightlight": { "return-type": "json", "interval": 3, "exec": "nomarchy-nightlight status", "on-click": "nomarchy-nightlight toggle" }, - "custom/updates": { "return-type": "json", "interval": 1800, @@ -126,7 +145,6 @@ "exec": "nomarchy-updates status", "on-click": "sh -c '$TERMINAL -e nomarchy-updates upgrade'" }, - "custom/notification": { "format": "{icon}", "return-type": "json", @@ -147,7 +165,6 @@ "dnd-inhibited-notification": "" } }, - "custom/powermenu": { "format": "", "on-click": "nomarchy-menu power",