|
@@ -47,6 +47,9 @@ static _THIS = NULL;
|
|
|
static SDL_bool SDL_UDEV_load_sym(const char *fn, void **addr);
|
|
|
static int SDL_UDEV_load_syms(void);
|
|
|
static SDL_bool SDL_UDEV_hotplug_update_available(void);
|
|
|
+static void get_caps(struct udev_device *dev, struct udev_device *pdev, const char *attr, unsigned long *bitmask, size_t bitmask_len);
|
|
|
+static int guess_device_class(struct udev_device *dev);
|
|
|
+static int device_class(struct udev_device *dev);
|
|
|
static void device_event(SDL_UDEV_deviceevent type, struct udev_device *dev);
|
|
|
|
|
|
static SDL_bool SDL_UDEV_load_sym(const char *fn, void **addr)
|
|
@@ -222,7 +225,7 @@ void SDL_UDEV_Scan(void)
|
|
|
_this->syms.udev_enumerate_unref(enumerate);
|
|
|
}
|
|
|
|
|
|
-SDL_bool SDL_UDEV_GetProductInfo(const char *device_path, Uint16 *vendor, Uint16 *product, Uint16 *version)
|
|
|
+SDL_bool SDL_UDEV_GetProductInfo(const char *device_path, Uint16 *vendor, Uint16 *product, Uint16 *version, int *class)
|
|
|
{
|
|
|
struct udev_enumerate *enumerate = NULL;
|
|
|
struct udev_list_entry *devs = NULL;
|
|
@@ -250,6 +253,7 @@ SDL_bool SDL_UDEV_GetProductInfo(const char *device_path, Uint16 *vendor, Uint16
|
|
|
|
|
|
existing_path = _this->syms.udev_device_get_devnode(dev);
|
|
|
if (existing_path && SDL_strcmp(device_path, existing_path) == 0) {
|
|
|
+ int class_temp;
|
|
|
found = SDL_TRUE;
|
|
|
|
|
|
val = _this->syms.udev_device_get_property_value(dev, "ID_VENDOR_ID");
|
|
@@ -266,6 +270,11 @@ SDL_bool SDL_UDEV_GetProductInfo(const char *device_path, Uint16 *vendor, Uint16
|
|
|
if (val) {
|
|
|
*version = (Uint16)SDL_strtol(val, NULL, 16);
|
|
|
}
|
|
|
+
|
|
|
+ class_temp = device_class(dev);
|
|
|
+ if (class_temp) {
|
|
|
+ *class = class_temp;
|
|
|
+ }
|
|
|
}
|
|
|
_this->syms.udev_device_unref(dev);
|
|
|
}
|
|
@@ -394,20 +403,17 @@ static int guess_device_class(struct udev_device *dev)
|
|
|
&bitmask_rel[0]);
|
|
|
}
|
|
|
|
|
|
-static void device_event(SDL_UDEV_deviceevent type, struct udev_device *dev)
|
|
|
+static int device_class(struct udev_device *dev)
|
|
|
{
|
|
|
const char *subsystem;
|
|
|
const char *val = NULL;
|
|
|
int devclass = 0;
|
|
|
- const char *path;
|
|
|
- SDL_UDEV_CallbackList *item;
|
|
|
|
|
|
- path = _this->syms.udev_device_get_devnode(dev);
|
|
|
- if (!path) {
|
|
|
- return;
|
|
|
+ subsystem = _this->syms.udev_device_get_subsystem(dev);
|
|
|
+ if (!subsystem) {
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- subsystem = _this->syms.udev_device_get_subsystem(dev);
|
|
|
if (SDL_strcmp(subsystem, "sound") == 0) {
|
|
|
devclass = SDL_UDEV_DEVICE_SOUND;
|
|
|
} else if (SDL_strcmp(subsystem, "input") == 0) {
|
|
@@ -455,18 +461,33 @@ static void device_event(SDL_UDEV_deviceevent type, struct udev_device *dev)
|
|
|
devclass = SDL_UDEV_DEVICE_MOUSE;
|
|
|
} else if (SDL_strcmp(val, "kbd") == 0) {
|
|
|
devclass = SDL_UDEV_DEVICE_KEYBOARD;
|
|
|
- } else {
|
|
|
- return;
|
|
|
}
|
|
|
} else {
|
|
|
/* We could be linked with libudev on a system that doesn't have udev running */
|
|
|
devclass = guess_device_class(dev);
|
|
|
}
|
|
|
}
|
|
|
- } else {
|
|
|
+ }
|
|
|
+
|
|
|
+ return devclass;
|
|
|
+}
|
|
|
+
|
|
|
+static void device_event(SDL_UDEV_deviceevent type, struct udev_device *dev)
|
|
|
+{
|
|
|
+ int devclass = 0;
|
|
|
+ const char *path;
|
|
|
+ SDL_UDEV_CallbackList *item;
|
|
|
+
|
|
|
+ path = _this->syms.udev_device_get_devnode(dev);
|
|
|
+ if (!path) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ devclass = device_class(dev);
|
|
|
+ if (!devclass) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
/* Process callbacks */
|
|
|
for (item = _this->first; item; item = item->next) {
|
|
|
item->callback(type, devclass, path);
|