Continue running XInput detection while RAWINPUT is active This allows us to re-enable XInput correlation for RAWINPUT devices without reintroducing the controller shutdown bug for controllers using the wireless adapter in https://github.com/libsdl-org/SDL/issues/3468. Fixes https://github.com/libsdl-org/SDL/issues/7940 (cherry picked from commit a0a3957eb65e22721a124476072af0f6f5a7ca18)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
diff --git a/src/joystick/windows/SDL_rawinputjoystick.c b/src/joystick/windows/SDL_rawinputjoystick.c
index d0d5421..b0099e3 100644
--- a/src/joystick/windows/SDL_rawinputjoystick.c
+++ b/src/joystick/windows/SDL_rawinputjoystick.c
@@ -47,7 +47,7 @@
raw input will turn off the Xbox Series X controller when it is connected via the
Xbox One Wireless Adapter.
*/
-#if 0 /*def HAVE_XINPUT_H*/
+#ifdef HAVE_XINPUT_H
#define SDL_JOYSTICK_RAWINPUT_XINPUT
#endif
#ifdef HAVE_WINDOWS_GAMING_INPUT_H
diff --git a/src/joystick/windows/SDL_xinputjoystick.c b/src/joystick/windows/SDL_xinputjoystick.c
index 1cc8a2e..8d1a87f 100644
--- a/src/joystick/windows/SDL_xinputjoystick.c
+++ b/src/joystick/windows/SDL_xinputjoystick.c
@@ -235,6 +235,20 @@ static void AddXInputDevice(Uint8 userid, BYTE SubType, JoyStick_DeviceData **pC
JoyStick_DeviceData *pPrevJoystick = NULL;
JoyStick_DeviceData *pNewJoystick = *pContext;
+#ifdef SDL_JOYSTICK_RAWINPUT
+ if (RAWINPUT_IsEnabled()) {
+ /* The raw input driver handles more than 4 controllers, so prefer that when available */
+ /* We do this check here rather than at the top of SDL_XINPUT_JoystickDetect() because
+ we need to check XInput state before RAWINPUT gets a hold of the device, otherwise
+ when a controller is connected via the wireless adapter, it will shut down at the
+ first subsequent XInput call. This seems like a driver stack bug?
+
+ Reference: https://github.com/libsdl-org/SDL/issues/3468
+ */
+ return;
+ }
+#endif
+
if (SDL_XInputUseOldJoystickMapping() && SubType != XINPUT_DEVSUBTYPE_GAMEPAD) {
return;
}
@@ -322,13 +336,6 @@ void SDL_XINPUT_JoystickDetect(JoyStick_DeviceData **pContext)
return;
}
-#ifdef SDL_JOYSTICK_RAWINPUT
- if (RAWINPUT_IsEnabled()) {
- /* The raw input driver handles more than 4 controllers, so prefer that when available */
- return;
- }
-#endif
-
/* iterate in reverse, so these are in the final list in ascending numeric order. */
for (iuserid = XUSER_MAX_COUNT - 1; iuserid >= 0; iuserid--) {
const Uint8 userid = (Uint8)iuserid;