Skip to content

Remove xinput.yml - #348

Open
Arcitec wants to merge 1 commit into
bottlesdevs:mainfrom
Arcitec:remove-xinput
Open

Remove xinput.yml#348
Arcitec wants to merge 1 commit into
bottlesdevs:mainfrom
Arcitec:remove-xinput

Conversation

@Arcitec

@Arcitec Arcitec commented Sep 13, 2026

Copy link
Copy Markdown

It does not actually solve anything and only creates problems. In most (all?) cases, installing these DLLs on modern Wine actually breaks the controller support. Having it in the list confuses users and leads to a worse game compatibility experience.

All of the XInput DLLs are already fully implemented by Wine since Wine 3.2 (February 2018), which uses native Linux SDL2 as a backend for excellent controller detection and support.

The old Microsoft DLLs from the DirectX 2010 runtime were a buggy workaround which was only necessary before Wine added its own, native controller support. Installing these old DLLs on a modern Wine version just reduces compatibility and breaks controller support.

Type of change

  • New dependency
  • Manifest fix
  • Other

Was this tested using a local repository?

  • Yes
  • No

@Arcitec

Arcitec commented Sep 13, 2026

Copy link
Copy Markdown
Author

To be even clearer: Wine already contains bundled, Linux-native implementations of every XInput DLL file and all their APIs.

Wine's XInput detects and maps buttons via SDL2 which contains built-in mappings for pretty much every controller in the world (and most third-party controllers these days emulate/pretend to be a Microsoft gamepad on this list, so the list of supported controllers is way bigger than this):

https://github.com/libsdl-org/SDL/blob/main/src/joystick/controller_list.h

In contrast, the old Microsoft DLLs do NOT work well on Linux, and installing them on modern Wine completely breaks gamepad support for most people, since it doesn't support most gamepads. Those old DLLs don't even support Microsoft's own, newer controllers anymore. They were just an evil workaround people used 8+ years ago.

To diagnose gamepads in Bottles:

  • Open Tools: Legacy Wine Tools: Control Panel.
  • Click on "Game Controllers".
  • Look at the DInput (legacy protocol) and XInput (modern protocol) tabs and check if your gamepads are working.

Installing the outdated xinput hack DLLs just breaks the gamepad xinput1_X.dll APIs and you no longer get any controller input in Wine/Proton at all.

There is no way to uninstall dependencies in Bottles, but the simplest way to "unbrick" a bottle that has been messed up by xinput is to go to "Tools: Legacy Wine Tools: Configuration", then the "Libraries" tab, and deleting every "xinput" entry in the list so that Wine's built-ins are used again.

PS: If a gamepad doesn't work in Bottles, it's almost always because the game was written for Steam Input (steam_api[64].dll). Adding the game as a "Non-Steam Game" in Steam solves that issue. Or just buying it on Steam, as the developer intended. Wink.

It does not actually solve anything and only creates problems. In most (all?) cases, installing these DLLs on modern Wine actually *breaks* the controller support. Having it in the list confuses users and leads to a worse game compatibility experience.

All of the Xinput DLLs are already fully implemented by Wine since Wine 3.2 (February 2018), which uses native Linux SDL2 as a backend for excellent controller detection and support.

The old Microsoft DLLs from the DirectX 2010 runtime were a buggy workaround which was only necessary before Wine added its own, native controller support. Installing these old DLLs on a modern Wine version just reduces compatibility and breaks controller support.
@Arcitec

Arcitec commented Sep 13, 2026

Copy link
Copy Markdown
Author

The Wine control panel uses the actual XInput APIs to query controllers, so users and testers can see in real-time the negative effects of these DLLs.

For example, I have the newest Xbox controller (the 2020 "Series X|S" controller). Installing xinput completely breaks it.

With the ancient xinput Microsoft DLLs:

image

Without them (just native Wine Linux reimplementations):

image

@Arcitec

Arcitec commented Sep 13, 2026

Copy link
Copy Markdown
Author

Just to add some Google SEO to this ticket so that people can find it in the future, I'll also mention that people should NEVER install any of the other ancient workarounds.

Do NOT install:

  • xinput (see above)
  • dumbxinputemu: Maps XInput APIs to DirectInput APIs, which used to be the only APIs supported by ancient Wine. This is completely pointless nowadays and just leads to incorrect button mappings (at best).
  • x360ce: An old Windows tool that emulates XInput for DirectInput controllers with configurable button mappings. Absolutely pointless these days.
  • koku-xinput-wine: An old project which added XInput-to-SDL2 API translation to Wine. This is exactly what Wine does natively out of the box nowadays. But Wine's implementation is far more evolved and has perfect button mappings.

@Arcitec

Arcitec commented Sep 13, 2026

Copy link
Copy Markdown
Author

I'll add a special note about advanced controllers (Sony Playstation, Nintendo Switch, etc):

  • They have a lot of extra features (touchpads, microphones, gyroscope sensors, audio-channel based haptics (vibration) and stuff like that). If those controllers are mapped via SDL2, those extra features don't work.
  • So to fully support the advanced controller features, Wine 8 (and newer) behaves exactly like Windows: Advanced controllers are not mapped to XInput (SDL2), and are instead exposed as raw USB devices (hidraw) so that games that support Playstation/Nintendo controllers can use all features.
  • However, for games that DON'T support Playstation/Nintendo controllers, Wine offers a way to force them to act as XInput (SDL2) gamepads instead.
  • To force advanced controllers to use XInput, do the following:
    • Open Tools: Legacy Wine Tools: Control Panel.
    • Click on "Game Controllers".
    • On the "Joysticks" tab, look at the Advanced settings.
    • Enable the Disable hidraw checkbox. This turns advanced controllers into XInput. (And keep Enable SDL enabled, since that's the XInput-to-SDL2 mapping feature.)

This process may be common enough that Bottles could/should have a "Settings: Compatibility: Controller Compatibility" section with a checkbox for "Universal XInput mode". I'll open a feature request and link it to this message.

Edit: Ticket at bottlesdevs/Bottles#4822

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant