diff --git a/clients/android/app/src/main/kotlin/io/unom/punktfunk/SettingsScreen.kt b/clients/android/app/src/main/kotlin/io/unom/punktfunk/SettingsScreen.kt index 86bb00b9..1a737062 100644 --- a/clients/android/app/src/main/kotlin/io/unom/punktfunk/SettingsScreen.kt +++ b/clients/android/app/src/main/kotlin/io/unom/punktfunk/SettingsScreen.kt @@ -850,7 +850,8 @@ private fun ControllerSettings(s: Settings, update: (Settings) -> Unit, onOpenCo field = "gamepad", enabled = s.gamepadForwarding, caption = "The virtual pad the host creates. Automatic matches your controller; " + - "every connected one is forwarded as its own player.", + "every connected one is forwarded as its own player. An X-Box type has no " + + "gyroscope, so pick a DualSense-class one if you want motion.", ) { g -> update(s.copy(gamepad = g)) } SettingDropdown( label = "Guide button", diff --git a/clients/linux/src/ui_settings.rs b/clients/linux/src/ui_settings.rs index ed35fd69..8a9884bd 100644 --- a/clients/linux/src/ui_settings.rs +++ b/clients/linux/src/ui_settings.rs @@ -1575,7 +1575,8 @@ pub fn show_scoped( &dialog, inline, "Gamepad type", - "The virtual pad on the host — Automatic matches your controller", + "The virtual pad on the host — Automatic matches your controller. An X-Box type has no \ + gyroscope, so pick a DualSense-class one if you want motion.", &[ "Automatic", "Xbox 360", diff --git a/docs-site/content/docs/client-settings.md b/docs-site/content/docs/client-settings.md index d2686f3e..f44b9598 100644 --- a/docs-site/content/docs/client-settings.md +++ b/docs-site/content/docs/client-settings.md @@ -189,6 +189,20 @@ explicit choice declares your choice — and the host builds each virtual pad fr host has no backend for degrades to an Xbox 360 pad rather than failing: Xbox One on a Windows host, for instance, or any Sony pad on a Linux host that can't open `/dev/uhid`. +That degrade is the one thing worth knowing about **motion**. An Xbox-class virtual pad has no +gyroscope in its HID contract, so a session that ends up on one throws every motion sample away — +your controller's gyro simply does nothing, which from the couch is indistinguishable from a broken +sensor. Automatic lands there for any controller punktfunk doesn't recognise as Sony or Valve (an +8BitDo with a gyro, say), and so does a Switch Pro streaming to a Windows host, which has no +Nintendo backend to build. **If you want motion, pick a DualSense-class type** — DualSense, +DualSense Edge, DualShock 4, Switch Pro or Steam Deck all carry a motion plane. The clients detect +this case and say so on-screen for a few seconds when it happens; the setting applies from the next +session, not the one you are in. + +On a **Steam Deck as the client**, motion also needs Steam Input switched off for punktfunk — with +it on, Steam hands the app its own virtual Xbox pad, which has no gyro to forward no matter which +type you pick. + **Forwarded controller** (*Use controller* on Apple and the console home) — *default: Automatic*, which forwards *every* connected controller, each as its own player, on Linux, Windows, Apple and the console home. Pinning one restricts the session to that controller alone — single-player. The Android diff --git a/docs-site/content/docs/support-matrix.md b/docs-site/content/docs/support-matrix.md index 7a2f16bd..362ec95a 100644 --- a/docs-site/content/docs/support-matrix.md +++ b/docs-site/content/docs/support-matrix.md @@ -450,6 +450,15 @@ macOS, iOS/iPadOS and tvOS. Android is one app, with Android TV being the same a host injects it into the matching virtual pad; the Deck's trackpads ride the same touchpad surface. On the Apple clients rich capture is gated to the DualSense/DualShock 4 family, so other pads there really do get rumble only. + + **But motion only lands if the virtual pad the host builds has somewhere to put it.** The Xbox + 360 and Xbox One backends have no gyro in their HID contract, so a session that resolves to one + parses every motion sample and discards it. That is what *Automatic* does for any controller it + doesn't recognise as Sony or Valve — an 8BitDo with a perfectly good gyro included — and it is + also where a Switch Pro lands on a Windows host, which has no `hid-nintendo` backend to fold it + into. Set **Controller type** to a DualSense-class preset to get motion in those cases; the + clients now say so on-screen when they detect it, rather than leaving you to guess why tilting + does nothing. See [Gamepad type](/docs/client-settings#gamepad-type). 3. No desktop client sends pen input, even though the desktop hosts can inject it. 4. All three touch modes exist in the shared code and the picker is there, but nobody has confirmed them on a Windows 2-in-1. Only meaningful on a touchscreen anyway.