Browse Source

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.
Cameron Gutman 3 years ago
parent
commit
6b64c47b69
1 changed files with 16 additions and 0 deletions
  1. 16 0
      src/haptic/windows/SDL_windowshaptic.c

+ 16 - 0
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;
 }