[PATCH libinput 1/7] evdev: log a bug if releasing a key fails, but don't loop forever
Peter Hutterer
peter.hutterer at who-t.net
Tue May 19 15:52:32 PDT 2015
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>
---
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;
}
}
}
--
2.3.5
More information about the wayland-devel
mailing list