evdev: check for ABS_MT_POSITION_X/Y to determine mt devices
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 8 Aug 2013 02:03:08 +0000 (12:03 +1000)
committerJonas Ådahl <jadahl@gmail.com>
Sun, 10 Nov 2013 16:51:32 +0000 (17:51 +0100)
mtdev as currently used in weston is a noop. mtdev's purpose is to convert
Protocol A devices (without ABS_MT_SLOT) to Protocol B devices (slots).
For Protocol B devices mtdev merely routes the events, so checking for
slots and then using mtdev based on that adds no functionality.

Check for ABS_MT_POSITION_X/Y instead and use that to categorise a device
as MT device. mtdev will provide us with a slotted protocol for all devices.

https://bugs.freedesktop.org/show_bug.cgi?id=54428

src/evdev.c

index e9fd809..fc5004c 100644 (file)
@@ -454,7 +454,11 @@ evdev_handle_device(struct evdev_device *device)
                        device->abs.max_y = absinfo.maximum;
                        device->caps |= EVDEV_MOTION_ABS;
                }
-               if (TEST_BIT(abs_bits, ABS_MT_SLOT)) {
+                /* We only handle the slotted Protocol B in weston.
+                   Devices with ABS_MT_POSITION_* but not ABS_MT_SLOT
+                   require mtdev for conversion. */
+               if (TEST_BIT(abs_bits, ABS_MT_POSITION_X) &&
+                   TEST_BIT(abs_bits, ABS_MT_POSITION_Y)) {
                        ioctl(device->fd, EVIOCGABS(ABS_MT_POSITION_X),
                              &absinfo);
                        device->abs.min_x = absinfo.minimum;