From b8582428233349de477c2c2adef2955808789c28 Mon Sep 17 00:00:00 2001 From: Sam Lantinga 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 (cherry picked from commit a6228e7aafb66075fe8f4aaf411314fc92340499) --- WhatsNew.txt | 7 +++++++ include/SDL_hints.h | 9 +++++++++ src/joystick/windows/SDL_rawinputjoystick.c | 12 ++++++++---- src/joystick/windows/SDL_windows_gaming_input.c | 4 ++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/WhatsNew.txt b/WhatsNew.txt index a5636ed83a9fa..1d7c27e20a2d5 100644 --- a/WhatsNew.txt +++ b/WhatsNew.txt @@ -1,6 +1,13 @@ This is a list of major changes in SDL's version history. +--------------------------------------------------------------------------- +2.28.2: +--------------------------------------------------------------------------- +General: +* Added the hint SDL_HINT_JOYSTICK_WGI to control whether to use Windows.Gaming.Input for controllers + + --------------------------------------------------------------------------- 2.28.0: --------------------------------------------------------------------------- diff --git a/include/SDL_hints.h b/include/SDL_hints.h index ad3b4030bf461..c808a60db562e 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -1007,6 +1007,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 9aa264f330720..b6f8a5edb5fcf 100644 --- a/src/joystick/windows/SDL_rawinputjoystick.c +++ b/src/joystick/windows/SDL_rawinputjoystick.c @@ -564,6 +564,10 @@ static void 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) { @@ -879,12 +883,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 f9e7e42047732..218c0fb73e8d7 100644 --- a/src/joystick/windows/SDL_windows_gaming_input.c +++ b/src/joystick/windows/SDL_windows_gaming_input.c @@ -483,6 +483,10 @@ static int WGI_JoystickInit(void) RoGetActivationFactory_t RoGetActivationFactoryFunc = NULL; HRESULT hr; + if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_WGI, SDL_TRUE)) { + return 0; + } + if (FAILED(WIN_RoInitialize())) { return SDL_SetError("RoInitialize() failed"); }