From 90d1ac8d491e97b0244aa19ba6fe0d2ac934b720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 30 Jan 2015 12:23:00 +0800 Subject: [PATCH] libinput: Only forward first and last press and release for a key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keyboard key events will be received from a device where a key has been pressed, even though an equivalent key has been pressed (same key code) on a device connected to the same seat. notify_key() expects to only be called as if there was only one keyboard device associated with the given seat, so to achieve this, ignore every event where forwarding it would result in multiple 'pressed' or 'released' notifications. Signed-off-by: Jonas Ã…dahl Reviewed-by: Peter Hutterer Reviewed-by: Daniel Stone Reviewed-by: Derek Foreman --- src/libinput-device.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/libinput-device.c b/src/libinput-device.c index 5c5b9b90..567e5ea9 100644 --- a/src/libinput-device.c +++ b/src/libinput-device.c @@ -59,6 +59,17 @@ handle_keyboard_key(struct libinput_device *libinput_device, { struct evdev_device *device = libinput_device_get_user_data(libinput_device); + int key_state = + libinput_event_keyboard_get_key_state(keyboard_event); + int seat_key_count = + libinput_event_keyboard_get_seat_key_count(keyboard_event); + + /* Ignore key events that are not seat wide state changes. */ + if ((key_state == LIBINPUT_KEY_STATE_PRESSED && + seat_key_count != 1) || + (key_state == LIBINPUT_KEY_STATE_RELEASED && + seat_key_count != 0)) + return; notify_key(device->seat, libinput_event_keyboard_get_time(keyboard_event),