[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