fix(keybinds): SUPER+? never fired — shifted keysym needs SHIFT in the modmask
All checks were successful
Check / eval (push) Successful in 2m53s

? is typed as Shift+/, so Hyprland saw mods SUPER+SHIFT with keysym
`question` and the exact-modmask match skipped the `$mod, question`
bind — the keypress fell through to the focused window (caught on the
Latitude, BACKLOG item 26; the menu itself was fine from a terminal).

- keybinds.nix: bind is now `$mod SHIFT, question`.
- rofi.nix prettyKeys collapses "SHIFT + ?" back to "?" so the
  cheatsheet row keeps the documented SUPER + ? label.
- MEMORY.md gotcha: shifted keysyms need SHIFT in mods — invisible to
  eval-tier tests.

Verified: V0 (flake check --no-build); V1 both surfaces (eval'd
settings.bind renders `$mod SHIFT, question, exec, nomarchy-menu
keybinds`; built nomarchy-menu's cheatsheet renders `SUPER + ?`).
V3 queued: SUPER+? on the Latitude after home-update + relogin.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-07-04 18:46:50 +01:00
parent 0d80ab272f
commit 63136a8cb1
6 changed files with 33 additions and 18 deletions

View File

@@ -25,20 +25,6 @@ next, in what order*.
*Items 2126: real-hardware QA findings from the Latitude 5410
(Bernardo, 2026-07-04) — bugs found on metal outrank the queue.*
### 26. SUPER+? cheatsheet bind never fires on hardware
Reported (Latitude sweep #2): SUPER+? does nothing — the ? reaches the
focused terminal. Cause: keybinds.nix binds `$mod, question`, but
typing ? holds Shift, so Hyprland sees mods SUPER+SHIFT with keysym
`question` and its exact-modmask match skips a bind declaring SUPER
only (the "question already implies Shift" comment doesn't hold on
real input; headless V1/V2 never pressed the key). Fix: `$mod SHIFT,
question` (user-facing label stays SUPER+?); while there, audit the
bind list for other shifted keysyms (none today — letters carry
explicit SHIFT mods). Confirmed bind-only: `nomarchy-menu keybinds`
from a terminal opens the cheatsheet fine (Latitude, 2026-07-04).
**Verify:** V1 (rendered bind string in the HM generation); V3 retest
on the Latitude.
### 25. swaync text unreadable on summer-day (light-theme contrast)
Reported: on summer-day, notification/control-centre text is invisible
(contrast). Root cause (traced 2026-07-04): swaync.nix renders `.body`

View File

@@ -33,7 +33,12 @@ QA machine), the **T14s** (webcam case).
no comma layout was configured, so the bind wasn't rendered (the
gate working as designed, not a failure) — retest after setting a
comma layout + rebuild + relogin. The SUPER+? no-op found en
route IS a real bug → BACKLOG item 26.
route IS a real bug → BACKLOG item 26 (fix shipped — see the
dedicated SUPER+? entry below).
- [ ] **SUPER+? opens the cheatsheet** (item 26 fix) — after
`home-update` + relogin (or `hyprctl reload`), SUPER+? must open
the keybindings cheatsheet, whose row still reads `SUPER + ?`
(not `SUPER + SHIFT + ?`).
- [ ] **Keyboard hotplug picker (re-verify after in-flake graduation)** —
plug an external keyboard post-login, pick a layout in rofi, confirm
it applies per-device only, persists in `settings.keyboard.devices`,

View File

@@ -17,6 +17,20 @@ Template:
---
## 2026-07-04 — SUPER+? bind fix (iteration #8, item 26)
- **Task:** BACKLOG NOW#26 — cheatsheet bind never fires on hardware.
- **Did:** keybinds.nix: `$mod, question``$mod SHIFT, question`
(? is Shift+/, Hyprland matches the exact modmask); rofi.nix
prettyKeys collapses "SHIFT + ?" → "?" so the row stays SUPER + ?.
Gotcha added to MEMORY.md (shifted keysyms need SHIFT in mods).
- **Verified:** V0 (flake check --no-build); V1 both surfaces — eval'd
hyprland settings.bind renders `$mod SHIFT, question, exec,
nomarchy-menu keybinds`, and built nomarchy-menu's cheatsheet file
renders `SUPER + ?`. No other shifted keysyms in the bind list.
- **Pending:** V3 queued (SUPER+? on the Latitude after home-update +
relogin).
- **Next suggestion:** item 25 (swaync contrast on summer-day).
## 2026-07-04 — Latitude hardware sweep #2 (Bernardo; results booked, no code)
- **Task:** V3 sweep on the Latitude after pulling ≥18b8545 + reboot.
- **PASS:** waybar supervisor (theme switches clean; `pkill -x waybar`

View File

@@ -47,6 +47,10 @@ iteration would otherwise rediscover.
split (BACKLOG LATER) is the decided fix (§ Faster switches).
## Gotchas (cost a debugging session once)
- Hyprland binds match the exact modmask: a shifted keysym (`question`)
needs SHIFT in `mods` or the bind never fires — the keypress falls
through to the focused window (§ item 26; caught on hardware, invisible
to eval-tier tests).
- Never kill a Wayland session-lock client (hyprlock): its crash
failsafe drops to a tty instead of unlocking (§ Hibernate
double-unlock).

View File

@@ -33,8 +33,11 @@
{ mods = "$mod"; key = "X"; action = "exec, nomarchy-menu power"; desc = "Power menu"; }
{ mods = "$mod"; key = "N"; action = "exec, swaync-client -t"; desc = "Notification centre"; }
# SUPER+? (the "question" keysym already implies Shift on most layouts).
{ mods = "$mod"; key = "question"; action = "exec, nomarchy-menu keybinds"; desc = "Keybindings cheatsheet"; }
# SUPER+? — ? is typed as Shift+/, so SHIFT must be in the bind's
# modmask or Hyprland's exact-modifier match never fires (the key then
# falls through to the focused window; caught on hardware, item 26).
# The cheatsheet still renders this row as SUPER + ? (rofi.nix).
{ mods = "$mod SHIFT"; key = "question"; action = "exec, nomarchy-menu keybinds"; desc = "Keybindings cheatsheet"; }
# Menu functions — SUPER+CTRL+<mnemonic> jumps straight to a
# nomarchy-menu module (all also reachable from the SUPER+M picker).

View File

@@ -117,7 +117,10 @@ let
let m = lib.replaceStrings [ "$mod" ] [ "SUPER" ] b.mods;
prefix = if m == "" then "" else lib.concatStringsSep " + " (lib.splitString " " m) + " + ";
key = lib.replaceStrings [ "question" "slash" ] [ "?" "/" ] b.key;
in prefix + key;
# ? already implies Shift — the bind needs SHIFT in its modmask
# (keybinds.nix), but showing it would read double, so collapse
# "SHIFT + ?" back to the documented "?".
in lib.replaceStrings [ "SHIFT + ?" ] [ "?" ] (prefix + key);
cheatRows =
map (b: padRight 22 (prettyKeys b) + b.desc) (keybinds.binds
++ lib.optionals (lib.hasInfix "," cfg.keyboard.layout)