diff options
author | Chase Douglas <chase.douglas@ubuntu.com> | 2010-09-01 14:45:34 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2010-09-01 15:04:37 +1000 |
commit | 7925e8945649d4af237e6c3c5593b895a461bd1e (patch) | |
tree | 4b9395f2eac8f07b80c3b34ff566adf8c07202cd | |
parent | 05e616767e5b7e60b92d31c4042ded5892dce6d4 (diff) |
Fix udev population of Bluetooth input device product IDs
The udev device_added function takes the vendor and model IDs of added
devices and converts them into an attribute that can be matched for by
an InputClass configuration using MatchUSBID. Currently, the udev
mechanism works for USB devices, but fails to work properly for
Bluetooth devices. The product IDs of the event node are actually the
IDs of the Bluetooth receiver instead of the device.
This patch reads the product ID from the PRODUCT property of the parent
of the added device. This tag is set correctly for both USB and
Bluetooth input devices. The following devices have been tested by
specifying individual InputClass sections in xorg.conf:
* Apple Keyboard (Bluetooth)
* Apple Magic Trackpad (Bluetooth)
* Apple Magic Mouse (Bluetooth)
* Microsoft Bluetooth Notebook Mouse 5000 (Bluetooth)
* Microsoft IntelliMouse Optical (USB)
* N-Trig Touchscreen (USB)
* Wacom Bamboo Touch (USB)
Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | config/udev.c | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/config/udev.c b/config/udev.c index 993449075..b7717c96d 100644 --- a/config/udev.c +++ b/config/udev.c @@ -58,7 +58,6 @@ device_added(struct udev_device *udev_device) char *config_info = NULL; const char *syspath; const char *tags_prop; - const char *usb_vendor = NULL, *usb_model = NULL; const char *key, *value, *tmp; InputOption *options = NULL, *tmpo; InputAttributes attrs = {}; @@ -94,6 +93,8 @@ device_added(struct udev_device *udev_device) parent = udev_device_get_parent(udev_device); if (parent) { const char *ppath = udev_device_get_devnode(parent); + const char *product = udev_device_get_property_value(parent, "PRODUCT"); + unsigned int usb_vendor, usb_model; name = udev_device_get_sysattr_value(parent, "name"); LOG_SYSATTR(ppath, "name", name); @@ -104,6 +105,13 @@ device_added(struct udev_device *udev_device) attrs.pnp_id = udev_device_get_sysattr_value(parent, "id"); LOG_SYSATTR(ppath, "id", attrs.pnp_id); + + /* construct USB ID in lowercase hex - "0000:ffff" */ + if (product && sscanf(product, "%*x/%4x/%4x/%*x", &usb_vendor, &usb_model) == 2) { + attrs.usb_id = Xprintf("%04x:%04x", usb_vendor, usb_model); + if (attrs.usb_id) + LOG_PROPERTY(path, "PRODUCT", product); + } } if (!name) name = "(unnamed)"; @@ -152,12 +160,6 @@ device_added(struct udev_device *udev_device) } else if (!strcmp(key, "ID_VENDOR")) { LOG_PROPERTY(path, key, value); attrs.vendor = value; - } else if (!strcmp(key, "ID_VENDOR_ID")) { - LOG_PROPERTY(path, key, value); - usb_vendor = value; - } else if (!strcmp(key, "ID_VENDOR_MODEL")) { - LOG_PROPERTY(path, key, value); - usb_model = value; } else if (!strcmp(key, "ID_INPUT_KEY")) { LOG_PROPERTY(path, key, value); attrs.flags |= ATTR_KEYBOARD; @@ -179,16 +181,6 @@ device_added(struct udev_device *udev_device) } } - /* construct USB ID in lowercase hex - "0000:ffff" */ - if (usb_vendor && usb_model) { - attrs.usb_id = Xprintf("%s:%s", usb_vendor, usb_model); - if (attrs.usb_id) { - char *cur; - for (cur = attrs.usb_id; *cur; cur++) - *cur = tolower(*cur); - } - } - LogMessage(X_INFO, "config/udev: Adding input device %s (%s)\n", name, path); rc = NewInputDeviceRequest(options, &attrs, &dev); |