protonscr

Joystick axes stuck at max - winebus uses signed HID range, breaks games using HidP_GetUsageValue (Arma Reforger 1874880)

protonclosed
ValveSoftware/Proton#9572 · opened 2026-03-14 by EchoTD · updated 2026-03-15 · 1 comments · github
EEchoTD 2026-03-14 github

Compatibility Report

  • Name of the game with compatibility issues: Arma Reforger
  • Steam AppID of the game: 1874880

System Information

I confirm:

  • [x] that I haven't found an existing compatibility report for this game.
  • [x] that I have checked whether there are updates for my system available.

Symptoms

Joystick analog axes (Logitech Extreme 3D Pro) are stuck at maximum value. Buttons work correctly. Affects any game that reads joystick axes via Raw Input API + HidP_GetUsageValue (Arma Reforger's Enfusion engine does this).

Root cause: dlls/winebus.sys/bus_sdl.c declares joystick axes with a signed HID logical range (-32768 to 32767) because that's SDL's native range. However, HidP_GetUsageValue returns a ULONG (unsigned) per Windows API spec. On real Windows hardware, joystick HID descriptors use unsigned logical ranges (e.g. 0-1023). When a game calls HidP_GetUsageValue on Wine's virtual HID device, small negative values near center (e.g. -97) are returned as large unsigned values (e.g. 0xFFFFFF9F for 32-bit or 0xFF9F
for 16-bit), appearing as max deflection.

Games using DirectInput are unaffected because dinput/joystick_hid.c handles signed→unsigned conversion internally via scale_axis_value(). Only games bypassing DirectInput and parsing HID reports directly (via RegisterRawInputDevices + GetRawInputData + HidP_GetUsageValue) are affected.

Two-line fix:

dlls/winebus.sys/bus_sdl.c (line 371) — change axis logical range to unsigned:

// FROM:
hid_device_add_axes(iface, 1, ..., FALSE, -32768, 32767)
// TO:
hid_device_add_axes(iface, 1, ..., FALSE, 0, 65535)

dlls/winebus.sys/hid.c in hid_device_set_abs_axis() — offset SDL signed values to unsigned:

// FROM:
return hid_device_set_axis(state, index, value);
// TO:
return hid_device_set_axis(state, index, value + 32768);

Reproduction

  1. Connect a non-Xbox joystick (e.g. Logitech Extreme 3D Pro)
  2. Launch Arma Reforger with any Proton version
  3. Configure joystick via custom .conf file (joystick0:axis0 etc.)
  4. Enter a helicopter — all analog axes are stuck at maximum deflection
  5. Buttons work normally

steam-1874880.log.gz

Kkisak-valve maintainer 2026-03-15 github

Hello @EchoTD, we're using one issue report per unofficially supported game title, so I've gone ahead and transferred this issue report to https://github.com/ValveSoftware/Proton/issues/5847#issuecomment-4061791859.

Proton versions

Upstream links