diff --git a/src/core/windows/SDL_windows.c b/src/core/windows/SDL_windows.c index c4e760be33..ee730b8c2b 100644 --- a/src/core/windows/SDL_windows.c +++ b/src/core/windows/SDL_windows.c @@ -199,6 +199,24 @@ static BOOL IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WO } #endif +BOOL WIN_IsWine(void) +{ + static SDL_bool checked; + static SDL_bool is_wine; + + if (!checked) { + HMODULE ntdll = LoadLibrary(TEXT("ntdll.dll")); + if (ntdll) { + if (GetProcAddress(ntdll, "wine_get_version") != NULL) { + is_wine = SDL_TRUE; + } + FreeLibrary(ntdll); + } + checked = SDL_TRUE; + } + return is_wine; +} + BOOL WIN_IsWindowsVistaOrGreater(void) { #if defined(__WINRT__) || defined(__XBOXONE__) || defined(__XBOXSERIES__) diff --git a/src/core/windows/SDL_windows.h b/src/core/windows/SDL_windows.h index 33581a95a6..997c0ab4ac 100644 --- a/src/core/windows/SDL_windows.h +++ b/src/core/windows/SDL_windows.h @@ -136,6 +136,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 SDL_TRUE if we're running on Windows Vista and newer */ extern BOOL WIN_IsWindowsVistaOrGreater(void); diff --git a/src/joystick/SDL_gamecontroller.c b/src/joystick/SDL_gamecontroller.c index adc8dd3e88..146dc332b4 100644 --- a/src/joystick/SDL_gamecontroller.c +++ b/src/joystick/SDL_gamecontroller.c @@ -37,6 +37,10 @@ #include "../events/SDL_events_c.h" #endif +#if defined(__WIN32__) +#include "../core/windows/SDL_windows.h" +#endif + #if defined(__ANDROID__) #include "SDL_system.h" #endif @@ -2130,7 +2134,7 @@ SDL_bool SDL_ShouldIgnoreGameController(const char *name, SDL_JoystickGUID guid) #ifdef __WIN32__ if (SDL_GetHintBoolean("SDL_GAMECONTROLLER_ALLOW_STEAM_VIRTUAL_GAMEPAD", SDL_FALSE) && - SDL_GetHintBoolean("STEAM_COMPAT_PROTON", SDL_FALSE)) { + WIN_IsWine()) { /* We are launched by Steam and running under Proton * We can't tell whether this controller is a Steam Virtual Gamepad, * so assume that Proton is doing the appropriate filtering of controllers