Skip to content

Commit 0098850

Browse files
docs: add end-user gamepad guide
Adds a new end-user-facing guide covering the streaming input path, controller setup, Sunshine configuration, client-specific compatibility observations, troubleshooting by symptom, and how to report problems. Links the guide from README.md, docs/usage.md, and Doxyfile.
1 parent 6089eed commit 0098850

7 files changed

Lines changed: 290 additions & 74 deletions

File tree

README.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ More complete examples live in `examples/`, including the streaming-host-oriente
8787
8888
## 📚 Documentation
8989
90+
- [End-user gamepad guide](docs/end-user-gamepad-guide.md): Sunshine and Moonlight setup, feature caveats,
91+
troubleshooting, and controller support references.
9092
- [Usage and API](docs/usage.md): CMake consumption, build options, public API overview, profiles, and examples.
9193
- [Platform support](docs/platform-support.md): backend capability model, Windows, Linux, macOS,
9294
and Linux permission setup.
@@ -119,12 +121,6 @@ same API where the backend exposes them.
119121
120122
## ⚠️ Known Windows Limitations
121123
122-
- Steam does not expose the Xbox Series Share button from the VHF child through
123-
the same Xbox HIDAPI path used by physical controllers. That path requires a
124-
non-VHF Xbox HIDAPI/GIP transport.
125-
- PlayStation and Nintendo rumble parsing is covered by protocol and installed
126-
driver tests but has not yet completed broad validation with real client
127-
applications.
128124
- The published Windows driver installer is AMD64-only. Windows ARM64 release
129125
packages require a different Microsoft driver-signing path.
130126

docs/Doxyfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ WARN_IF_UNDOCUMENTED = YES
3737
# files and directories to process
3838
USE_MDFILE_AS_MAINPAGE = ../README.md
3939
INPUT = ../README.md \
40+
end-user-gamepad-guide.md \
4041
usage.md \
4142
platform-support.md \
4243
windows-driver.md \

docs/end-user-gamepad-guide.md

Lines changed: 273 additions & 0 deletions
Large diffs are not rendered by default.

docs/platform-support.md

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,14 @@ Xbox One uses the native eight-byte PID payload exposed by the Windows Xbox HID
6868
stack. Xbox Series keeps the `0x045E:0x0B12` identity, release `0x0509`, and the
6969
`0x045E:0x0B12&IG_00` XInputHID match ID observed from physical Xbox Series USB
7070
and Xbox Wireless Adapter connections. The VHF device preserves the native
71-
17-byte GIP-shaped input report, including Share/Misc as button bit 12, and the
72-
native eight-byte four-motor rumble payload. Steam maps physical Xbox Series
73-
USB, Bluetooth, and Wireless Adapter transports through its Xbox HIDAPI path
74-
with Share as `misc1:b11`; the Windows VHF Xbox Series child does not follow that
75-
same consumer path or guarantee registration as an XInput slot. A Steam-visible
76-
Xbox Series Share button on Windows requires a non-VHF Xbox HIDAPI/GIP
77-
transport. The public Xbox Series profile remains `0x045E:0x0B12`; the Windows
78-
transport applies the captured release at device creation. Xbox One accepts
79-
native HID rumble writes. The Xbox Series report parser accepts the native
80-
eight-byte four-motor payload when a consumer delivers it, applies its
81-
actuator-enable mask and duration field, and reports the body motors as
82-
normalized low/high-frequency rumble and the independent trigger motors as
83-
trigger-rumble output.
71+
17-byte GIP-shaped input report and native eight-byte four-motor rumble payload.
72+
The public Xbox Series profile remains `0x045E:0x0B12`; the Windows transport
73+
applies the captured release at device creation. Xbox One accepts native HID
74+
rumble writes. The Xbox Series report parser accepts the native eight-byte
75+
four-motor payload when a consumer delivers it, applies its actuator-enable
76+
mask and duration field, and reports the body motors as normalized
77+
low/high-frequency rumble and the independent trigger motors as trigger-rumble
78+
output.
8479

8580
The VHF driver answers the calibration, pairing, and firmware feature reports
8681
used to initialize DualShock 4 and DualSense HIDAPI output. It also answers the

docs/todo.md

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,47 +4,6 @@ This page tracks known compatibility work that is larger than a small report
44
packing fix. Keep entries here until the repo has a validated implementation
55
path and consumer tests or manual validation prove the behavior.
66

7-
## Windows Xbox Series Share Button in Steam
8-
9-
Status: unresolved for the Windows VHF backend.
10-
11-
The Windows Xbox Series profile currently preserves the native 17-byte
12-
GIP-shaped input report, including Share/Misc as button bit 12, and uses the
13-
captured `VID_045E&PID_0B12` release `0x0509` identity. Browser HID testers can
14-
see the virtual HID device, but Steam's controller tester still does not expose
15-
the Share button.
16-
17-
The blocking issue is Steam's input path selection. Physical Xbox Series USB,
18-
Bluetooth, and Xbox Wireless Adapter controllers enter Steam's Xbox HIDAPI path
19-
and map Share as `misc1:b11`. The VHF-created Windows HID child is consumed
20-
through the Windows XInput path instead. XInput exposes the standard Xbox button
21-
set only and has no Share/Misc button. SDL's Xbox HIDAPI driver also rejects the
22-
Windows `\\?\HID#` fake endpoints used for XGIP controllers, so changing only
23-
the VHF HID descriptor cannot force Steam into the same path used by physical
24-
Xbox Series transports.
25-
26-
Proposed solution:
27-
28-
1. Add a separate Windows Xbox transport that is not a VHF HID child and can be
29-
accepted by Steam's Xbox HIDAPI/GIP path.
30-
2. Model the transport on captured physical Xbox Series USB, Bluetooth, and
31-
Xbox Wireless Adapter device trees, including the parent transport identity,
32-
interface class, compatible IDs, report initialization behavior, and output
33-
report routing.
34-
3. Keep the existing VHF Xbox Series path as the user-mode compatibility path
35-
until the new transport is implemented and validated.
36-
4. Validate with Steam controller logs and the Steam controller tester before
37-
claiming Share support. Required proof is a Steam mapping containing
38-
`misc1:b11` for the virtual device and working normal buttons, triggers,
39-
D-pad, Guide, and rumble.
40-
41-
Non-goals for this item:
42-
43-
- Do not add a kernel-mode driver to the normal C++ library.
44-
- Do not keep trying descriptor-only VHF remaps for Steam Share support.
45-
- Do not change the public platform-neutral profile API for a Windows-specific
46-
transport limitation.
47-
487
## Controller Capture Tooling
498

509
Status: proposed.

docs/usage.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
This page covers how consumers bring `libvirtualhid` into a CMake project and
44
which public API concepts they should build around.
55

6+
If you use Sunshine or another application that already embeds the library,
7+
see the [end-user gamepad guide](end-user-gamepad-guide.md) instead.
8+
69
## CMake Consumption
710

811
The library exports `libvirtualhid::libvirtualhid`.

docs/windows-driver.md

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -419,14 +419,9 @@ The built-in Xbox One profile uses its XboxGIP-shaped HID descriptor. The public
419419
Xbox Series profile remains `VID_045E&PID_0B12`; the Windows transport presents
420420
it with release `0x0509` and the `VID_045E&PID_0B12&IG_00` XInputHID match ID
421421
observed from physical Xbox Series USB and Xbox Wireless Adapter connections.
422-
The VHF child preserves the native 17-byte GIP-shaped input report, including
423-
Share/Misc as button bit 12, and the report parser accepts the native eight-byte
424-
four-motor Xbox payload when a consumer delivers it. Physical Xbox Series USB,
425-
Bluetooth, and Xbox Wireless Adapter transports register in Steam through the
426-
Xbox HIDAPI path with Share mapped as `misc1:b11`; the VHF child does not follow
427-
that same consumer path or guarantee registration as an XInput slot. A
428-
Steam-visible Xbox Series Share button on Windows requires a non-VHF Xbox
429-
HIDAPI/GIP transport. The Xbox 360 profile is rejected by the UMDF/VHF backend
422+
The VHF child preserves the native 17-byte GIP-shaped input report, and the
423+
report parser accepts the native eight-byte four-motor Xbox payload when a
424+
consumer delivers it. The Xbox 360 profile is rejected by the UMDF/VHF backend
430425
because a real Xbox 360 controller is an XUSB device rather than a VHF HID
431426
gamepad.
432427

@@ -446,12 +441,6 @@ label because VHF does not provide a product/manufacturer string callback.
446441

447442
### Current Release Limits
448443

449-
- Steam does not expose the Xbox Series Share button from the VHF child through
450-
the same Xbox HIDAPI path used by physical controllers. Supporting that path
451-
requires a non-VHF Xbox HIDAPI/GIP transport.
452-
- PlayStation and Nintendo rumble parsing is covered by protocol and installed
453-
driver tests, but has not yet completed broad validation with real client
454-
applications.
455444
- The published Windows driver installer is AMD64-only. Windows ARM64 release
456445
packages require a Microsoft dashboard signing path that is not part of the
457446
current Azure Trusted Signing workflow.

0 commit comments

Comments
 (0)