[PATCH libinput v2 7/9] touchpad: Fix log_bug_libinput calls on tap enable with fingers down
Peter Hutterer
peter.hutterer at who-t.net
Mon Nov 3 21:21:45 PST 2014
On Sun, Sep 28, 2014 at 01:21:06PM +0200, 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.
fwiw, the reason for the approach was that one could disable tapping at any
time without any accidental consequences that can be caused by forcing a
release right then and there.
> 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>
> ---
> src/evdev-mt-touchpad-tap.c | 39 ++++++++++++++++++++++++++++++++-------
> 1 file changed, 32 insertions(+), 7 deletions(-)
>
> diff --git a/src/evdev-mt-touchpad-tap.c b/src/evdev-mt-touchpad-tap.c
> index 61c0139..b549067 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,23 @@ tp_tap_handle_timeout(uint64_t time, void *data)
> }
> }
>
> +static void
> +tp_tap_enabled_updated(struct tp_dispatch *tp, bool old_enabled, uint64_t time)
this is a bit odd, both in naming and the signature. how about passing
suspend and enable in from the callers and then letting this function figure
out the rest. That'd be a bit more obvious I think. So the callers would
be something like:
tp->tap.enabled = false;
tp_tap_enabled_update(tp,
tp->tap.suspended,
tp->tap.enabled,
time);
which is a lot more readable than the old_enabled dance.
(btw, for the future: was_enabled is easier to grasp conceptually than
old_enabled)
Cheers,
Peter
> +{
> + bool enabled = tp_tap_enabled(tp);
> +
> + if (enabled == old_enabled)
> + return;
> +
> + if (enabled) {
> + /* 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)
> {
> @@ -641,11 +661,15 @@ tp_tap_config_set_enabled(struct libinput_device *device,
> {
> struct evdev_dispatch *dispatch;
> struct tp_dispatch *tp = NULL;
> + bool old_enabled;
>
> dispatch = ((struct evdev_device *) device)->dispatch;
> tp = container_of(dispatch, tp, base);
>
> + old_enabled = tp_tap_enabled(tp);
> tp->tap.enabled = (enabled == LIBINPUT_CONFIG_TAP_ENABLED);
> + tp_tap_enabled_updated(tp, old_enabled,
> + libinput_now(device->seat->libinput));
>
> return LIBINPUT_CONFIG_STATUS_SUCCESS;
> }
> @@ -718,14 +742,15 @@ tp_release_all_taps(struct tp_dispatch *tp, uint64_t now)
> void
> tp_tap_suspend(struct tp_dispatch *tp, uint64_t time)
> {
> + bool old_enabled = tp_tap_enabled(tp);
> tp->tap.suspended = true;
> - tp_release_all_taps(tp, time);
> + tp_tap_enabled_updated(tp, old_enabled, time);
> }
>
> void
> tp_tap_resume(struct tp_dispatch *tp, uint64_t time)
> {
> + bool old_enabled = tp_tap_enabled(tp);
> 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_updated(tp, old_enabled, time);
> }
> --
> 2.1.0
More information about the wayland-devel
mailing list