fix(rofi): normal sorter for fuzzy search + power-profile icons
All checks were successful
Check / eval (push) Successful in 3m8s

Two rofi fixes:

- Search (item 31): rofi 2.0.0's fzf sorter mis-ranks fuzzy matches —
  typing "steam" left ghostty selected instead of Steam. Bernardo's live
  A/B confirmed `-sorting-method normal` and `-matching normal` both fix
  it while `-no-sort` does not. Switch sorting-method fzf → normal, keep
  matching=fuzzy + case-sensitive=false.

- Power profile menu (item 39): list profiles with per-profile icons from
  Papirus' colored battery-profile-{performance,balanced,powersave} family
  (the -symbolic variants are #444 grey, invisible on dark). Row text
  stays the bare profile name so `powerprofilesctl set` is unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 21:51:07 +01:00
parent cd5d3b51e2
commit 926be22fd4
4 changed files with 53 additions and 28 deletions

View File

@@ -26,23 +26,6 @@ next, in what order*.
## NEXT
### 31. rofi search broken under rofi 2.0.0 `[bug]`
(Raised by Bernardo, 2026-07-07.) Typing a lowercase query fails to
match (`steam` doesn't select **Steam**) and Enter launches the first
entry instead (ghostty) — i.e. matching behaves case-sensitively and the
selection never moves off row 0. **Not a missing config key:** the
generated config already sets `case-sensitive = false`, `matching =
"fuzzy"`, `sort = true`, `sorting-method = "fzf"`, and `rofi -dump-config`
shows rofi 2.0.0 honours them (they're its new defaults). The lock bump
`8fded63` pulled **rofi 2.0.0** (a major version) — this is a 2.0
behaviour change. Needs interactive repro on a session (can't be
eyeballed headlessly). Candidate levers to A/B live: `matching`
(normal/prefix vs fuzzy), `-i`/`case-smart`/`normalize-match` (new 2.0
knobs), `sort`/`sorting-method`, and the per-modi `sorting-method:"name"`
default 2.0 shows for drun. Fix once, then bake into
`programs.rofi.extraConfig`. Covers Bernardo's item 1 (case-insensitive
search).
### 32. SUPER+? cheatsheet bind still not opening `[bug]`
(Raised by Bernardo, 2026-07-07 — item 2.) Item 26's fix (SHIFT in the
bind modmask so the shifted `question` keysym fires) shipped, but SUPER+?
@@ -50,11 +33,6 @@ still doesn't open the keybindings cheatsheet. Re-diagnose: confirm the
Hyprland bind's modmask/keysym against the *actual* layout, whether rofi
2.0.0 changed anything, and that the cheatsheet path still resolves.
### 39. Icons in the power-profile rofi menu
(Raised by Bernardo, 2026-07-07 — item 9.) The power-profile picker
(rofi.nix `power-profile`) lists profiles as bare text; add per-profile
icons (performance/balanced/power-saver) like the other System rows.
Small.
### 36. Battery / power quick menu
(Raised by Bernardo, 2026-07-07 — items "battery toggle in a rofi

View File

@@ -236,6 +236,13 @@ QA machine), the **T14s** (webcam case).
unchanged (the bar still reserves its space). Accepted trade-off
of `layer: bottom`: a floating window dragged over the top strip
can now overlap the bar — confirm that's the only regression.
- [ ] **rofi menu polish** (iteration #58, item 39 + #56/#57 34/40) —
after `home-update`: (a) menu System Power profile shows a
colored icon per profile (performance/balanced/power-saver), not
just text — icons *render* (not blank); (b) every submenu's ↩ Back
shows a single arrow, no double; (c) on this single-monitor box,
System Display → pick a resolution → Back returns to System
(not back into the same resolution list).
## AMD dev box only
- [ ] **AMD runtime bits** — VA-API (`vainfo` → radeonsi), amd-pstate EPP

View File

@@ -17,6 +17,25 @@ Template:
---
## 2026-07-07 — rofi search mis-ranks + power-profile icons (iteration #58, items 31 & 39)
- **#31 (rofi search broken):** Bernardo ran the live A/B — `-sorting-method
normal` and `-matching normal` both fixed "steam"→Steam; `-no-sort` did
not. So the culprit is rofi 2.0.0's **fzf sorter** paired with fuzzy
matching (it ranked ghostty above Steam), not case-sensitivity. Fix:
`programs.rofi.extraConfig.sorting-method` `"fzf"` → `"normal"`, keeping
`matching="fuzzy"` (forgiveness) + `case-sensitive=false`. Also closes
Bernardo's batch item 1 (case-insensitive — already false, now ranks
right too).
- **#39 (power-profile icons):** the picker listed profiles as bare text.
Now emits `row "$p" battery-profile-<p>` using Papirus' **colored**
`battery-profile-{performance,balanced,powersave}` family (the
`-symbolic` variants are #444 grey → invisible on dark themes; verified
the colored ones carry real fills). Returned row text stays the bare
profile name, so `powerprofilesctl set` is unaffected; added `-show-icons`.
- **Verified:** V0 `nix flake check --no-build` green for both. #31's fix
is the exact lever Bernardo confirmed live. #39's icon *rendering* is a
V3 visual check (Papirus lookup can't be eyeballed headlessly) — queued.
## 2026-07-07 — Display menu "Back" doesn't return (iteration #57, item 40)
- **Task:** BACKLOG item 40 — in System Display the Back row didn't
return on a single-monitor machine.

View File

@@ -227,8 +227,22 @@ let
exit 0
fi
cur=$(powerprofilesctl get 2>/dev/null)
choice=$( { powerprofilesctl list 2>/dev/null | sed -nE 's/^[* ] ([a-z-]+):$/\1/p'; printf '%s\n' "$BACK"; } \
| rofi -dmenu -p "profile (now: $cur)") || exit 0
# Each profile gets its themed icon from Papirus' colored
# battery-profile-* family (the -symbolic variants are #444 grey and
# vanish on dark themes). The selected row's returned text is still
# the bare profile name, so `powerprofilesctl set` is unaffected.
choice=$( {
powerprofilesctl list 2>/dev/null | sed -nE 's/^[* ] ([a-z-]+):$/\1/p' \
| while IFS= read -r p; do
case "$p" in
performance) row "$p" battery-profile-performance ;;
balanced) row "$p" battery-profile-balanced ;;
power-saver) row "$p" battery-profile-powersave ;;
*) row "$p" preferences-system-power ;;
esac
done
back
} | rofi -dmenu -show-icons -p "profile (now: $cur)") || exit 0
[ "$choice" = "$BACK" ] && exec "$0" system
[ -n "$choice" ] && powerprofilesctl set "$choice" ;;
@@ -899,13 +913,20 @@ in
# 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". fzf sorting ranks
# the closest match to the top (the per-keystroke modules — calc/emoji
# — opt out per-invocation with -no-sort).
# "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).
#
# 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";
case-sensitive = false;
sort = true;
sorting-method = "fzf";
sorting-method = "normal";
};
# Whole-swap themes bring their own rofi.rasi; otherwise the theme