mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-01-06 07:10:11 +01:00
touchpad: reset the motion history on significant negative pressure changes
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@who-t.net> Reviewed-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
b5527fa4c7
commit
aa90121125
5 changed files with 38 additions and 10 deletions
|
|
@ -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);
|
||||
|
||||
tp_thumb_detect(tp, t, time);
|
||||
tp_palm_detect(tp, t, time);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1494,23 +1494,39 @@ litest_touch_move_extended(struct litest_device *d,
|
|||
}
|
||||
|
||||
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)
|
||||
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(d, slot,
|
||||
x_from + (x_to - x_from)/steps * i,
|
||||
y_from + (y_to - y_from)/steps * 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(d, slot, x_to, y_to);
|
||||
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)
|
||||
{
|
||||
litest_touch_move_to_extended(d, slot,
|
||||
x_from, y_from,
|
||||
x_to, y_to,
|
||||
NULL,
|
||||
steps, sleep_ms);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue