From eb660e862c43630e9d30dcd05d282b03ea31ecc9 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 5 Apr 2022 19:43:42 -0700
Subject: [PATCH] Cache the fact that a device didn't look like a joystick
Fixes https://github.com/libsdl-org/SDL/issues/5211
---
src/joystick/linux/SDL_sysjoystick.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c
index 851448acde9..39bd99139ed 100644
--- a/src/joystick/linux/SDL_sysjoystick.c
+++ b/src/joystick/linux/SDL_sysjoystick.c
@@ -109,6 +109,7 @@ typedef struct SDL_joylist_item
/* Steam Controller support */
SDL_bool m_bSteamController;
+ SDL_bool checked_mapping;
SDL_GamepadMapping *mapping;
} SDL_joylist_item;
@@ -1573,9 +1574,13 @@ LINUX_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out)
SDL_Joystick *joystick;
SDL_joylist_item *item = JoystickByDevIndex(device_index);
- if (item->mapping) {
- SDL_memcpy(out, item->mapping, sizeof(*out));
- return SDL_TRUE;
+ if (item->checked_mapping) {
+ if (item->mapping) {
+ SDL_memcpy(out, item->mapping, sizeof(*out));
+ return SDL_TRUE;
+ } else {
+ return SDL_FALSE;
+ }
}
/* We temporarily open the device to check how it's configured. Make
@@ -1595,6 +1600,8 @@ LINUX_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out)
return SDL_FALSE;
}
+ item->checked_mapping = SDL_TRUE;
+
if (PrepareJoystickHwdata(joystick, item) == -1) {
SDL_free(joystick->hwdata);
SDL_free(joystick);