Просмотр исходного кода

Added SDL_HINT_JOYSTICK_GAMEINPUT

Sam Lantinga 8 месяцев назад
Родитель
Сommit
c2085dad8f
2 измененных файлов с 30 добавлено и 12 удалено
  1. 15 0
      include/SDL3/SDL_hints.h
  2. 15 12
      src/joystick/gdk/SDL_gameinputjoystick.c

+ 15 - 0
include/SDL3/SDL_hints.h

@@ -1226,6 +1226,21 @@ extern "C" {
  */
 #define SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED "SDL_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED"
 
+/**
+ * A variable controlling whether GameInput should be used for
+ * controller handling on Windows.
+ *
+ * The variable can be set to the following values:
+ *
+ * - "0": GameInput is not used.
+ * - "1": GameInput is used. (default)
+ *
+ * This hint should be set before SDL is initialized.
+ *
+ * \since This hint is available since SDL 3.0.0.
+ */
+#define SDL_HINT_JOYSTICK_GAMEINPUT "SDL_JOYSTICK_GAMEINPUT"
+
 /**
  * A variable containing a list of devices known to have a GameCube form
  * factor.

+ 15 - 12
src/joystick/gdk/SDL_gameinputjoystick.c

@@ -234,6 +234,10 @@ static int GAMEINPUT_JoystickInit(void)
 {
     HRESULT hR;
 
+    if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_GAMEINPUT, SDL_TRUE)) {
+        return 0;
+    }
+
     if (!g_hGameInputDLL) {
         g_hGameInputDLL = SDL_LoadObject("gameinput.dll");
         if (!g_hGameInputDLL) {
@@ -310,22 +314,21 @@ static void GAMEINPUT_JoystickDetect(void)
 
 static SDL_bool GAMEINPUT_JoystickIsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, const char *name)
 {
-    int idx = 0;
-    GAMEINPUT_InternalDevice *elem = NULL;
-
     SDL_AssertJoysticksLocked();
 
-    if (vendor_id == USB_VENDOR_MICROSOFT &&
-        product_id == USB_PRODUCT_XBOX_ONE_XBOXGIP_CONTROLLER) {
-        /* The Xbox One controller shows up as a hardcoded raw input VID/PID, which we definitely handle */
-        return SDL_TRUE;
-    }
-
-    for (idx = 0; idx < g_GameInputList.count; ++idx) {
-        elem = g_GameInputList.devices[idx];
-        if (elem && vendor_id == elem->info->vendorId && product_id == elem->info->productId) {
+    if (g_pGameInput) {
+        if (vendor_id == USB_VENDOR_MICROSOFT &&
+            product_id == USB_PRODUCT_XBOX_ONE_XBOXGIP_CONTROLLER) {
+            /* The Xbox One controller shows up as a hardcoded raw input VID/PID, which we definitely handle */
             return SDL_TRUE;
         }
+
+        for (int i = 0; i < g_GameInputList.count; ++i) {
+            GAMEINPUT_InternalDevice *elem = g_GameInputList.devices[i];
+            if (elem && vendor_id == elem->info->vendorId && product_id == elem->info->productId) {
+                return SDL_TRUE;
+            }
+        }
     }
     return SDL_FALSE;
 }