From 7ae52b1730da7f9368eb08f9f0b4564b25a3ad4d Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 17 Apr 2014 20:18:50 -0700 Subject: [PATCH] Fixed bug 2477 - [PATCH] Joysticks do not work on RHEL6/CentOS6 systems Ashley Whetter RHEL6 and CentOS6 systems still use an old version of udev (147). It wasn't until udev 148 (Yep. 1 version off!) that the input class system changed from "ID_CLASS" to "ID_INPUT_{JOYSTICK,KEYBOARD,MOUSE,etc}" (http://lwn.net/Articles/364728/). Because SDL2 looks for the ID_INPUT_X field this means that it never detects any input devices on RHEL6 systems. I've attached a patch which fixes the problem. If no input devices are detected with "ID_INPUT_X" then SDL will fallback to looking for the old style "ID_CLASS" udev field instead. Because of the "big change" between udev versions I doubt it'll ever get upgraded on RHEL6, but because RHEL7 is on the way I don't know if this patch is worth merging. Hopefully it'll help anyone out that's having this problem though. --- src/core/linux/SDL_udev.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/core/linux/SDL_udev.c b/src/core/linux/SDL_udev.c index da03b7332a1ce..547779b4e3600 100644 --- a/src/core/linux/SDL_udev.c +++ b/src/core/linux/SDL_udev.c @@ -308,7 +308,21 @@ device_event(SDL_UDEV_deviceevent type, struct udev_device *dev) } if (devclass == 0) { - return; + // Fall back to old style input classes + val = _this->udev_device_get_property_value(dev, "ID_CLASS"); + if (val != NULL) { + if (SDL_strcmp(val, "joystick") == 0) { + devclass = SDL_UDEV_DEVICE_JOYSTICK; + } else if (SDL_strcmp(val, "mouse") == 0) { + devclass = SDL_UDEV_DEVICE_MOUSE; + } else if (SDL_strcmp(val, "kbd") == 0) { + devclass = SDL_UDEV_DEVICE_KEYBOARD; + } else { + return; + } + } else { + return; + } } } else { return;