[PATCH libinput v3] touchpad: Fix log_bug_libinput calls on tap enable with fingers down
Peter Hutterer
peter.hutterer at who-t.net
Wed Nov 5 21:36:36 PST 2014
On Wed, Nov 05, 2014 at 10:48:59AM +0100, Hans de Goede wrote:
> Before this commit the tap code deals with enabled being set to false,
> by waiting for tap.state to become IDLE, and then ignoring any events from
> that point on.
>
> This causes a problem when enabled gets set to true again while fingers are
> down, because when in IDLE no release events are expected, so once a release
> event for one of the fingers is send, log_bug_libinput gets called.
>
> This commit fixes this by making enabled use the same mechanism for enabled
> state transitions as the tap suspend / resume code.
>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> --
> Changes in v2:
> -New addition of this patch to patch-set
> Changes in v3:
> -Make tp_tap_enabled_update take the new enabled and suspended value, rather
> then having the caller update them and pass in an old_enabled value.
thanks, series merged and pushed:
6b328c3..1d18a99 master -> master
Cheers,
Peter
> ---
> src/evdev-mt-touchpad-tap.c | 49 +++++++++++++++++++++++++++++++--------------
> 1 file changed, 34 insertions(+), 15 deletions(-)
>
> diff --git a/src/evdev-mt-touchpad-tap.c b/src/evdev-mt-touchpad-tap.c
> index 61c0139..5b197b8 100644
> --- a/src/evdev-mt-touchpad-tap.c
> +++ b/src/evdev-mt-touchpad-tap.c
> @@ -476,9 +476,6 @@ tp_tap_handle_event(struct tp_dispatch *tp,
>
> switch(tp->tap.state) {
> case TAP_STATE_IDLE:
> - if (!tp->tap.enabled)
> - break;
> -
> tp_tap_idle_handle_event(tp, t, event, time);
> break;
> case TAP_STATE_TOUCH:
> @@ -540,13 +537,19 @@ tp_tap_exceeds_motion_threshold(struct tp_dispatch *tp, struct tp_touch *t)
> return dx * dx + dy * dy > threshold * threshold;
> }
>
> +static bool
> +tp_tap_enabled(struct tp_dispatch *tp)
> +{
> + return tp->tap.enabled && !tp->tap.suspended;
> +}
> +
> int
> tp_tap_handle_state(struct tp_dispatch *tp, uint64_t time)
> {
> struct tp_touch *t;
> int filter_motion = 0;
>
> - if (tp->tap.suspended)
> + if (!tp_tap_enabled(tp))
> return 0;
>
> /* Handle queued button pressed events from clickpads. For touchpads
> @@ -623,6 +626,26 @@ tp_tap_handle_timeout(uint64_t time, void *data)
> }
> }
>
> +static void
> +tp_tap_enabled_update(struct tp_dispatch *tp, bool suspended, bool enabled, uint64_t time)
> +{
> + bool was_enabled = tp_tap_enabled(tp);
> +
> + tp->tap.suspended = suspended;
> + tp->tap.enabled = enabled;
> +
> + if (tp_tap_enabled(tp) == was_enabled)
> + return;
> +
> + if (tp_tap_enabled(tp)) {
> + /* Must restart in DEAD if fingers are down atm */
> + tp->tap.state =
> + tp->nfingers_down ? TAP_STATE_DEAD : TAP_STATE_IDLE;
> + } else {
> + tp_release_all_taps(tp, time);
> + }
> +}
> +
> static int
> tp_tap_config_count(struct libinput_device *device)
> {
> @@ -639,13 +662,12 @@ static enum libinput_config_status
> tp_tap_config_set_enabled(struct libinput_device *device,
> enum libinput_config_tap_state enabled)
> {
> - struct evdev_dispatch *dispatch;
> - struct tp_dispatch *tp = NULL;
> + struct evdev_dispatch *dispatch = ((struct evdev_device *) device)->dispatch;
> + struct tp_dispatch *tp = container_of(dispatch, tp, base);
>
> - dispatch = ((struct evdev_device *) device)->dispatch;
> - tp = container_of(dispatch, tp, base);
> -
> - tp->tap.enabled = (enabled == LIBINPUT_CONFIG_TAP_ENABLED);
> + tp_tap_enabled_update(tp, tp->tap.suspended,
> + (enabled == LIBINPUT_CONFIG_TAP_ENABLED),
> + libinput_now(device->seat->libinput));
>
> return LIBINPUT_CONFIG_STATUS_SUCCESS;
> }
> @@ -718,14 +740,11 @@ tp_release_all_taps(struct tp_dispatch *tp, uint64_t now)
> void
> tp_tap_suspend(struct tp_dispatch *tp, uint64_t time)
> {
> - tp->tap.suspended = true;
> - tp_release_all_taps(tp, time);
> + tp_tap_enabled_update(tp, true, tp->tap.enabled, time);
> }
>
> void
> tp_tap_resume(struct tp_dispatch *tp, uint64_t time)
> {
> - tp->tap.suspended = false;
> - /* Must restart in DEAD if fingers are down atm */
> - tp->tap.state = tp->nfingers_down ? TAP_STATE_DEAD : TAP_STATE_IDLE;
> + tp_tap_enabled_update(tp, false, tp->tap.enabled, time);
> }
> --
> 2.1.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
More information about the wayland-devel
mailing list