[PATCH libinput 4/4] touchpad: reset the motion history during/after a slots->nfake crossover
Benjamin Tissoires
benjamin.tissoires at gmail.com
Tue Jul 21 15:28:49 PDT 2015
On Tue, Jul 21, 2015 at 1:51 AM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> Whenever we cross from N slots to at least one fake finger, reset the motion
> history and skip the next event too. Especially on serial Synaptics touchpads,
> the first touch update after a two-slot → TRIPLETAP is garbage, as is the one
> from TRIPLETAP → two slots.
>
> Example sequence reproduce on a T440s:
>
> E: 4.488757 0003 003a 0084 # EV_ABS / ABS_MT_PRESSURE 84
> E: 4.488757 0003 002f 0001 # EV_ABS / ABS_MT_SLOT 1
> E: 4.488757 0003 0039 0433 # EV_ABS / ABS_MT_TRACKING_ID 433
> E: 4.488757 0003 0035 2500 # EV_ABS / ABS_MT_POSITION_X 2500
> E: 4.488757 0003 0036 3064 # EV_ABS / ABS_MT_POSITION_Y 3064
> E: 4.488757 0003 003a 0060 # EV_ABS / ABS_MT_PRESSURE 60
> E: 4.488757 0003 0018 0084 # EV_ABS / ABS_PRESSURE 84
> E: 4.488757 0001 0145 0000 # EV_KEY / BTN_TOOL_FINGER 0
> E: 4.488757 0001 014e 0001 # EV_KEY / BTN_TOOL_TRIPLETAP 1
> E: 4.488757 0000 0000 0000 # ------------ SYN_REPORT (0) ----------
> E: 4.508506 0003 002f 0000 # EV_ABS / ABS_MT_SLOT 0
> E: 4.508506 0003 0036 2982 # EV_ABS / ABS_MT_POSITION_Y 2982
> E: 4.508506 0003 003a 0086 # EV_ABS / ABS_MT_PRESSURE 86
> E: 4.508506 0003 002f 0001 # EV_ABS / ABS_MT_SLOT 1
> E: 4.508506 0003 0035 3464 # EV_ABS / ABS_MT_POSITION_X 3464
> E: 4.508506 0003 0036 2716 # EV_ABS / ABS_MT_POSITION_Y 2716
> E: 4.508506 0003 0001 2982 # EV_ABS / ABS_Y 2982
> E: 4.508506 0003 0018 0086 # EV_ABS / ABS_PRESSURE 86
> E: 4.508506 0000 0000 0000 # ------------ SYN_REPORT (0) ----------
>
> subsequent events then hover around the 3464 mark, but that initial jump is
> enough to cause a massive cursor jump.
>
> https://bugs.freedesktop.org/show_bug.cgi?id=91352
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
The series looks good to me:
Hallelujah-expressed-by: Benjamin Tissoires <benjamin.tissoires at redhat.com>
You can also add Reviewed-with-one-eye-only, but I think the first
should be enough :)
Cheers,
Benjamin
> src/evdev-mt-touchpad.c | 29 +++++++++++++++++++++++++++--
> src/evdev-mt-touchpad.h | 9 +++++++++
> 2 files changed, 36 insertions(+), 2 deletions(-)
>
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index 1bf206d..05a9b0f 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -760,6 +760,24 @@ tp_unhover_touches(struct tp_dispatch *tp, uint64_t time)
>
> }
>
> +static inline bool
> +tp_need_motion_history_reset(struct tp_dispatch *tp)
> +{
> + /* semi-mt finger postions may "jump" when nfingers changes */
> + if (tp->semi_mt && tp->nfingers_down != tp->old_nfingers_down)
> + return true;
> +
> + /* if we're transitioning between slots and fake touches in either
> + * direction, we may get a coordinate jump
> + */
> + if (tp->nfingers_down != tp->old_nfingers_down &&
> + (tp->nfingers_down > tp->num_slots ||
> + tp->old_nfingers_down > tp->num_slots))
> + return true;
> +
> + return false;
> +}
> +
> static void
> tp_process_state(struct tp_dispatch *tp, uint64_t time)
> {
> @@ -767,16 +785,23 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time)
> struct tp_touch *first = tp_get_touch(tp, 0);
> unsigned int i;
> bool restart_filter = false;
> + bool want_motion_reset;
>
> tp_process_fake_touches(tp, time);
> tp_unhover_touches(tp, time);
>
> + want_motion_reset = tp_need_motion_history_reset(tp);
> +
> for (i = 0; i < tp->ntouches; i++) {
> t = tp_get_touch(tp, i);
>
> - /* semi-mt finger postions may "jump" when nfingers changes */
> - if (tp->semi_mt && tp->nfingers_down != tp->old_nfingers_down)
> + if (want_motion_reset) {
> tp_motion_history_reset(t);
> + t->quirks.reset_motion_history = true;
> + } else if (t->quirks.reset_motion_history) {
> + tp_motion_history_reset(t);
> + t->quirks.reset_motion_history = false;
> + }
>
> if (i >= tp->num_slots && t->state != TOUCH_NONE) {
> t->point = first->point;
> diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
> index 61c4166..fc6d38e 100644
> --- a/src/evdev-mt-touchpad.h
> +++ b/src/evdev-mt-touchpad.h
> @@ -148,6 +148,15 @@ struct tp_touch {
> int pressure;
>
> struct {
> + /* A quirk mostly used on Synaptics touchpads. In a
> + transition to/from fake touches > num_slots, the current
> + event data is likely garbage and the subsequent event
> + is likely too. This marker tells us to reset the motion
> + history again -> this effectively swallows any motion */
> + bool reset_motion_history;
> + } quirks;
> +
> + struct {
> struct device_coords samples[TOUCHPAD_HISTORY_LENGTH];
> unsigned int index;
> unsigned int count;
> --
> 2.4.3
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list