Get the correct USB VID/PID information for /dev/input/js* devices
parent
bd92a95f22
commit
dc9de1e2bd
|
@ -228,6 +228,62 @@ SDL_UDEV_Scan(void)
|
||||||
_this->syms.udev_enumerate_unref(enumerate);
|
_this->syms.udev_enumerate_unref(enumerate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_bool
|
||||||
|
SDL_UDEV_GetProductInfo(const char *device_path, Uint16 *vendor, Uint16 *product, Uint16 *version)
|
||||||
|
{
|
||||||
|
struct udev_enumerate *enumerate = NULL;
|
||||||
|
struct udev_list_entry *devs = NULL;
|
||||||
|
struct udev_list_entry *item = NULL;
|
||||||
|
SDL_bool found = SDL_FALSE;
|
||||||
|
|
||||||
|
if (_this == NULL) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
enumerate = _this->syms.udev_enumerate_new(_this->udev);
|
||||||
|
if (enumerate == NULL) {
|
||||||
|
SDL_SetError("udev_enumerate_new() failed");
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_this->syms.udev_enumerate_scan_devices(enumerate);
|
||||||
|
devs = _this->syms.udev_enumerate_get_list_entry(enumerate);
|
||||||
|
for (item = devs; item && !found; item = _this->syms.udev_list_entry_get_next(item)) {
|
||||||
|
const char *path = _this->syms.udev_list_entry_get_name(item);
|
||||||
|
struct udev_device *dev = _this->syms.udev_device_new_from_syspath(_this->udev, path);
|
||||||
|
if (dev != NULL) {
|
||||||
|
const char *val = NULL;
|
||||||
|
const char *existing_path;
|
||||||
|
|
||||||
|
existing_path = _this->syms.udev_device_get_devnode(dev);
|
||||||
|
if (existing_path && SDL_strcmp(device_path, existing_path) == 0) {
|
||||||
|
found = SDL_TRUE;
|
||||||
|
|
||||||
|
val = _this->syms.udev_device_get_property_value(dev, "ID_VENDOR_ID");
|
||||||
|
if (val != NULL) {
|
||||||
|
*vendor = (Uint16)SDL_strtol(val, NULL, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
val = _this->syms.udev_device_get_property_value(dev, "ID_MODEL_ID");
|
||||||
|
if (val != NULL) {
|
||||||
|
*product = (Uint16)SDL_strtol(val, NULL, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
val = _this->syms.udev_device_get_property_value(dev, "ID_REVISION");
|
||||||
|
if (val != NULL) {
|
||||||
|
*version = (Uint16)SDL_strtol(val, NULL, 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_this->syms.udev_device_unref(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_this->syms.udev_enumerate_unref(enumerate);
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SDL_UDEV_UnloadLibrary(void)
|
SDL_UDEV_UnloadLibrary(void)
|
||||||
|
@ -381,7 +437,7 @@ device_event(SDL_UDEV_deviceevent type, struct udev_device *dev)
|
||||||
if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_TRUE) &&
|
if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_TRUE) &&
|
||||||
val != NULL && SDL_strcmp(val, "1") == 0 ) {
|
val != NULL && SDL_strcmp(val, "1") == 0 ) {
|
||||||
devclass |= SDL_UDEV_DEVICE_JOYSTICK;
|
devclass |= SDL_UDEV_DEVICE_JOYSTICK;
|
||||||
}
|
}
|
||||||
|
|
||||||
val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_MOUSE");
|
val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_MOUSE");
|
||||||
if (val != NULL && SDL_strcmp(val, "1") == 0 ) {
|
if (val != NULL && SDL_strcmp(val, "1") == 0 ) {
|
||||||
|
@ -505,7 +561,6 @@ SDL_UDEV_DelCallback(SDL_UDEV_Callback cb)
|
||||||
}
|
}
|
||||||
prev = item;
|
prev = item;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const SDL_UDEV_Symbols *
|
const SDL_UDEV_Symbols *
|
||||||
|
|
|
@ -101,6 +101,7 @@ extern void SDL_UDEV_UnloadLibrary(void);
|
||||||
extern int SDL_UDEV_LoadLibrary(void);
|
extern int SDL_UDEV_LoadLibrary(void);
|
||||||
extern void SDL_UDEV_Poll(void);
|
extern void SDL_UDEV_Poll(void);
|
||||||
extern void SDL_UDEV_Scan(void);
|
extern void SDL_UDEV_Scan(void);
|
||||||
|
extern SDL_bool SDL_UDEV_GetProductInfo(const char *device_path, Uint16 *vendor, Uint16 *product, Uint16 *version);
|
||||||
extern int SDL_UDEV_AddCallback(SDL_UDEV_Callback cb);
|
extern int SDL_UDEV_AddCallback(SDL_UDEV_Callback cb);
|
||||||
extern void SDL_UDEV_DelCallback(SDL_UDEV_Callback cb);
|
extern void SDL_UDEV_DelCallback(SDL_UDEV_Callback cb);
|
||||||
extern const SDL_UDEV_Symbols *SDL_UDEV_GetUdevSyms(void);
|
extern const SDL_UDEV_Symbols *SDL_UDEV_GetUdevSyms(void);
|
||||||
|
|
|
@ -178,7 +178,7 @@ GuessIsJoystick(int fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
IsJoystick(int fd, char **name_return, SDL_JoystickGUID *guid)
|
IsJoystick(const char *path, int fd, char **name_return, SDL_JoystickGUID *guid)
|
||||||
{
|
{
|
||||||
struct input_id inpid;
|
struct input_id inpid;
|
||||||
Uint16 *guid16 = (Uint16 *)guid->data;
|
Uint16 *guid16 = (Uint16 *)guid->data;
|
||||||
|
@ -187,6 +187,9 @@ IsJoystick(int fd, char **name_return, SDL_JoystickGUID *guid)
|
||||||
|
|
||||||
if (ioctl(fd, JSIOCGNAME(sizeof(product_string)), product_string) >= 0) {
|
if (ioctl(fd, JSIOCGNAME(sizeof(product_string)), product_string) >= 0) {
|
||||||
SDL_zero(inpid);
|
SDL_zero(inpid);
|
||||||
|
#if SDL_USE_LIBUDEV
|
||||||
|
SDL_UDEV_GetProductInfo(path, &inpid.vendor, &inpid.product, &inpid.version);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* When udev is enabled we only get joystick devices here, so there's no need to test them */
|
/* When udev is enabled we only get joystick devices here, so there's no need to test them */
|
||||||
if (enumeration_method != ENUMERATION_LIBUDEV && !GuessIsJoystick(fd)) {
|
if (enumeration_method != ENUMERATION_LIBUDEV && !GuessIsJoystick(fd)) {
|
||||||
|
@ -326,7 +329,7 @@ MaybeAddDevice(const char *path)
|
||||||
SDL_Log("Checking %s\n", path);
|
SDL_Log("Checking %s\n", path);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
isstick = IsJoystick(fd, &name, &guid);
|
isstick = IsJoystick(path, fd, &name, &guid);
|
||||||
close(fd);
|
close(fd);
|
||||||
if (!isstick) {
|
if (!isstick) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in New Issue