← Back to team overview

multi-touch-dev team mailing list archive

Re: [PATCH v3] Fix udev population of Bluetooth input device product IDs

 

On 08/31/2010 06:40 PM, Peter Hutterer wrote:
> On Tue, Aug 31, 2010 at 05:31:43PM -0400, Chase Douglas wrote:
>> From: Chase Douglas <chase.douglas@xxxxxxxxxx>
>>
>> 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@xxxxxxxxxxxxx>
>> ---
>>  config/udev.c |   26 +++++++++-----------------
>>  1 files changed, 9 insertions(+), 17 deletions(-)
>>
>> diff --git a/config/udev.c b/config/udev.c
>> index 9934490..4e8ce31 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 (sscanf(product, "%*x/%4x/%4x/%*x", &usb_vendor, &usb_model) == 2) {
> 
> I've added a check for product != NULL here.
> other than that, merged, thanks for the patch.
> 
> Cheers,
>   Peter

Nice, Chase! This is going to make dealing with the Magic Touchpads (and
Magicmice) much easier :-)

Great work!

d

>> +            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);
>> -- 
>> 1.7.1
>>
> _______________________________________________
> xorg-devel@xxxxxxxxxxx: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel




Follow ups