mirror of
https://github.com/kuhyx/utils.git
synced 2026-11-14 01:10:59 +01:00
LockWindow.grab_input() only ever focuses the entry once, on first grab acquisition (_notify_focus_ready is one-shot). A surface torn down and rebuilt later -- a monitor going dark and recovering, which flaky DDC/CI power control does routinely -- gets a brand new widget that nothing ever focuses. The grab stays held, so no other window can take focus either: the entry renders correctly but is permanently keyboard-dead until the process restarts. RecoveryLoop.tick() now re-runs the same focus_surface(preferred_focus_ index()) call whenever a tick's surface delta reports a newly created output, mirroring what LockWindow does on first acquisition. Bundled the loop's five collaborators into a RecoveryCollaborators dataclass rather than growing its constructor past ruff's five-argument limit. Diagnosed against a week of wake-alarm's real journal history: the dismiss-code box rendered normally every alarm morning but accepted no keystrokes, tracking exactly with HDMI-0's recorded dark/recover blips near 07:00 and 07:55 each day. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGAEbavLSCAotBqhVfFhPc |
||
|---|---|---|
| .. | ||
| tests | ||
| __init__.py | ||
| _arbiter.py | ||
| _density.py | ||
| _detect.py | ||
| _escape.py | ||
| _fitcheck.py | ||
| _guards.py | ||
| _keyboard.py | ||
| _outputs.py | ||
| _recovery.py | ||
| _root.py | ||
| _scrollable.py | ||
| _surfaces.py | ||
| _vt.py | ||
| _window.py | ||
| log_integrity.py | ||