[PATCH libinput] touchpad: ignore hovering touches for the software button state
Hans de Goede
hdegoede at redhat.com
Wed Mar 1 09:05:52 UTC 2017
HI,
On 01-03-17 02:48, Peter Hutterer wrote:
> If a touch started hovering in the main area, the button state would start
> with AREA and never move to the real button state, despite the finger
> triggering the pressure thresholds correctly in one of the areas.
>
> This could even happen across touch sequences if a touch went below pressure
> in the software button area, it changed to hovering and the button state
> changed to NONE. On the next event, the touch is still hovering and the
> current position of the touch is taken for the button state machine.
>
> https://bugs.freedesktop.org/show_bug.cgi?id=99976
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Patch looks good to me:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> ---
> src/evdev-mt-touchpad-buttons.c | 2 +-
> test/test-touchpad-buttons.c | 32 ++++++++++++++++++++++++++++++++
> 2 files changed, 33 insertions(+), 1 deletion(-)
>
> diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c
> index 176b431..895cf0e 100644
> --- a/src/evdev-mt-touchpad-buttons.c
> +++ b/src/evdev-mt-touchpad-buttons.c
> @@ -457,7 +457,7 @@ tp_button_handle_state(struct tp_dispatch *tp, uint64_t time)
> struct tp_touch *t;
>
> tp_for_each_touch(tp, t) {
> - if (t->state == TOUCH_NONE)
> + if (t->state == TOUCH_NONE || t->state == TOUCH_HOVERING)
> continue;
>
> if (t->state == TOUCH_END) {
> diff --git a/test/test-touchpad-buttons.c b/test/test-touchpad-buttons.c
> index 820d8f0..0037ba7 100644
> --- a/test/test-touchpad-buttons.c
> +++ b/test/test-touchpad-buttons.c
> @@ -1476,6 +1476,37 @@ START_TEST(clickpad_softbutton_right_to_left)
> }
> END_TEST
>
> +START_TEST(clickpad_softbutton_hover_into_buttons)
> +{
> + struct litest_device *dev = litest_current_device();
> + struct libinput *li = dev->libinput;
> +
> + litest_drain_events(li);
> +
> + litest_hover_start(dev, 0, 50, 50);
> + libinput_dispatch(li);
> + litest_hover_move_to(dev, 0, 50, 50, 90, 90, 10, 0);
> + libinput_dispatch(li);
> +
> + litest_touch_move_to(dev, 0, 90, 90, 91, 91, 1, 0);
> +
> + litest_button_click(dev, BTN_LEFT, true);
> + libinput_dispatch(li);
> +
> + litest_assert_button_event(li,
> + BTN_RIGHT,
> + LIBINPUT_BUTTON_STATE_PRESSED);
> + litest_assert_empty_queue(li);
> +
> + litest_button_click(dev, BTN_LEFT, false);
> + litest_touch_up(dev, 0);
> +
> + litest_assert_button_event(li,
> + BTN_RIGHT,
> + LIBINPUT_BUTTON_STATE_RELEASED);
> +}
> +END_TEST
> +
> START_TEST(clickpad_topsoftbuttons_left)
> {
> struct litest_device *dev = litest_current_device();
> @@ -1962,6 +1993,7 @@ litest_setup_tests_touchpad_buttons(void)
> litest_add("touchpad:softbutton", clickpad_softbutton_left_2nd_fg_move, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
> litest_add("touchpad:softbutton", clickpad_softbutton_left_to_right, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
> litest_add("touchpad:softbutton", clickpad_softbutton_right_to_left, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
> + litest_add("touchpad:softbutton", clickpad_softbutton_hover_into_buttons, LITEST_CLICKPAD|LITEST_HOVER, LITEST_APPLE_CLICKPAD);
>
> litest_add("touchpad:topsoftbuttons", clickpad_topsoftbuttons_left, LITEST_TOPBUTTONPAD, LITEST_ANY);
> litest_add("touchpad:topsoftbuttons", clickpad_topsoftbuttons_right, LITEST_TOPBUTTONPAD, LITEST_ANY);
>
More information about the wayland-devel
mailing list