On Tue, Jan 19, 2016 at 1:01 AM, Peter Hutterer <peter.hutte...@who-t.net> wrote: > Synaptics, Elantech and Alps semi-mt devices all have issues with reporting > correct MT data, even the bounding box which semi-mt devices are supposed to > report is wrong. > > Synaptics devices have massive jumps with two fingers down. Elantech devices > may open slots without coordinate data. Alps devices may send 0/0 coordinates > as initial slot position. > > All these may be addressable with specific quirks, but the actual benefit is > largely restricted to better palm detection (though even with quirks this is > unlikely to work) and support for pinch gestures (again, lack of coordinates > makes supporting those hard anyway). > > Elantech: https://bugs.freedesktop.org/show_bug.cgi?id=93583 > Alps: https://bugzilla.redhat.com/show_bug.cgi?id=1295073 > > Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> > ---
I am definitively in favor of this. The patch looks good, so I can give my Reviewed-by. However, I think it would be better if Hans (or anybody else) could have a look at the side effects, as I am not familiar enough in the gestures/palm-rejection code anymore. Cheers, Benjamin > src/evdev-mt-touchpad-gestures.c | 6 ++---- > src/evdev-mt-touchpad.c | 21 +++++++++++++-------- > test/gestures.c | 2 +- > test/litest.h | 10 ---------- > test/touchpad-tap.c | 2 +- > 5 files changed, 17 insertions(+), 24 deletions(-) > > diff --git a/src/evdev-mt-touchpad-gestures.c > b/src/evdev-mt-touchpad-gestures.c > index 80aa89f..24f6a6d 100644 > --- a/src/evdev-mt-touchpad-gestures.c > +++ b/src/evdev-mt-touchpad-gestures.c > @@ -568,10 +568,8 @@ tp_gesture_handle_state(struct tp_dispatch *tp, uint64_t > time) > int > tp_init_gesture(struct tp_dispatch *tp) > { > - if (tp->device->model_flags & EVDEV_MODEL_JUMPING_SEMI_MT) > - tp->gesture.enabled = false; > - else > - tp->gesture.enabled = true; > + /* semi-mt devices are too unreliable to do pinch gestures */ > + tp->gesture.enabled = !tp->semi_mt; > > tp->gesture.twofinger_state = GESTURE_2FG_STATE_NONE; > > diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c > index 62087fb..7f5bbf5 100644 > --- a/src/evdev-mt-touchpad.c > +++ b/src/evdev-mt-touchpad.c > @@ -1490,17 +1490,22 @@ 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, > + /* Semi-mt devices are not reliable for true multitouch data, so we > + * simply pretend they're single touch touchpads with BTN_TOOL bits. > + * Synaptics: > + * 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. > + * box and that causes jumps. See https://bugzilla.redhat.com/1235175 > + * Elantech: > + * On three-finger taps/clicks, one slot doesn't get a coordinate > + * assigned. See https://bugs.freedesktop.org/show_bug.cgi?id=93583 > + * Alps: > + * If three fingers are set down in the same frame, one slot has the > + * coordinates 0/0 and may not get updated for several frames. > + * See https://bugzilla.redhat.com/show_bug.cgi?id=1295073 > */ > - if (tp->semi_mt && > - (device->model_flags & > - (EVDEV_MODEL_JUMPING_SEMI_MT|EVDEV_MODEL_ELANTECH_TOUCHPAD))) { > + if (tp->semi_mt) { > tp->num_slots = 1; > tp->slot = 0; > tp->has_mt = false; > diff --git a/test/gestures.c b/test/gestures.c > index 9fc73b9..0fc3964 100644 > --- a/test/gestures.c > +++ b/test/gestures.c > @@ -34,7 +34,7 @@ START_TEST(gestures_cap) > struct litest_device *dev = litest_current_device(); > struct libinput_device *device = dev->libinput_device; > > - if (litest_is_synaptics_semi_mt(dev)) > + if (libevdev_has_property(dev->evdev, INPUT_PROP_SEMI_MT)) > ck_assert(!libinput_device_has_capability(device, > LIBINPUT_DEVICE_CAP_GESTURE)); > else > diff --git a/test/litest.h b/test/litest.h > index e74e923..61b1b01 100644 > --- a/test/litest.h > +++ b/test/litest.h > @@ -552,16 +552,6 @@ litest_enable_buttonareas(struct litest_device *dev) > litest_assert_int_eq(status, expected); > } > > -static inline int > -litest_is_synaptics_semi_mt(struct litest_device *dev) > -{ > - struct libevdev *evdev = dev->evdev; > - > - return libevdev_has_property(evdev, INPUT_PROP_SEMI_MT) && > - libevdev_get_id_vendor(evdev) == 0x2 && > - libevdev_get_id_product(evdev) == 0x7; > -} > - > static inline void > litest_enable_drag_lock(struct libinput_device *device) > { > diff --git a/test/touchpad-tap.c b/test/touchpad-tap.c > index 4450ec3..7a7e64c 100644 > --- a/test/touchpad-tap.c > +++ b/test/touchpad-tap.c > @@ -241,7 +241,7 @@ START_TEST(touchpad_1fg_multitap_n_drag_2fg) > int range = _i, > ntaps; > > - if (litest_is_synaptics_semi_mt(dev)) > + if (libevdev_has_property(dev->evdev, INPUT_PROP_SEMI_MT)) > return; > > litest_enable_tap(dev->libinput_device); > -- > 2.5.0 > _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel