SDL: Back out Steam virtual gamepad changes

From 34eb24ebc4f140b91aecc38701ee549c377f9eca Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sun, 10 Dec 2023 08:35:35 -0800
Subject: [PATCH] Back out Steam virtual gamepad changes

We are planning a different approach to handle these
---
 src/joystick/linux/SDL_sysjoystick.c | 131 ++++-----------------------
 1 file changed, 17 insertions(+), 114 deletions(-)

diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c
index 965e5f415af0..9b8a85f26678 100644
--- a/src/joystick/linux/SDL_sysjoystick.c
+++ b/src/joystick/linux/SDL_sysjoystick.c
@@ -156,7 +156,6 @@ typedef struct SDL_joylist_item
     char *name; /* "SideWinder 3D Pro" or whatever */
     SDL_JoystickGUID guid;
     dev_t devnum;
-    int steam_virtual_gamepad_slot;
     struct joystick_hwdata *hwdata;
     struct SDL_joylist_item *next;
 
@@ -220,19 +219,6 @@ static SDL_bool IsVirtualJoystick(Uint16 vendor, Uint16 product, Uint16 version,
 }
 #endif /* SDL_JOYSTICK_HIDAPI */
 
-static SDL_bool GetVirtualGamepadSlot(const char *name, int *slot)
-{
-    const char *digits = SDL_strstr(name, "pad ");
-    if (digits) {
-        digits += 4;
-        if (SDL_isdigit(*digits)) {
-            *slot = SDL_atoi(digits);
-            return SDL_TRUE;
-        }
-    }
-    return SDL_FALSE;
-}
-
 static int GuessDeviceClass(int fd)
 {
     unsigned long propbit[NBITS(INPUT_PROP_MAX)] = { 0 };
@@ -273,7 +259,7 @@ static int GuessIsSensor(int fd)
     return 0;
 }
 
-static int IsJoystick(const char *path, int fd, char **name_return, Uint16 *vendor_return, Uint16 *product_return, SDL_JoystickGUID *guid)
+static int IsJoystick(const char *path, int fd, char **name_return, SDL_JoystickGUID *guid)
 {
     struct input_id inpid;
     char *name;
@@ -326,8 +312,6 @@ static int IsJoystick(const char *path, int fd, char **name_return, Uint16 *vend
         return 0;
     }
     *name_return = name;
-    *vendor_return = inpid.vendor;
-    *product_return = inpid.product;
     return 1;
 }
 
@@ -405,7 +389,6 @@ static void MaybeAddDevice(const char *path)
     struct stat sb;
     int fd = -1;
     char *name = NULL;
-    Uint16 vendor, product;
     SDL_JoystickGUID guid;
     SDL_joylist_item *item;
     SDL_sensorlist_item *item_sensor;
@@ -441,7 +424,7 @@ static void MaybeAddDevice(const char *path)
     SDL_Log("Checking %s\n", path);
 #endif
 
-    if (IsJoystick(path, fd, &name, &vendor, &product, &guid)) {
+    if (IsJoystick(path, fd, &name, &guid)) {
 #ifdef DEBUG_INPUT_EVENTS
         SDL_Log("found joystick: %s\n", path);
 #endif
@@ -453,16 +436,10 @@ static void MaybeAddDevice(const char *path)
         }
 
         item->devnum = sb.st_rdev;
-        item->steam_virtual_gamepad_slot = -1;
         item->path = SDL_strdup(path);
         item->name = name;
         item->guid = guid;
 
-        if (vendor == USB_VENDOR_VALVE &&
-            product == USB_PRODUCT_STEAM_VIRTUAL_GAMEPAD) {
-            GetVirtualGamepadSlot(item->name, &item->steam_virtual_gamepad_slot);
-        }
-
         if ((!item->path) || (!item->name)) {
             FreeJoylistItem(item);
             goto done;
@@ -855,91 +832,6 @@ static int SDLCALL sort_entries(const void *_a, const void *_b)
     return numA - numB;
 }
 
-typedef struct
-{
-    char *path;
-    int slot;
-} VirtualGamepadEntry;
-
-static int SDLCALL sort_virtual_gamepads(const void *_a, const void *_b)
-{
-    const VirtualGamepadEntry *a = (const VirtualGamepadEntry *)_a;
-    const VirtualGamepadEntry *b = (const VirtualGamepadEntry *)_b;
-    return a->slot - b->slot;
-}
-
-static void LINUX_ScanSteamVirtualGamepads(void)
-{
-    int i, count;
-    int fd;
-    struct dirent **entries = NULL;
-    char path[PATH_MAX];
-    char name[128];
-    struct input_id inpid;
-    int num_virtual_gamepads = 0;
-    int virtual_gamepad_slot;
-    VirtualGamepadEntry *virtual_gamepads = NULL;
-
-    count = scandir("/dev/input", &entries, filter_entries, NULL);
-    for (i = 0; i < count; ++i) {
-        (void)SDL_snprintf(path, SDL_arraysize(path), "/dev/input/%s", entries[i]->d_name);
-
-        fd = open(path, O_RDONLY | O_CLOEXEC, 0);
-        if (fd >= 0) {
-            if (ioctl(fd, EVIOCGID, &inpid) == 0 &&
-                inpid.vendor == USB_VENDOR_VALVE &&
-                inpid.product == USB_PRODUCT_STEAM_VIRTUAL_GAMEPAD &&
-                ioctl(fd, EVIOCGNAME(sizeof(name)), name) > 0 &&
-                GetVirtualGamepadSlot(name, &virtual_gamepad_slot)) {
-                VirtualGamepadEntry *new_virtual_gamepads = (VirtualGamepadEntry *)SDL_realloc(virtual_gamepads, (num_virtual_gamepads + 1) * sizeof(*virtual_gamepads));
-                if (new_virtual_gamepads) {
-                    VirtualGamepadEntry *entry = &new_virtual_gamepads[num_virtual_gamepads];
-                    entry->path = SDL_strdup(path);
-                    entry->slot = virtual_gamepad_slot;
-                    if (entry->path) {
-                        virtual_gamepads = new_virtual_gamepads;
-                        ++num_virtual_gamepads;
-                    } else {
-                        SDL_free(entry->path);
-                        SDL_free(new_virtual_gamepads);
-                    }
-                }
-            }
-            close(fd);
-        }
-        free(entries[i]); /* This should NOT be SDL_free() */
-    }
-    free(entries); /* This should NOT be SDL_free() */
-
-    if (num_virtual_gamepads > 1) {
-        SDL_qsort(virtual_gamepads, num_virtual_gamepads, sizeof(*virtual_gamepads), sort_virtual_gamepads);
-    }
-    for (i = 0; i < num_virtual_gamepads; ++i) {
-        MaybeAddDevice(virtual_gamepads[i].path);
-        SDL_free(virtual_gamepads[i].path);
-    }
-    SDL_free(virtual_gamepads);
-}
-
-static void LINUX_ScanInputDevices(void)
-{
-    int i, count;
-    struct dirent **entries = NULL;
-    char path[PATH_MAX];
-
-    count = scandir("/dev/input", &entries, filter_entries, NULL);
-    if (count > 1) {
-        SDL_qsort(entries, count, sizeof(*entries), sort_entries);
-    }
-    for (i = 0; i < count; ++i) {
-        (void)SDL_snprintf(path, SDL_arraysize(path), "/dev/input/%s", entries[i]->d_name);
-        MaybeAddDevice(path);
-
-        free(entries[i]); /* This should NOT be SDL_free() */
-    }
-    free(entries); /* This should NOT be SDL_free() */
-}
-
 static void LINUX_FallbackJoystickDetect(void)
 {
     const Uint32 SDL_JOY_DETECT_INTERVAL_MS = 3000; /* Update every 3 seconds */
@@ -950,10 +842,21 @@ static void LINUX_FallbackJoystickDetect(void)
 
         /* Opening input devices can generate synchronous device I/O, so avoid it if we can */
         if (stat("/dev/input", &sb) == 0 && sb.st_mtime != last_input_dir_mtime) {
-            /* Look for Steam virtual gamepads first, and sort by Steam controller slot */
-            LINUX_ScanSteamVirtualGamepads();
+            int i, count;
+            struct dirent **entries = NULL;
+            char path[PATH_MAX];
 
-            LINUX_ScanInputDevices();
+            count = scandir("/dev/input", &entries, filter_entries, NULL);
+            if (count > 1) {
+                SDL_qsort(entries, count, sizeof(*entries), sort_entries);
+            }
+            for (i = 0; i < count; ++i) {
+                (void)SDL_snprintf(path, SDL_arraysize(path), "/dev/input/%s", entries[i]->d_name);
+                MaybeAddDevice(path);
+
+                free(entries[i]); /* This should NOT be SDL_free() */
+            }
+            free(entries); /* This should NOT be SDL_free() */
 
             last_input_dir_mtime = sb.st_mtime;
         }
@@ -1118,7 +1021,7 @@ static const char *LINUX_JoystickGetDevicePath(int device_index)
 
 static int LINUX_JoystickGetDevicePlayerIndex(int device_index)
 {
-    return GetJoystickByDevIndex(device_index)->steam_virtual_gamepad_slot;
+    return -1;
 }
 
 static void LINUX_JoystickSetDevicePlayerIndex(int device_index, int player_index)