[PATCH 1/4] input: Add core API to update the keymap
Rui Matos
tiagomatos at gmail.com
Mon Oct 7 15:32:16 CEST 2013
How and when to update the keymap is left to each backend.
---
src/compositor.h | 2 ++
src/input.c | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 40 insertions(+)
diff --git a/src/compositor.h b/src/compositor.h
index a19d966..041758a 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1115,6 +1115,8 @@ void
weston_seat_init_touch(struct weston_seat *seat);
void
weston_seat_repick(struct weston_seat *seat);
+void
+weston_seat_update_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap);
void
weston_seat_release(struct weston_seat *seat);
diff --git a/src/input.c b/src/input.c
index 1313b52..e769554 100644
--- a/src/input.c
+++ b/src/input.c
@@ -1623,6 +1623,44 @@ weston_compositor_xkb_destroy(struct weston_compositor *ec)
}
#endif
+WL_EXPORT void
+weston_seat_update_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
+{
+ struct wl_resource *resource;
+
+ if (!seat->keyboard)
+ return;
+
+#ifdef ENABLE_XKBCOMMON
+ if (seat->compositor->use_xkbcommon) {
+ if (seat->xkb_info != NULL)
+ weston_xkb_info_destroy(seat->xkb_info);
+ seat->xkb_info = weston_xkb_info_create(keymap);
+ if (seat->xkb_info == NULL) {
+ weston_log("failed to create XKB info\n");
+ return;
+ }
+
+ if (seat->xkb_state.state != NULL)
+ xkb_state_unref(seat->xkb_state.state);
+ seat->xkb_state.state = xkb_state_new(seat->xkb_info->keymap);
+ if (seat->xkb_state.state == NULL) {
+ weston_log("failed to initialise XKB state\n");
+ return;
+ }
+
+ wl_resource_for_each(resource, &seat->keyboard->resource_list) {
+ wl_keyboard_send_keymap(resource,
+ WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
+ seat->xkb_info->keymap_fd,
+ seat->xkb_info->keymap_size);
+ }
+
+ notify_modifiers(seat, wl_display_next_serial(seat->compositor->wl_display));
+ }
+#endif
+}
+
WL_EXPORT int
weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
{
--
1.8.3.1
More information about the wayland-devel
mailing list