LizardByte / LizardByte/libvirtualhid

Linux: Firefox exposes reserved Xbox Series buttons and swaps X/Y

未关闭
#83 0 条评论 0 个 reaction 已指派 1 人 在 GitHub 查看

@LizardByte-bot 已经在做这个了。

开始于 2026年8月15日。

主要语言
C++
星标
54
派生
15
平均合并
11 小时 32 分钟
30 天内合并 PR
34

描述

Environment

  • Host OS: Linux
  • Virtual controller provider: libvirtualhid through Sunshine
  • Profile: Xbox Series
  • Browser: Firefox
  • Reported identity: 045e-0b13-Sunshine (libvirtualhid) X-Box Series Controller
  • Tester: https://app.lizardbyte.dev/gamepad-tester/

Observed behavior

  • Firefox exposes 20 buttons.
  • B17 is the Share button and is now labeled correctly by gamepad-helper.
  • B18 and B19 remain visible but do not represent real Xbox Series controls.
  • The physical X and Y buttons are swapped.
  • Chromium exposes only B17 beyond the standard buttons and reports X/Y correctly.

Source-level explanation

The Linux uinput backend advertises KEY_RECORD for Share and also advertises reserved BTN_C and BTN_Z capabilities to preserve sparse Xbox button slots. Firefox starts with 17 canonical buttons and then appends every advertised nonstandard key capability, producing:

  • B17: KEY_RECORD
  • B18: reserved BTN_C
  • B19: reserved BTN_Z

Firefox only applies its Xbox-specific BTN_NORTH/BTN_WEST correction when an ancestor driver is named xpad or microsoft. A uinput-created virtual controller does not have either driver ancestry despite using Microsoft VID/PID.

Firefox source:
https://searchfox.org/firefox-main/source/dom/gamepad/linux/LinuxGamepad.cpp

Expected behavior

  • Firefox exposes the standard 17 buttons plus Share at B17.
  • No phantom B18/B19 controls are presented.
  • X and Y match the physical Xbox layout.

Constraints

Steam currently handles this virtual Xbox Series controller correctly and is the priority consumer. Do not remove reserved capabilities or swap emitted X/Y without validating Steam and Chromium. Keep any compatibility change Linux-specific and avoid changing the Windows backend.

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。