From bd7f7e8a08777ae3f9b9097a38ca666b948c9b3a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 20 Aug 2014 11:11:28 +1000 Subject: [PATCH] evdev: drop the button count when releasing keys on remove We previously called this function only before device removal, so failing to update the button state didn't matter. To make this function generic for the device suspend/resume, we need to keep track of the button/key count properly. If we have a key down multiple times on suspend though, log a bug. The dispatch should release the keys before we even get here (functionality added in a subsequent patch). Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- src/evdev.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index 3a5d8742..44849691 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1210,20 +1210,29 @@ release_pressed_keys(struct evdev_device *device) return; for (code = 0; code < KEY_CNT; code++) { - if (get_key_down_count(device, code) > 0) { + int count = get_key_down_count(device, code); + + if (count > 1) { + log_bug_libinput(libinput, + "Key %d is down %d times.\n", + code, + 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: - keyboard_notify_key( - &device->base, + evdev_keyboard_notify_key( + device, time, code, LIBINPUT_KEY_STATE_RELEASED); break; case EVDEV_KEY_TYPE_BUTTON: - pointer_notify_button( - &device->base, + evdev_pointer_notify_button( + device, time, code, LIBINPUT_BUTTON_STATE_RELEASED); -- 2.34.1