The previous setting of 10 wasn't 10 mm, it was used against the deltas normalized to a 1000DPI mouse, i.e. closer to 4mm. It was also also per-event, so a slow movement or a high-frequency touchpad can struggle to meet the threshold.
Change the trigger to be ~5 mm from the initial touch down, accumulated until we either meet the threshold or the timeout expires. Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- src/evdev-mt-touchpad-edge-scroll.c | 36 +++++++++++++++++++++++++++++++++--- src/evdev-mt-touchpad.h | 2 ++ test/touchpad.c | 6 +++--- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/evdev-mt-touchpad-edge-scroll.c b/src/evdev-mt-touchpad-edge-scroll.c index 28f29c2..8e1997e 100644 --- a/src/evdev-mt-touchpad-edge-scroll.c +++ b/src/evdev-mt-touchpad-edge-scroll.c @@ -34,8 +34,7 @@ avoid accidentally locking in scrolling mode when trying to use the entire touchpad to move the pointer. The user can wait for the timeout to trigger to do a small scroll. */ -/* In mm for touchpads with valid resolution, see tp_init_accel() */ -#define DEFAULT_SCROLL_THRESHOLD 10.0 +#define DEFAULT_SCROLL_THRESHOLD MM_TO_DPI_NORMALIZED(5) enum scroll_event { SCROLL_EVENT_TOUCH, @@ -78,6 +77,8 @@ tp_edge_scroll_set_state(struct tp_dispatch *tp, break; case EDGE_SCROLL_TOUCH_STATE_EDGE_NEW: t->scroll.edge = tp_touch_get_edge(tp, t); + t->scroll.initial_x = t->x; + t->scroll.initial_y = t->y; libinput_timer_set(&t->scroll.timer, t->millis + DEFAULT_SCROLL_LOCK_TIMEOUT); break; @@ -315,6 +316,7 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time) struct tp_touch *t; enum libinput_pointer_axis axis; double dx, dy, *delta; + double initial_dx, initial_dy, *initial_delta; if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_EDGE) return 0; @@ -338,10 +340,12 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time) case EDGE_RIGHT: axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL; delta = &dy; + initial_delta = &initial_dy; break; case EDGE_BOTTOM: axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL; delta = &dx; + initial_delta = &initial_dx; break; default: /* EDGE_RIGHT | EDGE_BOTTOM */ continue; /* Don't know direction yet, skip */ @@ -350,7 +354,33 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time) tp_get_delta(t, &dx, &dy); tp_filter_motion(tp, &dx, &dy, NULL, NULL, time); - if (fabs(*delta) < t->scroll.threshold) + switch (t->scroll.edge_state) { + case EDGE_SCROLL_TOUCH_STATE_NONE: + case EDGE_SCROLL_TOUCH_STATE_AREA: + log_bug_libinput(device->seat->libinput, + "unexpected scroll state %d\n", + t->scroll.edge_state); + break; + case EDGE_SCROLL_TOUCH_STATE_EDGE_NEW: + initial_dx = t->x - t->scroll.initial_x; + initial_dy = t->y - t->scroll.initial_y; + tp_normalize_delta(tp, + &initial_dx, + &initial_dy); + if (fabs(*initial_delta) < t->scroll.threshold) { + *delta = 0.0; + } else { + dx = initial_dx; + dy = initial_dy; + } + break; + case EDGE_SCROLL_TOUCH_STATE_EDGE: + if (fabs(*delta) < t->scroll.threshold) + *delta = 0.0; + break; + } + + if (*delta == 0.0) continue; pointer_notify_axis(device, time, diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index 8ea7d84..500eb59 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -171,6 +171,8 @@ struct tp_touch { int direction; double threshold; struct libinput_timer timer; + int32_t initial_x; /* in device coordinates */ + int32_t initial_y; /* in device coordinates */ } scroll; struct { diff --git a/test/touchpad.c b/test/touchpad.c index 5c8f579..d589d64 100644 --- a/test/touchpad.c +++ b/test/touchpad.c @@ -2105,10 +2105,10 @@ START_TEST(touchpad_edge_scroll_no_motion) litest_drain_events(li); - litest_touch_down(dev, 0, 99, 20); - litest_touch_move_to(dev, 0, 99, 20, 99, 60, 10, 0); + litest_touch_down(dev, 0, 99, 10); + litest_touch_move_to(dev, 0, 99, 10, 99, 70, 10, 0); /* moving outside -> no motion event */ - litest_touch_move_to(dev, 0, 99, 60, 20, 80, 10, 0); + litest_touch_move_to(dev, 0, 99, 70, 20, 80, 10, 0); /* moving down outside edge once scrolling had started -> scroll */ litest_touch_move_to(dev, 0, 20, 80, 40, 99, 10, 0); litest_touch_up(dev, 0); -- 2.1.0 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel