From 2a161e7adddd93af9d52c9aa7cf5160b11bcbd4b Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 10 Dec 2019 11:30:56 -0800 Subject: [PATCH] Remove any duplicate manufacturer in the joystick name --- src/joystick/linux/SDL_sysjoystick.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c index d346b6405..e026a1f13 100644 --- a/src/joystick/linux/SDL_sysjoystick.c +++ b/src/joystick/linux/SDL_sysjoystick.c @@ -88,11 +88,26 @@ static time_t last_input_dir_mtime; (((1UL << ((nr) % (sizeof(long) * 8))) & ((addr)[(nr) / (sizeof(long) * 8)])) != 0) #define NBITS(x) ((((x)-1)/(sizeof(long) * 8))+1) +static int +PrefixMatch(const char *a, const char *b) +{ + int matchlen = 0; + while (*a && *b) { + if (*a++ == *b++) { + ++matchlen; + } else { + break; + } + } + return matchlen; +} + static int IsJoystick(int fd, char *namebuf, const size_t namebuflen, SDL_JoystickGUID *guid) { struct input_id inpid; Uint16 *guid16 = (Uint16 *)guid->data; + const char *spot; #if !SDL_USE_LIBUDEV /* When udev is enabled we only get joystick devices here, so there's no need to test them */ @@ -116,6 +131,15 @@ IsJoystick(int fd, char *namebuf, const size_t namebuflen, SDL_JoystickGUID *gui return 0; } + /* Remove duplicate manufacturer in the name */ + for (spot = namebuf + 1; *spot; ++spot) { + int matchlen = PrefixMatch(namebuf, spot); + if (matchlen > 0 && spot[matchlen - 1] == ' ') { + SDL_memmove(namebuf, spot, SDL_strlen(spot)+1); + break; + } + } + if (ioctl(fd, EVIOCGID, &inpid) < 0) { return 0; }