fix(docking): make clamshell hotplug safe and discoverable
All checks were successful
Check / eval (push) Successful in 3m32s
All checks were successful
Check / eval (push) Successful in 3m32s
Real dock QA exposed pointer-bound menus, an absent default rescue watcher, the unsafe zero-output panel-off path, missing keyboard/audio hotplug coverage, and unpainted new outputs. Route Rofi to the focused output; replace panel disable with safe workspace migration; always run and reconnect the display watcher and repaint hotplugged outputs; expose a default per-device keyboard picker; handle audio card availability transitions. Verified: V1 — nix flake check --no-build; checks.docking-ux real Home Manager artifact build; option-docs/template-sot; Nix parse, py_compile, and git diff --check. V2 unavailable: no readable KVM. V3 pending in agent/HARDWARE-QUEUE.md.
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
# Undock blackout-rescue harness — boots the full desktop headlessly
|
||||
# (softGL Hyprland, same recipe as theme-shot.nix) and replays the
|
||||
# dangerous sequence: add a headless "external", soft-disable the
|
||||
# internal panel (the Display menu's "Laptop screen off" command), then
|
||||
# remove the external. Hyprland does NOT re-enable a disabled monitor on
|
||||
# dangerous profile edge: add a headless "external", soft-disable the
|
||||
# internal panel (a named profile can still do this), then remove the
|
||||
# external. The interactive Display menu no longer disables the panel: its
|
||||
# safe Dock mode moves workspaces/focus but keeps eDP as the unplug fallback.
|
||||
# Hyprland does NOT re-enable a profile-disabled monitor on
|
||||
# its own (verified 2026-07-12 — the session ends with zero active
|
||||
# outputs), so the display-profile watcher's rescue_blackout
|
||||
# (modules/home/hyprland.nix) must bring the panel back; this asserts it
|
||||
@@ -63,6 +65,9 @@ pkgs.testers.runNixOSTest {
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
machine.wait_for_file("/run/user/1000/hypr", 180)
|
||||
machine.sleep(20) # softGL first paint settle
|
||||
machine.wait_until_succeeds(
|
||||
"pgrep -af nomarchy-display-profile-watch >/dev/null", timeout=30
|
||||
)
|
||||
|
||||
hy = ("su - nomarchy -c 'XDG_RUNTIME_DIR=/run/user/1000 "
|
||||
"HYPRLAND_INSTANCE_SIGNATURE=$(ls /run/user/1000/hypr | head -1) hyprctl ")
|
||||
@@ -85,7 +90,7 @@ pkgs.testers.runNixOSTest {
|
||||
ext = [n for n in names if n != internal][0]
|
||||
print(f"external (headless): {ext}")
|
||||
|
||||
# Menu action: "Laptop screen off" — the exact command the row runs.
|
||||
# Named display-profile edge: eDP is disabled before an abrupt undock.
|
||||
machine.succeed(hy + f"keyword monitor {internal},disable'")
|
||||
for _ in range(20):
|
||||
if [x["name"] for x in mons()] == [ext]: break
|
||||
|
||||
Reference in New Issue
Block a user