[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