[PATCH libinput 1/7] evdev: log a bug if releasing a key fails, but don't loop forever

Hans de Goede hdegoede at redhat.com
Thu May 21 02:09:38 PDT 2015


Hi,

On 20-05-15 00:52, Peter Hutterer wrote:
> If a physical button is down but releasing said button doesn't actually
> release it, we loop endlessly. Detect that and log a bug instead.
>
> Reproducible: trigger a tap-n-drag on a touchpad device, then remove it.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

The entire set LGTM: Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans

> ---
>   src/evdev.c | 47 ++++++++++++++++++++++++++++-------------------
>   1 file changed, 28 insertions(+), 19 deletions(-)
>
> diff --git a/src/evdev.c b/src/evdev.c
> index 4ce9250..435bc52 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -2330,6 +2330,9 @@ release_pressed_keys(struct evdev_device *device)
>   	for (code = 0; code < KEY_CNT; code++) {
>   		int count = get_key_down_count(device, code);
>
> +		if (count == 0)
> +			continue;
> +
>   		if (count > 1) {
>   			log_bug_libinput(libinput,
>   					 "Key %d is down %d times.\n",
> @@ -2337,25 +2340,31 @@ release_pressed_keys(struct evdev_device *device)
>   					 count);
>   		}
>
> -		while (get_key_down_count(device, code) > 0) {
> -			switch (get_key_type(code)) {
> -			case EVDEV_KEY_TYPE_NONE:
> -				break;
> -			case EVDEV_KEY_TYPE_KEY:
> -				evdev_keyboard_notify_key(
> -					device,
> -					time,
> -					code,
> -					LIBINPUT_KEY_STATE_RELEASED);
> -				break;
> -			case EVDEV_KEY_TYPE_BUTTON:
> -				evdev_pointer_notify_physical_button(
> -					device,
> -					time,
> -					evdev_to_left_handed(device, code),
> -					LIBINPUT_BUTTON_STATE_RELEASED);
> -				break;
> -			}
> +		switch (get_key_type(code)) {
> +		case EVDEV_KEY_TYPE_NONE:
> +			break;
> +		case EVDEV_KEY_TYPE_KEY:
> +			evdev_keyboard_notify_key(
> +				device,
> +				time,
> +				code,
> +				LIBINPUT_KEY_STATE_RELEASED);
> +			break;
> +		case EVDEV_KEY_TYPE_BUTTON:
> +			evdev_pointer_notify_physical_button(
> +				device,
> +				time,
> +				evdev_to_left_handed(device, code),
> +				LIBINPUT_BUTTON_STATE_RELEASED);
> +			break;
> +		}
> +
> +		count = get_key_down_count(device, code);
> +		if (count != 0) {
> +			log_bug_libinput(libinput,
> +					 "Releasing key %d failed.\n",
> +					 code);
> +			break;
>   		}
>   	}
>   }
>


More information about the wayland-devel mailing list