diff --git a/WhatsNew.txt b/WhatsNew.txt index 1e91ba8cb..53eae9532 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 4df6dc078..f57a165f0 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 a026f607b..27472054b 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 1dbf97285..c1d648ad8 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"); }