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 <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Peter Hutterer 2014-08-20 11:11:28 +10:00
parent 20831877d0
commit bd7f7e8a08

View 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);