Remove any duplicate manufacturer in the joystick name
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c
index d346b64..e026a1f 100644
--- a/src/joystick/linux/SDL_sysjoystick.c
+++ b/src/joystick/linux/SDL_sysjoystick.c
@@ -89,10 +89,25 @@ static time_t last_input_dir_mtime;
#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;
}