fix(desktop): tighter bar icon pad + case-insensitive rofi match
Some checks failed
Check / eval (push) Has been cancelled

- 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.
This commit is contained in:
2026-07-10 13:06:47 +01:00
parent d547393e7b
commit b5263bcef8
7 changed files with 177 additions and 141 deletions

View File

@@ -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;

View File

@@ -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";
};

View File

@@ -215,17 +215,18 @@ let
# Active keyboard layout (per focused device) — only placed in
# modules-right when showLanguage (see above).
"hyprland/language" = {
format = "<span size='${toString (t.fonts.size + 2)}pt'>󰌌</span> {short}";
# Two spaces after the glyph: the keyboard icon's right bearing
# otherwise kisses the layout code (esp. mono Nerd faces).
format = "<span size='${toString (t.fonts.size + 2)}pt'>󰌌 </span>{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 = "<span size='${toString (t.fonts.size + 2)}pt'>{icon}</span> {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 = "<span size='${toString (t.fonts.size + 2)}pt'>{icon}</span>{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 = "<span size='${toString (t.fonts.size + 2)}pt'>{icon}</span> {capacity}%";
format-charging = "<span size='${toString (t.fonts.size + 2)}pt'>󰂄 </span>{capacity}%";
format-icons = [ "󰁺 " "󰁼 " "󰁾 " "󰂀 " "󰁹 " ];
# Same double-pad as pulseaudio (single space still tight on some glyphs).
format = "<span size='${toString (t.fonts.size + 2)}pt'>{icon}</span>{capacity}%";
format-charging = "<span size='${toString (t.fonts.size + 2)}pt'>󰂄 </span>{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";

View File

@@ -85,7 +85,7 @@
"on-click": "nomarchy-nightlight toggle"
},
"hyprland/language": {
"format": "<span size='13pt'>󰌌</span> {short}",
"format": "<span size='13pt'>󰌌 </span>{short}",
"tooltip": false
},
"custom/vpn": {
@@ -97,20 +97,20 @@
"pulseaudio": {
"scroll-step": 5,
"format": "<span size='13pt'>{icon}</span>{volume}%",
"format-bluetooth": "<span size='13pt'>{icon} </span>{volume}%",
"format-bluetooth": "<span size='13pt'>{icon} </span>{volume}%",
"format-bluetooth-muted": " {icon}",
"format-muted": "<span size='13pt'> </span>muted",
"format-muted": "<span size='13pt'> </span>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": "<span size='13pt'>{icon}</span>{capacity}%",
"format-charging": "<span size='13pt'> </span>{capacity}%",
"format-plugged": "<span size='13pt'> </span>{capacity}%",
"format-charging": "<span size='13pt'> </span>{capacity}%",
"format-plugged": "<span size='13pt'> </span>{capacity}%",
"format-icons": [
" ",
" ",
" ",
" ",
" "
" ",
" ",
" ",
" ",
" "
],
"on-click": "nomarchy-menu powermgmt",
"tooltip-format": "Battery status"

View File

@@ -70,7 +70,7 @@
"on-click": "nomarchy-nightlight toggle"
},
"hyprland/language": {
"format": "<span size='13pt'>󰌌</span> {short}",
"format": "<span size='13pt'>󰌌 </span>{short}",
"tooltip": false
},
"custom/updates": {
@@ -83,20 +83,20 @@
"pulseaudio": {
"scroll-step": 5,
"format": "<span size='13pt'>{icon}</span>{volume}%",
"format-bluetooth": "<span size='13pt'>{icon} </span>{volume}%",
"format-bluetooth": "<span size='13pt'>{icon} </span>{volume}%",
"format-bluetooth-muted": " {icon}",
"format-muted": "<span size='13pt'> </span>muted",
"format-muted": "<span size='13pt'> </span>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": "<span size='13pt'>{icon}</span>{capacity}%",
"format-charging": "<span size='13pt'> </span>{capacity}%",
"format-plugged": "<span size='13pt'> </span>{capacity}%",
"format-charging": "<span size='13pt'> </span>{capacity}%",
"format-plugged": "<span size='13pt'> </span>{capacity}%",
"format-icons": [
" ",
" ",
" ",
" ",
" "
" ",
" ",
" ",
" ",
" "
],
"on-click": "nomarchy-menu powermgmt",
"tooltip-format": "Battery status"

View File

@@ -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": "<span size='13pt'>{icon}</span>{volume}%",
"format-bluetooth": "<span size='13pt'>{icon}  </span>{volume}%",
"format-bluetooth": "<span size='13pt'>{icon}  </span>{volume}%",
"format-bluetooth-muted": "  muted",
"format-muted": "<span size='13pt'> </span>muted",
"format-muted": "<span size='13pt'> </span>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": "<span size='13pt'>{icon}</span>{capacity}%",
"format-charging": "<span size='13pt'> </span>{capacity}%",
"format-plugged": "<span size='13pt'> </span>{capacity}%",
"format-charging": "<span size='13pt'> </span>{capacity}%",
"format-plugged": "<span size='13pt'> </span>{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<tt><small>{calendar}</small></tt>"
},
"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": "<span size='13pt'>󰌌</span> {short}",
"format": "<span size='13pt'>󰌌 </span>{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",

View File

@@ -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": "<span size='13pt'>{icon}</span>{volume}%",
"format-bluetooth": "<span size='13pt'>{icon} </span>{volume}%",
"format-bluetooth": "<span size='13pt'>{icon} </span>{volume}%",
"format-bluetooth-muted": " {icon}",
"format-muted": "<span size='13pt'> </span>muted",
"format-muted": "<span size='13pt'> </span>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": "<span size='13pt'>{icon}</span>{capacity}%",
"format-charging": "<span size='13pt'> </span>{capacity}%",
"format-plugged": "<span size='13pt'> </span>{capacity}%",
"format-icons": [" ", " ", " ", " ", " "],
"format-charging": "<span size='13pt'> </span>{capacity}%",
"format-plugged": "<span size='13pt'> </span>{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<tt><small>{calendar}</small></tt>"
},
"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": "<span size='13pt'>󰌌</span> {short}",
"format": "<span size='13pt'>󰌌 </span>{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",