瀏覽代碼

Check for wine_get_version() to detect Wine/Proton

If this application is being run under Wine but Steam doesn't know that, Steam won't set STEAM_COMPAT_PROTON. So we'll use wine_get_version() to detect that we're running under Wine instead.

(cherry picked from commit e2e8f86076a815303836514bb4ba661a84532d24)
Sam Lantinga 1 月之前
父節點
當前提交
f36d683b61
共有 3 個文件被更改,包括 26 次插入1 次删除
  1. 18 0
      src/core/windows/SDL_windows.c
  2. 3 0
      src/core/windows/SDL_windows.h
  3. 5 1
      src/joystick/SDL_gamecontroller.c

+ 18 - 0
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__)

+ 3 - 0
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);
 

+ 5 - 1
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