[PATCH libinput 7/8] evdev: init pointer accel filters when we have rel x/y axes

Peter Hutterer peter.hutterer at who-t.net
Sun Apr 26 22:52:33 PDT 2015


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 devices, 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 at who-t.net>
---
 src/evdev.c    |  4 ++--
 test/pointer.c | 14 +++++++++++++-
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index db19ac8..d65b113 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -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)
diff --git a/test/pointer.c b/test/pointer.c
index 01ea2fd..9d3dda6 100644
--- a/test/pointer.c
+++ b/test/pointer.c
@@ -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);
-- 
2.3.5



More information about the wayland-devel mailing list