[PATCH weston 6/6] input: Reset keyboard state when releasing last seat keyboard

Jonas Ådahl jadahl at gmail.com
Mon Dec 2 13:05:07 PST 2013


Don't rely on the input driver to properly send button-up events for
every pressed key.

Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
---
 src/input.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/src/input.c b/src/input.c
index a186a4b..76b2698 100644
--- a/src/input.c
+++ b/src/input.c
@@ -1988,6 +1988,29 @@ weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
 	return 0;
 }
 
+static void
+weston_keyboard_reset_state(struct weston_keyboard *keyboard)
+{
+	struct weston_seat *seat = keyboard->seat;
+	struct xkb_state *state;
+
+#ifdef ENABLE_XKBCOMMON
+	if (seat->compositor->use_xkbcommon) {
+		state = xkb_state_new(keyboard->xkb_info->keymap);
+		if (!state) {
+			weston_log("failed to reset XKB state\n");
+			return;
+		}
+		xkb_state_unref(keyboard->xkb_state.state);
+		keyboard->xkb_state.state = state;
+
+		keyboard->xkb_state.leds = 0;
+	}
+#endif
+
+	seat->modifier_state = 0;
+}
+
 WL_EXPORT void
 weston_seat_release_keyboard(struct weston_seat *seat)
 {
@@ -1995,6 +2018,7 @@ weston_seat_release_keyboard(struct weston_seat *seat)
 	if (seat->keyboard_device_count == 0) {
 		weston_keyboard_set_focus(seat->keyboard, NULL);
 		weston_keyboard_cancel_grab(seat->keyboard);
+		weston_keyboard_reset_state(seat->keyboard);
 		seat_send_updated_caps(seat);
 	}
 }
-- 
1.8.1.2



More information about the wayland-devel mailing list