Prefer using XInput for rumble over WGI, as it allows rumble in the background (cherry picked from commit e16a83d393ae1784040519f42c482e2641b971a2)
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
diff --git a/src/joystick/windows/SDL_rawinputjoystick.c b/src/joystick/windows/SDL_rawinputjoystick.c
index b0099e3..9aa264f 100644
--- a/src/joystick/windows/SDL_rawinputjoystick.c
+++ b/src/joystick/windows/SDL_rawinputjoystick.c
@@ -1281,20 +1281,8 @@ static int RAWINPUT_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_
#endif
SDL_bool rumbled = SDL_FALSE;
-#ifdef SDL_JOYSTICK_RAWINPUT_WGI
- if (!rumbled && ctx->wgi_correlated) {
- WindowsGamingInputGamepadState *gamepad_state = ctx->wgi_slot;
- HRESULT hr;
- gamepad_state->vibration.LeftMotor = (DOUBLE)low_frequency_rumble / SDL_MAX_UINT16;
- gamepad_state->vibration.RightMotor = (DOUBLE)high_frequency_rumble / SDL_MAX_UINT16;
- hr = __x_ABI_CWindows_CGaming_CInput_CIGamepad_put_Vibration(gamepad_state->gamepad, gamepad_state->vibration);
- if (SUCCEEDED(hr)) {
- rumbled = SDL_TRUE;
- }
- }
-#endif
-
#ifdef SDL_JOYSTICK_RAWINPUT_XINPUT
+ /* Prefer XInput over WGI because it allows rumble in the background */
if (!rumbled && ctx->xinput_correlated) {
XINPUT_VIBRATION XVibration;
@@ -1312,6 +1300,19 @@ static int RAWINPUT_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_
}
#endif /* SDL_JOYSTICK_RAWINPUT_XINPUT */
+#ifdef SDL_JOYSTICK_RAWINPUT_WGI
+ if (!rumbled && ctx->wgi_correlated) {
+ WindowsGamingInputGamepadState *gamepad_state = ctx->wgi_slot;
+ HRESULT hr;
+ gamepad_state->vibration.LeftMotor = (DOUBLE)low_frequency_rumble / SDL_MAX_UINT16;
+ gamepad_state->vibration.RightMotor = (DOUBLE)high_frequency_rumble / SDL_MAX_UINT16;
+ hr = __x_ABI_CWindows_CGaming_CInput_CIGamepad_put_Vibration(gamepad_state->gamepad, gamepad_state->vibration);
+ if (SUCCEEDED(hr)) {
+ rumbled = SDL_TRUE;
+ }
+ }
+#endif
+
if (!rumbled) {
#if defined(SDL_JOYSTICK_RAWINPUT_WGI) || defined(SDL_JOYSTICK_RAWINPUT_XINPUT)
return SDL_SetError("Controller isn't correlated yet, try hitting a button first");