Skip to content

Commit 102f7c6

Browse files
Align Switch Pro revision and update docs
Set the Switch Pro profile version to `0x0210` (matching physical hardware revision behavior) and extend tests to assert the profile version and Windows HID `VersionNumber` exposure. Update platform and end-user compatibility docs with revised Switch Pro motion/battery status, HOME LED limitations, and refreshed validation notes across Windows/Linux and Moonlight clients.
1 parent bfeef3c commit 102f7c6

5 files changed

Lines changed: 20 additions & 10 deletions

File tree

docs/end-user-gamepad-guide.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,9 @@ columns compare the existing Windows Virtual HID Driver results.
148148
| Standard buttons, sticks, and D-pad |||||||
149149
| Digital trigger input (0 or 1) |||||||
150150
| Basic rumble |||||||
151-
| Motion/gyro | ❓<sup><a href="#compatibility-note-9">9</a></sup> | ❓<sup><a href="#compatibility-note-13">13</a></sup> | ❓<sup><a href="#compatibility-note-9">9</a></sup> | ❌<sup><a href="#compatibility-note-9">9</a></sup> | ❌<sup><a href="#compatibility-note-9">9</a></sup> ||
152-
| Battery state |||||||
151+
| Motion/gyro | ❌<sup><a href="#compatibility-note-9">9</a></sup> ||| ❌<sup><a href="#compatibility-note-17">17</a></sup> | ❌<sup><a href="#compatibility-note-9">9</a></sup> ||
152+
| Battery state |||||||
153+
| HOME LED | ❌<sup><a href="#compatibility-note-16">16</a></sup> | ❌<sup><a href="#compatibility-note-16">16</a></sup> | ❌<sup><a href="#compatibility-note-16">16</a></sup> ||||
153154
| Player LED | ❌<sup><a href="#compatibility-note-14">14</a></sup> | ❌<sup><a href="#compatibility-note-14">14</a></sup> | ❌<sup><a href="#compatibility-note-14">14</a></sup> | ❌<sup><a href="#compatibility-note-14">14</a></sup> | ❌<sup><a href="#compatibility-note-14">14</a></sup> ||
154155
| Capture button |||| ❌<sup><a href="#compatibility-note-10">10</a></sup> | ✅<sup><a href="#compatibility-note-15">15</a></sup> ||
155156

@@ -167,13 +168,15 @@ that prevents the feature from working end to end.
167168
| <a id="compatibility-note-6"></a><sup>6</sup> | Client platform | Moonlight Android uses the RGB lights API available on Android 12 or later. It worked on tested newer devices but was unavailable on NVIDIA Shield running Android 11. | [Moonlight Android RGB-light detection](https://github.com/moonlight-stream/moonlight-android/blob/master/app/src/main/java/com/limelight/binding/input/ControllerHandler.java#L3454-L3470) |
168169
| <a id="compatibility-note-7"></a><sup>7</sup> | Host output pipeline | DualSense player-indicator and MUTE-button LED forwarding is covered by open host pull requests. This note applies only to the LEDs; the MUTE button input works through both host backends with Moonlight Qt. When a DualSense is connected to Android, its physical MUTE-button LED works locally, but that LED state is not forwarded to the virtual controller on the host. | [libvirtualhid pull request #97](https://github.com/LizardByte/libvirtualhid/pull/97) and [Sunshine pull request #5537](https://github.com/LizardByte/Sunshine/pull/5537) |
169170
| <a id="compatibility-note-8"></a><sup>8</sup> | Linux host backend | Steam exposes the Xbox Series Share button through the Linux uinput device, but pressing it does not change the button state. | [libvirtualhid issue #110](https://github.com/LizardByte/libvirtualhid/issues/110) |
170-
| <a id="compatibility-note-9"></a><sup>9</sup> | Host validation | The host backends now pack live Switch Pro motion into all three native IMU samples, with Windows installed-driver and Linux protocol regression coverage. The complete Moonlight Qt, Sunshine, and Steam path still needs to be retested; Moonlight Android separately tracks exposing Switch Pro with gyro. | [libvirtualhid issue #111](https://github.com/LizardByte/libvirtualhid/issues/111) and [Moonlight Android issue #1497](https://github.com/moonlight-stream/moonlight-android/issues/1497) |
171+
| <a id="compatibility-note-9"></a><sup>9</sup> | Windows host validation | A physical Switch Pro connected to Moonlight Qt v6.1.0 on Windows delivered gyro through Sunshine on Linux, but the same client and controller did not deliver usable gyro through Sunshine on Windows. The Windows installed-driver SDL3 test receives live virtual Switch motion, so the remaining failure is specific to the Windows VHF-to-Steam path rather than Moonlight's sensor transport. | [libvirtualhid issue #111](https://github.com/LizardByte/libvirtualhid/issues/111) |
171172
| <a id="compatibility-note-10"></a><sup>10</sup> | Client | Moonlight Android exposes the tested Switch Pro Capture input as A instead of Capture. A broader Android Switch Pro mapping issue exists, but the exact Capture symptom is not explicitly tracked. | [Moonlight Android issue #842](https://github.com/moonlight-stream/moonlight-android/issues/842) |
172173
| <a id="compatibility-note-11"></a><sup>11</sup> | Host backend | The Linux uinput/evdev Xbox One and Xbox Series profiles support basic rumble but cannot deliver independent Impulse Triggers. | [libvirtualhid issue #109](https://github.com/LizardByte/libvirtualhid/issues/109) |
173174
| <a id="compatibility-note-12"></a><sup>12</sup> | Client and protocol; resolved upstream, unreleased | Moonlight Qt adaptive-trigger support and its protocol and Sunshine dependencies are merged, but the latest published Moonlight Qt release predates them. The feature has not yet been validated with these backends. | [Moonlight Qt pull request #1561](https://github.com/moonlight-stream/moonlight-qt/pull/1561), [moonlight-common-c pull request #102](https://github.com/moonlight-stream/moonlight-common-c/pull/102), [Sunshine pull request #3738](https://github.com/LizardByte/Sunshine/pull/3738), and [Moonlight Qt v6.1.0](https://github.com/moonlight-stream/moonlight-qt/releases/tag/v6.1.0) |
174-
| <a id="compatibility-note-13"></a><sup>13</sup> | Linux host backend | The Linux backend now uses descriptor-driven UHID for Switch Pro, advertises a backend-only Bluetooth transport identity that SDL2 HIDAPI accepts for virtual devices, answers its initialization protocol, and carries live native motion reports. Its SDL consumer test requires motion sensors when `/dev/uhid` is available; hardware Steam validation is still needed for distribution-specific behavior. | [libvirtualhid issue #112](https://github.com/LizardByte/libvirtualhid/issues/112) and [closed Sunshine issue #3838](https://github.com/LizardByte/Sunshine/issues/3838) |
175-
| <a id="compatibility-note-14"></a><sup>14</sup> | Streaming host and client output pipeline | Both host backends now decode Switch Pro Set Player Lights output into solid and flashing player-indicator callbacks. Sunshine and each Moonlight client must still map that callback to their feedback protocol and physical controller support. | [libvirtualhid issue #113](https://github.com/LizardByte/libvirtualhid/issues/113) |
175+
| <a id="compatibility-note-13"></a><sup>13</sup> | Linux host backend | The Linux backend uses descriptor-driven UHID for Switch Pro, advertises a backend-only Bluetooth transport identity that SDL2 HIDAPI accepts for virtual devices, answers its initialization protocol, and carries live native motion reports. Motion and battery were validated end to end from Moonlight Qt v6.1.0 on Windows through Sunshine on Linux into Steam. | [libvirtualhid issue #112](https://github.com/LizardByte/libvirtualhid/issues/112) and [closed Sunshine issue #3838](https://github.com/LizardByte/Sunshine/issues/3838) |
176+
| <a id="compatibility-note-14"></a><sup>14</sup> | Streaming host and client output pipeline | Both host backends decode Switch Pro Set Player Lights output into solid and flashing player-indicator callbacks, and Sunshine can serialize those masks through its proposed protocol extension. Released moonlight-common-c and Moonlight clients do not consume that extension, so testing with Moonlight Qt v6.1.0 leaves the physical player LEDs unchanged on both host backends. | [libvirtualhid issue #113](https://github.com/LizardByte/libvirtualhid/issues/113) and [Sunshine player-LED integration](https://github.com/LizardByte/Sunshine/commit/596fbf9dc53775de87bc383a5293d4fcd546f837) |
176177
| <a id="compatibility-note-15"></a><sup>15</sup> | Client platform and version | The marked features worked when tested with Moonlight on an iPhone running iOS 18.7.10, but did not work on an Apple TV 4K running tvOS 26.6. Moonlight enables these extended features only when Apple's Game Controller framework exposes the corresponding buttons, haptics localities, motion sensors, or light. | [Moonlight capability detection](https://github.com/moonlight-stream/moonlight-ios/blob/85af0f75622bb2636481afda8b0fc5cc33d5956e/Limelight/Input/ControllerSupport.m#L547-L608), [Apple controller-haptics capabilities](https://developer.apple.com/documentation/gamecontroller/gcdevicehaptics), and [Apple controller-motion capabilities](https://developer.apple.com/documentation/gamecontroller/gcmotion) |
178+
| <a id="compatibility-note-16"></a><sup>16</sup> | Client capability and output pipeline | Both host backends decode Switch Pro Set HOME Light output as a grayscale LED callback. Moonlight Qt v6.1.0 uses SDL2's RGB-style LED capability check, and the tested controller reported no LED. Moonlight Qt master uses SDL3 through sdl2-compat; SDL3 identifies HOME as a mono LED, but the compatibility check maps only the RGB capability. Neither path advertises LED support to Sunshine, so it never sends the HOME-light command. | [Moonlight Qt LED capability check](https://github.com/moonlight-stream/moonlight-qt/blob/v6.1.0/app/streaming/input/gamepad.cpp), [SDL Switch HOME-light capability](https://github.com/libsdl-org/SDL/blob/147a8ee32dbf9ac02f3794964490687b6bbda1bc/src/joystick/hidapi/SDL_hidapi_switch.c), and [sdl2-compat LED mapping](https://github.com/libsdl-org/sdl2-compat/blob/a53b6ad90ecd2d0ccfe01d5cfd2059793acf8c12/src/sdl2_compat.c) |
179+
| <a id="compatibility-note-17"></a><sup>17</sup> | Moonlight Android controller lifecycle | With Moonlight Android v12.1 on Android 14, a USB Switch Pro repeatedly disconnected and reconnected in Steam through Sunshine on Linux, and opening Steam's gyro-calibration page triggered an immediate disconnect. Enabling motion makes Moonlight register Android input-device sensor listeners, while Android device removal is forwarded immediately. An Android event log is still needed to prove whether sensor activation causes remove/add events; issue #1497 separately tracks incorrect type handling for sensor-capable Nintendo controllers. | [Moonlight Android v12.1 sensor handling](https://github.com/moonlight-stream/moonlight-android/blob/v12.1/app/src/main/java/com/limelight/binding/input/ControllerHandler.java#L763-L779), [device removal handling](https://github.com/moonlight-stream/moonlight-android/blob/v12.1/app/src/main/java/com/limelight/binding/input/ControllerHandler.java#L234-L265), and [Moonlight Android issue #1497](https://github.com/moonlight-stream/moonlight-android/issues/1497) |
177180

178181
Analog trigger input reports intermediate values between 0 and 1. Switch Pro
179182
ZL/ZR input is digital and reports only 0 or 1. Trigger input is also separate

0 commit comments

Comments
 (0)