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