touchpad: pretend the jumpy semi-mt touchpad is a single-touch touchpad
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 30 Jul 2015 01:54:38 +0000 (11:54 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 3 Aug 2015 01:40:29 +0000 (11:40 +1000)
The first finger is accurate, it's just the second finger that is imprecise,
so we can't handle it as a true touch. Instead, revert the device back to
being a single-touch touchpad and use the fake touch bits for second finger
handling.

Two-finger scrolling thus becomes usable though we will lose out on
other features like thumb detection. Useful scrolling trumps that though.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev-mt-touchpad.c
test/touchpad-tap.c
test/touchpad.c

index af1cd47..64ec446 100644 (file)
@@ -1465,6 +1465,21 @@ tp_init_slots(struct tp_dispatch *tp,
 
        tp->semi_mt = libevdev_has_property(device->evdev, INPUT_PROP_SEMI_MT);
 
+       /* This device has a terrible resolution when two fingers are down,
+        * causing scroll jumps. The single-touch emulation ABS_X/Y is
+        * accurate but the ABS_MT_POSITION touchpoints report the bounding
+        * box and that causes jumps.  So we simply pretend it's a single
+        * touch touchpad with the BTN_TOOL bits.
+        * See https://bugzilla.redhat.com/show_bug.cgi?id=1235175 for an
+        * explanation.
+        */
+       if (tp->semi_mt &&
+           (device->model_flags & EVDEV_MODEL_JUMPING_SEMI_MT)) {
+               tp->num_slots = 1;
+               tp->slot = 0;
+               tp->has_mt = false;
+       }
+
        ARRAY_FOR_EACH(max_touches, m) {
                if (libevdev_has_event_code(device->evdev,
                                            EV_KEY,
@@ -1526,11 +1541,7 @@ tp_scroll_get_methods(struct tp_dispatch *tp)
 {
        uint32_t methods = LIBINPUT_CONFIG_SCROLL_EDGE;
 
-       /* some Synaptics semi-mt touchpads have a terrible 2fg resolution,
-        * causing scroll jumps. For all other 2fg touchpads, we enable 2fg
-        * scrolling */
-       if (tp->ntouches >= 2 &&
-           (tp->device->model_flags & EVDEV_MODEL_JUMPING_SEMI_MT) == 0)
+       if (tp->ntouches >= 2)
                methods |= LIBINPUT_CONFIG_SCROLL_2FG;
 
        return methods;
index 00afcdb..62c7a5c 100644 (file)
@@ -241,6 +241,9 @@ START_TEST(touchpad_1fg_multitap_n_drag_2fg)
        int range = _i,
            ntaps;
 
+       if (litest_is_synaptics_semi_mt(dev))
+               return;
+
        litest_enable_tap(dev->libinput_device);
 
        litest_drain_events(li);
index a6989e7..77c1d2d 100644 (file)
@@ -402,14 +402,12 @@ START_TEST(touchpad_scroll_defaults)
 
        method = libinput_device_config_scroll_get_methods(device);
        ck_assert(method & LIBINPUT_CONFIG_SCROLL_EDGE);
-       if (libevdev_get_num_slots(evdev) > 1 &&
-           !litest_is_synaptics_semi_mt(dev))
+       if (libevdev_get_num_slots(evdev) > 1)
                ck_assert(method & LIBINPUT_CONFIG_SCROLL_2FG);
        else
                ck_assert((method & LIBINPUT_CONFIG_SCROLL_2FG) == 0);
 
-       if (libevdev_get_num_slots(evdev) > 1 &&
-           !litest_is_synaptics_semi_mt(dev))
+       if (libevdev_get_num_slots(evdev) > 1)
                expected = LIBINPUT_CONFIG_SCROLL_2FG;
        else
                expected = LIBINPUT_CONFIG_SCROLL_EDGE;
@@ -425,8 +423,7 @@ START_TEST(touchpad_scroll_defaults)
        status = libinput_device_config_scroll_set_method(device,
                                          LIBINPUT_CONFIG_SCROLL_2FG);
 
-       if (libevdev_get_num_slots(evdev) > 1 &&
-           !litest_is_synaptics_semi_mt(dev))
+       if (libevdev_get_num_slots(evdev) > 1)
                ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
        else
                ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);