From 82438a2cf6b147e160fabdf8f5d97161965da39a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 23 May 2014 16:06:26 +0200 Subject: [PATCH] touchpad: Drop the scroll direction lock, increase threshold instead The direction lock was intended to avoid erroneous horizontal scroll events when scrolling vertically (and vice versa). Some testing on my touchpad here shows that it is too easy to accidentally lock the direction when no lock is intended (e.g. moving around an image). And quite hard to figure out what a pure vertical gesture is. I get movements from 90 degrees to 70 degrees for something my brain would consider vertical scrolling. Depending on the hand position, the fingers actually perform a slight curve, not a straight line. Hence - drop the direction lock, but increase the threshold a little. It doesn't totally avoid horizontal scroll events but keeps them minimal. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- src/evdev-mt-touchpad.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 26d5f7de..466cf5e5 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -463,21 +463,18 @@ tp_post_twofinger_scroll(struct tp_dispatch *tp, uint64_t time) tp_filter_motion(tp, &dx, &dy, time); - if (tp->scroll.state == SCROLL_STATE_NONE) { - /* Require at least one px scrolling to start */ - if (dx <= -1.0 || dx >= 1.0) { - tp->scroll.state = SCROLL_STATE_SCROLLING; - tp->scroll.direction |= (1 << LIBINPUT_POINTER_AXIS_HORIZONTAL_SCROLL); - } - - if (dy <= -1.0 || dy >= 1.0) { - tp->scroll.state = SCROLL_STATE_SCROLLING; - tp->scroll.direction |= (1 << LIBINPUT_POINTER_AXIS_VERTICAL_SCROLL); - } - - if (tp->scroll.state == SCROLL_STATE_NONE) - return; + /* Require at least three px scrolling to start */ + if (dy <= -3.0 || dy >= 3.0) { + tp->scroll.state = SCROLL_STATE_SCROLLING; + tp->scroll.direction |= (1 << LIBINPUT_POINTER_AXIS_VERTICAL_SCROLL); } + if (dx <= -3.0 || dx >= 3.0) { + tp->scroll.state = SCROLL_STATE_SCROLLING; + tp->scroll.direction |= (1 << LIBINPUT_POINTER_AXIS_HORIZONTAL_SCROLL); + } + + if (tp->scroll.state == SCROLL_STATE_NONE) + return; /* Stop spurious MOTION events at the end of scrolling */ tp_for_each_touch(tp, t)