feat(tv-input): gamepad->keyboard bridge daemon + controller-navigable modals
- archipelago-gamepad-keys: evdev->uinput daemon (pure python3 stdlib) that mirrors any attached controller as a virtual keyboard — D-pad/stick to arrows, A/B to Enter/Escape, X/Y to Space/f, shoulders to Tab/Shift+Tab. The browser sees real keys, so controllers work inside EVERY app iframe (IndeeHub, Jellyfin…) with zero per-app code. Ships via the ISO splice and bootstrap self-heal (kiosk nodes only), hotplug via 5s rescans. Implements docs/tv-input-iframe-apps.md. - useControllerNav: an open [role=dialog][aria-modal] owns navigation — focus is pulled inside, arrows move spatially between its controls, Enter activates, Escape stays with the modal's own close handling. One standard mapping for every modal. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
402183c0ae
commit
54ddd043bd
@@ -391,6 +391,10 @@ async fn main() -> Result<()> {
|
||||
// boot-time ELD race that leaves HDMI silently unavailable).
|
||||
tokio::spawn(bootstrap::ensure_audio_stack());
|
||||
|
||||
// TV input: gamepad→keyboard bridge so controllers work inside every app
|
||||
// iframe on kiosk nodes (docs/tv-input-iframe-apps.md).
|
||||
tokio::spawn(bootstrap::ensure_gamepad_keys());
|
||||
|
||||
// Pine voice: re-point IP-pinned Wyoming satellite entries (speakers) when
|
||||
// DHCP renumbering strands them — HA never re-resolves on its own.
|
||||
tokio::spawn(api::rpc::wyoming_satellite_keeper());
|
||||
|
||||
Reference in New Issue
Block a user