From 3a654b4b1cc687c575882f68cdee60b335529157 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sat, 8 Jul 2023 09:32:24 -0700
Subject: [PATCH] Added the hint SDL_HINT_JOYSTICK_WGI to control whether to
use Windows.Gaming.Input for controllers
---
WhatsNew.txt | 3 ++-
include/SDL3/SDL_hints.h | 9 +++++++++
src/joystick/windows/SDL_rawinputjoystick.c | 12 ++++++++----
src/joystick/windows/SDL_windows_gaming_input.c | 4 ++++
4 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/WhatsNew.txt b/WhatsNew.txt
index 1e91ba8cb71a..53eae9532009 100644
--- a/WhatsNew.txt
+++ b/WhatsNew.txt
@@ -29,4 +29,5 @@ General:
* Added SDL_GetRenderVSync() to get vsync of the given renderer
* Added SDL_PlayAudioDevice() to start audio playback
* Added SDL_ConvertAudioSamples() to convert audio samples from one format to another
-* Added SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY hint to control re-creation of Android SDL activity.
+* Added the hint SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY to control re-creation of Android SDL activity.
+* Added the hint SDL_HINT_JOYSTICK_WGI to control whether to use Windows.Gaming.Input for controllers
diff --git a/include/SDL3/SDL_hints.h b/include/SDL3/SDL_hints.h
index 4df6dc07865e..f57a165f001e 100644
--- a/include/SDL3/SDL_hints.h
+++ b/include/SDL3/SDL_hints.h
@@ -1043,6 +1043,15 @@ extern "C" {
*/
#define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD"
+/**
+ * \brief A variable controlling whether Windows.Gaming.Input should be used for controller handling.
+ *
+ * This variable can be set to the following values:
+ * "0" - WGI is not used
+ * "1" - WGI is used (the default)
+ */
+#define SDL_HINT_JOYSTICK_WGI "SDL_JOYSTICK_WGI"
+
/**
* \brief Determines whether SDL enforces that DRM master is required in order
* to initialize the KMSDRM video backend.
diff --git a/src/joystick/windows/SDL_rawinputjoystick.c b/src/joystick/windows/SDL_rawinputjoystick.c
index a026f607bbe5..27472054b54e 100644
--- a/src/joystick/windows/SDL_rawinputjoystick.c
+++ b/src/joystick/windows/SDL_rawinputjoystick.c
@@ -559,6 +559,10 @@ static int RAWINPUT_UpdateWindowsGamingInput()
}
static void RAWINPUT_InitWindowsGamingInput(RAWINPUT_DeviceContext *ctx)
{
+ if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_WGI, SDL_TRUE)) {
+ return;
+ }
+
wgi_state.need_device_list_update = SDL_TRUE;
wgi_state.ref_count++;
if (!wgi_state.initialized) {
@@ -874,12 +878,12 @@ static int RAWINPUT_JoystickInit(void)
{
SDL_assert(!SDL_RAWINPUT_inited);
- if (!WIN_IsWindowsVistaOrGreater()) {
- /* According to bug 6400, this doesn't work on Windows XP */
- return -1;
+ if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_RAWINPUT, SDL_TRUE)) {
+ return 0;
}
- if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_RAWINPUT, SDL_TRUE)) {
+ if (!WIN_IsWindowsVistaOrGreater()) {
+ /* According to bug 6400, this doesn't work on Windows XP */
return -1;
}
diff --git a/src/joystick/windows/SDL_windows_gaming_input.c b/src/joystick/windows/SDL_windows_gaming_input.c
index 1dbf9728538a..c1d648ad88f5 100644
--- a/src/joystick/windows/SDL_windows_gaming_input.c
+++ b/src/joystick/windows/SDL_windows_gaming_input.c
@@ -593,6 +593,10 @@ static int WGI_JoystickInit(void)
{
HRESULT hr;
+ if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_WGI, SDL_TRUE)) {
+ return 0;
+ }
+
if (FAILED(WIN_RoInitialize())) {
return SDL_SetError("RoInitialize() failed");
}