diff --git a/src/core/windows/SDL_windows.c b/src/core/windows/SDL_windows.c index 163635adcc..cf53c3c72d 100644 --- a/src/core/windows/SDL_windows.c +++ b/src/core/windows/SDL_windows.c @@ -270,6 +270,24 @@ static BOOL IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WO return result; #endif +BOOL WIN_IsWine(void) +{ + static bool checked; + static bool is_wine; + + if (!checked) { + HMODULE ntdll = LoadLibrary(TEXT("ntdll.dll")); + if (ntdll) { + if (GetProcAddress(ntdll, "wine_get_version") != NULL) { + is_wine = true; + } + FreeLibrary(ntdll); + } + checked = true; + } + return is_wine; +} + // this is the oldest thing we run on (and we may lose support for this in SDL3 at any time!), // so there's no "OrGreater" as that would always be TRUE. The other functions are here to // ask "can we support a specific feature?" but this function is here to ask "do we need to do diff --git a/src/core/windows/SDL_windows.h b/src/core/windows/SDL_windows.h index ef54fe379e..fa405ade1a 100644 --- a/src/core/windows/SDL_windows.h +++ b/src/core/windows/SDL_windows.h @@ -133,6 +133,9 @@ extern void WIN_CoUninitialize(void); extern HRESULT WIN_RoInitialize(void); extern void WIN_RoUninitialize(void); +// Returns true if we're running on Wine +extern BOOL WIN_IsWine(void); + // Returns true if we're running on Windows XP (any service pack). DOES NOT CHECK XP "OR GREATER"! extern BOOL WIN_IsWindowsXP(void); diff --git a/src/joystick/SDL_gamepad.c b/src/joystick/SDL_gamepad.c index 97987ac449..6a2dd4ad7b 100644 --- a/src/joystick/SDL_gamepad.c +++ b/src/joystick/SDL_gamepad.c @@ -32,10 +32,11 @@ #include "hidapi/SDL_hidapi_nintendo.h" #include "../events/SDL_events_c.h" - -#ifdef SDL_PLATFORM_ANDROID +#ifdef SDL_PLATFORM_WIN32 +#include "../core/windows/SDL_windows.h" #endif + // Many gamepads turn the center button into an instantaneous button press #define SDL_MINIMUM_GUIDE_BUTTON_DELAY_MS 250 @@ -2737,10 +2738,10 @@ bool SDL_ShouldIgnoreGamepad(Uint16 vendor_id, Uint16 product_id, Uint16 version #ifdef SDL_PLATFORM_WIN32 if (SDL_GetHintBoolean("SDL_GAMECONTROLLER_ALLOW_STEAM_VIRTUAL_GAMEPAD", false) && - SDL_GetHintBoolean("STEAM_COMPAT_PROTON", false)) { - // We are launched by Steam and running under Proton + WIN_IsWine()) { + // We are launched by Steam and running under Proton or Wine // We can't tell whether this controller is a Steam Virtual Gamepad, - // so assume that Proton is doing the appropriate filtering of controllers + // so assume that is doing the appropriate filtering of controllers // and anything we see here is fine to use. return false; }