Browse Source

Add SDL_HINT_DIRECTINPUT_ENABLED (on by default)

Jade Macho 2 years ago
parent
commit
6a2e6c82a0

+ 9 - 0
include/SDL_hints.h

@@ -2001,6 +2001,15 @@ extern "C" {
  */
 #define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED"
 
+ /**
+  *  \brief  A variable that lets you disable the detection and use of DirectInput gamepad devices
+  *
+  *  The variable can be set to the following values:
+  *    "0"       - Disable DirectInput detection (only uses XInput)
+  *    "1"       - Enable DirectInput detection (the default)
+  */
+#define SDL_HINT_DIRECTINPUT_ENABLED "SDL_DIRECTINPUT_ENABLED"
+
 /**
  *  \brief  A variable that causes SDL to use the old axis and button mapping for XInput devices.
  *

+ 6 - 0
src/haptic/windows/SDL_dinputhaptic.c

@@ -27,6 +27,7 @@
 
 #if SDL_HAPTIC_DINPUT
 
+#include "SDL_hints.h"
 #include "SDL_stdinc.h"
 #include "SDL_timer.h"
 #include "SDL_windowshaptic_c.h"
@@ -77,6 +78,11 @@ SDL_DINPUT_HapticInit(void)
         return SDL_SetError("Haptic: SubSystem already open.");
     }
 
+    if (!SDL_GetHintBoolean(SDL_HINT_DIRECTINPUT_ENABLED, SDL_TRUE)) {
+        /* In some environments, IDirectInput8_Initialize / _EnumDevices can take a minute even with no controllers. */
+        return 0;
+    }
+
     ret = WIN_CoInitialize();
     if (FAILED(ret)) {
         return DI_SetError("Coinitialize", ret);

+ 11 - 0
src/joystick/windows/SDL_dinputjoystick.c

@@ -24,6 +24,7 @@
 
 #if SDL_JOYSTICK_DINPUT
 
+#include "SDL_hints.h"
 #include "SDL_windowsjoystick_c.h"
 #include "SDL_dinputjoystick_c.h"
 #include "SDL_rawinputjoystick_c.h"
@@ -397,6 +398,12 @@ SDL_DINPUT_JoystickInit(void)
     HRESULT result;
     HINSTANCE instance;
 
+    if (!SDL_GetHintBoolean(SDL_HINT_DIRECTINPUT_ENABLED, SDL_TRUE)) {
+        /* In some environments, IDirectInput8_Initialize / _EnumDevices can take a minute even with no controllers. */
+        dinput = NULL;
+        return 0;
+    }
+
     result = WIN_CoInitialize();
     if (FAILED(result)) {
         return SetDIerror("CoInitialize", result);
@@ -539,6 +546,10 @@ err:
 void
 SDL_DINPUT_JoystickDetect(JoyStick_DeviceData **pContext)
 {
+    if (dinput == NULL) {
+        return;
+    }
+
     IDirectInput8_EnumDevices(dinput, DI8DEVCLASS_GAMECTRL, EnumJoystickDetectCallback, pContext, DIEDFL_ATTACHEDONLY);
 }