From fee0827a9a695600765f3d04376fc9babe497401 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Fri, 20 Nov 2015 15:37:31 +0000 Subject: [PATCH] XWayland: Use FocusIn events for keyboard enter wl_keyboard::enter is the equivalent of FocusIn + KeymapNotify: it notifies us that the surface/window has now received the focus, and provides us a set of keys which are currently down. We should use these keys to update the current state, but not to send any events to clients. Signed-off-by: Daniel Stone Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- hw/xwayland/xwayland-input.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c index 0515eb950..473f30602 100644 --- a/hw/xwayland/xwayland-input.c +++ b/hw/xwayland/xwayland-input.c @@ -432,7 +432,7 @@ keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, wl_array_copy(&xwl_seat->keys, keys); wl_array_for_each(k, &xwl_seat->keys) - QueueKeyboardEvents(xwl_seat->keyboard, KeyPress, *k + 8); + QueueKeyboardEvents(xwl_seat->keyboard, KeymapNotify, *k + 8); } static void @@ -444,6 +444,10 @@ keyboard_handle_leave(void *data, struct wl_keyboard *keyboard, xwl_seat->xwl_screen->serial = serial; + /* Unlike keymap_handle_enter above, this time we _do_ want to trigger + * full release, as we don't know how long we'll be out of focus for. + * Notify clients that the keys have been released, disable autorepeat, + * etc. */ wl_array_for_each(k, &xwl_seat->keys) QueueKeyboardEvents(xwl_seat->keyboard, KeyRelease, *k + 8);