[PATCH libinput 4/4] touchpad: reset the motion history on significant negative pressure changes
Hans de Goede
hdegoede at redhat.com
Sun Apr 3 07:54:32 UTC 2016
Hi,
On 04/01/2016 03:10 AM, Peter Hutterer wrote:
> Resetting the motion history has the side-effect of swallowing movements, we
> don't calculate deltas until we have 4 motion events. During a finger release,
> we're likely to get a large pressure change between two events, resetting the
> motion history prevents the cursor from jumping on release.
>
> The value of 7 found by trial-and-error, tested on the T440 and T450 hardware.
> The absolute value is highly variable but recordings show that the pressure
> changes only by 1 or 2 units during normal interaction. Higher pressure
> changes are during finger position changes but since those should not cause a
> jump anyway, we tend to win there too.
>
> Currently only enabled for negative pressure changes, let's see how we go with
> that.
>
> https://bugs.freedesktop.org/show_bug.cgi?id=94379
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> src/evdev-mt-touchpad.c | 4 ++++
> src/evdev-mt-touchpad.h | 1 +
> test/litest.c | 38 +++++++++++++++++++++++++++-----------
> test/litest.h | 7 +++++++
> test/touchpad.c | 2 +-
> 5 files changed, 40 insertions(+), 12 deletions(-)
>
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index e16aecb..0640974 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -335,6 +335,7 @@ tp_process_absolute(struct tp_dispatch *tp,
> tp_end_sequence(tp, t, time);
> break;
> case ABS_MT_PRESSURE:
> + t->pressure_delta = e->value - t->pressure;
> t->pressure = e->value;
> t->dirty = true;
> tp->queued |= TOUCHPAD_EVENT_OTHERAXIS;
> @@ -946,6 +947,9 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time)
> if (!t->dirty)
> continue;
>
> + if (t->pressure_delta < -7)
> + tp_motion_history_reset(t);
> +
Do you really want to do this on all touchpads and not just on t440 / t450
and friends ?
Otherwise this series looks good and is:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> tp_thumb_detect(tp, t, time);
> tp_palm_detect(tp, t, time);
>
> diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
> index 1f05a03..d1dae83 100644
> --- a/src/evdev-mt-touchpad.h
> +++ b/src/evdev-mt-touchpad.h
> @@ -154,6 +154,7 @@ struct tp_touch {
> uint64_t millis;
> int distance; /* distance == 0 means touch */
> int pressure;
> + int pressure_delta;
>
> struct {
> /* A quirk mostly used on Synaptics touchpads. In a
> diff --git a/test/litest.c b/test/litest.c
> index f679652..1d729ef 100644
> --- a/test/litest.c
> +++ b/test/litest.c
> @@ -1494,23 +1494,39 @@ litest_touch_move_extended(struct litest_device *d,
> }
>
> void
> +litest_touch_move_to_extended(struct litest_device *d,
> + unsigned int slot,
> + double x_from, double y_from,
> + double x_to, double y_to,
> + struct axis_replacement *axes,
> + int steps, int sleep_ms)
> +{
> + for (int i = 0; i < steps - 1; i++) {
> + litest_touch_move_extended(d, slot,
> + x_from + (x_to - x_from)/steps * i,
> + y_from + (y_to - y_from)/steps * i,
> + axes);
> + if (sleep_ms) {
> + libinput_dispatch(d->libinput);
> + msleep(sleep_ms);
> + libinput_dispatch(d->libinput);
> + }
> + }
> + litest_touch_move_extended(d, slot, x_to, y_to, axes);
> +}
> +
> +void
> litest_touch_move_to(struct litest_device *d,
> unsigned int slot,
> double x_from, double y_from,
> double x_to, double y_to,
> int steps, int sleep_ms)
> {
> - for (int i = 0; i < steps - 1; i++) {
> - litest_touch_move(d, slot,
> - x_from + (x_to - x_from)/steps * i,
> - y_from + (y_to - y_from)/steps * i);
> - if (sleep_ms) {
> - libinput_dispatch(d->libinput);
> - msleep(sleep_ms);
> - libinput_dispatch(d->libinput);
> - }
> - }
> - litest_touch_move(d, slot, x_to, y_to);
> + litest_touch_move_to_extended(d, slot,
> + x_from, y_from,
> + x_to, y_to,
> + NULL,
> + steps, sleep_ms);
> }
>
> static int
> diff --git a/test/litest.h b/test/litest.h
> index e854210..c218361 100644
> --- a/test/litest.h
> +++ b/test/litest.h
> @@ -403,6 +403,13 @@ litest_touch_move_to(struct litest_device *d,
> double x_from, double y_from,
> double x_to, double y_to,
> int steps, int sleep_ms);
> +void
> +litest_touch_move_to_extended(struct litest_device *d,
> + unsigned int slot,
> + double x_from, double y_from,
> + double x_to, double y_to,
> + struct axis_replacement *axes,
> + int steps, int sleep_ms);
>
> void
> litest_touch_move_two_touches(struct litest_device *d,
> diff --git a/test/touchpad.c b/test/touchpad.c
> index 4651b7a..a58b337 100644
> --- a/test/touchpad.c
> +++ b/test/touchpad.c
> @@ -3594,7 +3594,7 @@ START_TEST(touchpad_thumb_edgescroll)
> libinput_dispatch(li);
> litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
>
> - litest_touch_move_to(dev, 0, 99, 55, 99, 70, 10, 0);
> + litest_touch_move_to_extended(dev, 0, 99, 55, 99, 70, axes, 10, 0);
>
> litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
> }
>
More information about the wayland-devel
mailing list