evdev: init pointer accel filters when we have rel x/y axes
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 24 Apr 2015 04:59:18 +0000 (14:59 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 27 Apr 2015 21:45:32 +0000 (07:45 +1000)
Some devices provide abs x/y and rel x/y. We can't know which event the device
will send. The Microsoft Surface Type Cover sends relative events, which
then crashes libinput when we don't have an accel filter set up.

So instead of checking that the device doesn't have ABS_X/Y, check for the
device to have REL_X/Y instead.

https://bugzilla.redhat.com/show_bug.cgi?id=1206869

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-By: Derek Foreman <derekf@osg.samsung.com>
src/evdev.c
test/pointer.c

index db19ac892e2c549fd8546a10d311fca0a9d3b2d1..d65b11311e99dc1d3a99de8abcd88de8658d5367 100644 (file)
@@ -1792,8 +1792,8 @@ evdev_configure_device(struct evdev_device *device)
        }
 
        if (udev_tags & EVDEV_UDEV_TAG_MOUSE) {
-               if (!libevdev_has_event_code(evdev, EV_ABS, ABS_X) &&
-                   !libevdev_has_event_code(evdev, EV_ABS, ABS_Y) &&
+               if (libevdev_has_event_code(evdev, EV_REL, REL_X) &&
+                   libevdev_has_event_code(evdev, EV_REL, REL_Y) &&
                    evdev_device_init_pointer_acceleration(
                                        device,
                                        pointer_accel_profile_linear) == -1)
index 01ea2fdbc750a9fc11c63ecb5603989f63a0415a..9d3dda60658003754981d6962527f2c14aaf9332 100644 (file)
@@ -825,6 +825,17 @@ START_TEST(pointer_accel_defaults_absolute)
 }
 END_TEST
 
+START_TEST(pointer_accel_defaults_absolute_relative)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput_device *device = dev->libinput_device;
+
+       ck_assert(libinput_device_config_accel_is_available(device));
+       ck_assert(libinput_device_config_accel_get_default_speed(device) == 0.0);
+       ck_assert(libinput_device_config_accel_get_speed(device) == 0.0);
+}
+END_TEST
+
 START_TEST(pointer_accel_direction_change)
 {
        struct litest_device *dev = litest_current_device();
@@ -1223,7 +1234,8 @@ int main (int argc, char **argv) {
 
        litest_add("pointer:accel", pointer_accel_defaults, LITEST_RELATIVE, LITEST_ANY);
        litest_add("pointer:accel", pointer_accel_invalid, LITEST_RELATIVE, LITEST_ANY);
-       litest_add("pointer:accel", pointer_accel_defaults_absolute, LITEST_ABSOLUTE, LITEST_ANY);
+       litest_add("pointer:accel", pointer_accel_defaults_absolute, LITEST_ABSOLUTE, LITEST_RELATIVE);
+       litest_add("pointer:accel", pointer_accel_defaults_absolute_relative, LITEST_ABSOLUTE|LITEST_RELATIVE, LITEST_ANY);
        litest_add("pointer:accel", pointer_accel_direction_change, LITEST_RELATIVE, LITEST_ANY);
 
        litest_add("pointer:middlebutton", middlebutton, LITEST_BUTTON, LITEST_POINTINGSTICK);