touchpad: Drop the scroll direction lock, increase threshold instead
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 23 May 2014 14:06:26 +0000 (16:06 +0200)
committerPeter Hutterer <peter.hutterer@who-t.net>
Wed, 4 Jun 2014 21:58:16 +0000 (07:58 +1000)
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 <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev-mt-touchpad.c

index 26d5f7de4d7e65d94241f0146c0ebabd0c0f5d8a..466cf5e59d4ca9eb8cafe3c42410eb1ca5f8fb19 100644 (file)
@@ -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)