diff --git a/include/SDL_hints.h b/include/SDL_hints.h index 781998236..4a0e553ae 100644 --- a/include/SDL_hints.h +++ b/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. * diff --git a/src/haptic/windows/SDL_dinputhaptic.c b/src/haptic/windows/SDL_dinputhaptic.c index f10c369af..2229c6916 100644 --- a/src/haptic/windows/SDL_dinputhaptic.c +++ b/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); diff --git a/src/joystick/windows/SDL_dinputjoystick.c b/src/joystick/windows/SDL_dinputjoystick.c index da35ebb00..5122f0cae 100644 --- a/src/joystick/windows/SDL_dinputjoystick.c +++ b/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); }