Repository navigation
fix(macos): let GameController decode virtual Xbox controllers - #208
ReenigneArcher merged 2 commits into
Conversation
ReenigneArcher
left a comment
There was a problem hiding this comment.
The behavior checks passed; the remaining correction is the test include order, which fails the required formatter check.
Verified locally on macOS: library and example builds; 132 unit tests passed and 2 Linux-only tests skipped (diagnostic tools disabled); both Xbox profiles passed gamepad_adapter; a temporary GameController consumer verified face/shoulder/Menu/View/stick-click buttons, D-pad, both sticks, triggers, and device removal against the installed signed broker. The consumer disabled its system gesture handling to observe button states directly. git diff --check passed. Steam was not retested.
Hosted verification remains limited: Actions await maintainer approval, and the GH-Pages Read the Docs status reports failure but its build log was inaccessible. Neither is a code finding. The current head is mergeable against master.
Review completed by Codex | Model: gpt-6.1-sol | Thinking: xhigh
|
Please update the PR description to use the full LizardByte pull request template. Keep the existing description and testing details, and complete the applicable Type of Change, Checklist, and AI Usage fields. Preserve all template sections and comments; sections that do not apply may remain empty and their boxes unchecked. Review completed by Codex | Model: gpt-6.1-sol | Thinking: xhigh |
The macOS Xbox One/Series transport only sent wired GIP report 0x20, which Steam reads but Apple's GameController framework ignores, so streamed Xbox pads appeared with no inputs. Declare the Xbox Bluetooth gamepad collection alongside the GIP vendor collection and send a compact Bluetooth report 0x01 before each GIP report. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3f9afdb to
b1531cc
Compare
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #208 +/- ##
========================================
Coverage 73.67% 73.67%
========================================
Files 44 44
Lines 10686 10705 +19
Branches 3646 3651 +5
========================================
+ Hits 7873 7887 +14
- Misses 2212 2424 +212
+ Partials 601 394 -207
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 12 files with indirect coverage changes Continue to review full report in Codecov by Harness.
|



Description
On macOS, virtual Xbox One/Series gamepads (045e:0b13 / 0b20) only sent wired GIP input report
0x20. Steam decodes it, but Apple's GameController framework ignores it: the controller shows up with no inputs. This affected Sunshine streams from Moonlight with the Xbox gamepad type; the DualSense profile worked.Changes:
macos_xbox_transport.hpp: the descriptor now declares the Xbox Bluetooth gamepad collection (report0x01, plus its0x03rumble output) followed by the existing GIP vendor collection (0x20input,0x09output). Newxbox_bluetooth_transport_input_report()builds report0x01in the compact firmware-5 button order GameController expects (A, B, X, Y, LB, RB, View, Menu / LS, RS), zero-padded to the broker's fixed 25-byte input size.macos_broker_client.cpp: Xbox One/Series submissions send the Bluetooth report, then the GIP report. Client-only change; the protocol and the installed broker are unchanged.Notes for reviewers:
Screenshot
Issues Fixed or Closed
Roadmap Issues
Testing
XboxBluetoothTransportUsesCompactGameControllerLayoutandXboxBluetoothTransportCopiesAxesAndHat, and extendedXboxOneAndSeriesUseDistinctIdentitiesAndGipInputto require report IDs0x01,0x03,0x09and0x20in the descriptor (the0x01check fails without the fix).clang-format --dry-run --Werror(23.1.0) passes on the changed files.xbox_seriesandxbox_one:Type of Change
Checklist
AI Usage
See our AI usage policy.
Claude Code diagnosed the issue with HID and GameController monitors, implemented the fix and tests, and ran the end-to-end harness; Steam behaviour was checked by hand.
🤖 Generated with Claude Code