evdev: drop the button count when releasing keys on remove
authorPeter Hutterer <peter.hutterer@who-t.net>
Wed, 20 Aug 2014 01:11:28 +0000 (11:11 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Thu, 18 Sep 2014 01:31:23 +0000 (11:31 +1000)
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 <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
src/evdev.c

index 3a5d874..4484969 100644 (file)
@@ -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);