From 6b64c47b69f2cb609668b919812c2ce3baf921be Mon Sep 17 00:00:00 2001
From: Cameron Gutman <[EMAIL REDACTED]>
Date: Tue, 9 Nov 2021 23:45:32 -0600
Subject: [PATCH] haptics: Enumerate XInput/DInput joysticks after haptic init
Since the haptic subsystem is usually initialized after the joystick subsystem,
the initial calls to HapticMaybeAddDevice() from inside SDL_JoystickInit() will
arrive too early to be handled by the haptic subsystem. We need to add those
haptic devices for those already present joysticks ourselves.
---
src/haptic/windows/SDL_windowshaptic.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/src/haptic/windows/SDL_windowshaptic.c b/src/haptic/windows/SDL_windowshaptic.c
index 4cc442a4e5..46b9250e61 100644
--- a/src/haptic/windows/SDL_windowshaptic.c
+++ b/src/haptic/windows/SDL_windowshaptic.c
@@ -52,12 +52,28 @@ static int numhaptics = 0;
int
SDL_SYS_HapticInit(void)
{
+ JoyStick_DeviceData* device;
+
if (SDL_DINPUT_HapticInit() < 0) {
return -1;
}
if (SDL_XINPUT_HapticInit() < 0) {
return -1;
}
+
+ /* The joystick subsystem will usually be initialized before haptics,
+ * so the initial HapticMaybeAddDevice() calls from the joystick
+ * subsystem will arrive too early to create haptic devices. We will
+ * invoke those callbacks again here to pick up any joysticks that
+ * were added prior to haptics initialization. */
+ for (device = SYS_Joystick; device; device = device->pNext) {
+ if (device->bXInputDevice) {
+ SDL_XINPUT_HapticMaybeAddDevice(device->XInputUserId);
+ } else {
+ SDL_DINPUT_HapticMaybeAddDevice(&device->dxdevice);
+ }
+ }
+
return numhaptics;
}