Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
 src/evdev-mt-touchpad-tap.c | 23 ++++++++++++++++++++++-
 src/evdev-mt-touchpad.c     | 22 +++++++++++-----------
 src/evdev-mt-touchpad.h     |  1 +
 3 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/src/evdev-mt-touchpad-tap.c b/src/evdev-mt-touchpad-tap.c
index 7ac592b..bc7acbd 100644
--- a/src/evdev-mt-touchpad-tap.c
+++ b/src/evdev-mt-touchpad-tap.c
@@ -504,6 +504,7 @@ int
 tp_tap_handle_state(struct tp_dispatch *tp, uint32_t time)
 {
        struct tp_touch *t;
+       int filter_motion = 0;
 
        if (tp->queued & TOUCHPAD_EVENT_BUTTON_PRESS)
                tp_tap_handle_event(tp, TAP_EVENT_BUTTON, time);
@@ -521,7 +522,27 @@ tp_tap_handle_state(struct tp_dispatch *tp, uint32_t time)
                        tp_tap_handle_event(tp, TAP_EVENT_MOTION, time);
        }
 
-       return 0;
+       /**
+        * In any state where motion exceeding the move threshold would
+        * move to the next state, filter that motion until we actually
+        * exceed it. This prevents small motion events while we're waiting
+        * on a decision if a tap is a tap.
+        */
+       switch (tp->tap.state) {
+       case TAP_STATE_TOUCH:
+       case TAP_STATE_TAPPED:
+       case TAP_STATE_DRAGGING_OR_DOUBLETAP:
+       case TAP_STATE_TOUCH_2:
+       case TAP_STATE_TOUCH_3:
+               filter_motion = 1;
+               break;
+
+       default:
+               break;
+
+       }
+
+       return filter_motion;
 }
 
 static void
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index d1268f6..873ddf0 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -369,20 +369,20 @@ tp_post_events(struct tp_dispatch *tp, uint32_t time)
                return;
        }
 
-       tp_tap_handle_state(tp, time);
-
-       if (t->history.count < 4)
+       if (tp_tap_handle_state(tp, time) != 0)
                return;
 
-       tp_get_delta(t, &dx, &dy);
-       tp_filter_motion(tp, &dx, &dy, time);
+       if (t->history.count >= TOUCHPAD_MIN_SAMPLES) {
+               tp_get_delta(t, &dx, &dy);
+               tp_filter_motion(tp, &dx, &dy, time);
 
-       if (dx != 0 || dy != 0)
-               pointer_notify_motion(
-                       &tp->device->base,
-                       time,
-                       li_fixed_from_double(dx),
-                       li_fixed_from_double(dy));
+               if (dx != 0 || dy != 0)
+                       pointer_notify_motion(
+                               &tp->device->base,
+                               time,
+                               li_fixed_from_double(dx),
+                               li_fixed_from_double(dy));
+       }
 
        tp_post_button_events(tp, time);
 }
diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
index 973b478..a5cfaa6 100644
--- a/src/evdev-mt-touchpad.h
+++ b/src/evdev-mt-touchpad.h
@@ -30,6 +30,7 @@
 #include "filter.h"
 
 #define TOUCHPAD_HISTORY_LENGTH 4
+#define TOUCHPAD_MIN_SAMPLES 4
 
 enum touchpad_event {
        TOUCHPAD_EVENT_NONE             = 0,
-- 
1.8.4.2

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to