From 6a2e6c82a0764a00123447d93999ebe14d509aa8 Mon Sep 17 00:00:00 2001
From: Jade Macho <[EMAIL REDACTED]>
Date: Tue, 28 Jun 2022 21:03:16 +0200
Subject: [PATCH] Add SDL_HINT_DIRECTINPUT_ENABLED (on by default)
---
include/SDL_hints.h | 9 +++++++++
src/haptic/windows/SDL_dinputhaptic.c | 6 ++++++
src/joystick/windows/SDL_dinputjoystick.c | 11 +++++++++++
3 files changed, 26 insertions(+)
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index 78199823606..4a0e553ae3c 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 f10c369afea..2229c691665 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 da35ebb00f3..5122f0cae36 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 @@ EnumJoystickDetectCallback(LPCDIDEVICEINSTANCE pDeviceInstance, LPVOID pContext)
void
SDL_DINPUT_JoystickDetect(JoyStick_DeviceData **pContext)
{
+ if (dinput == NULL) {
+ return;
+ }
+
IDirectInput8_EnumDevices(dinput, DI8DEVCLASS_GAMECTRL, EnumJoystickDetectCallback, pContext, DIEDFL_ATTACHEDONLY);
}