diff options
author | Daniel Stone <daniel@fooishbar.org> | 2012-05-30 16:32:03 +0100 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-05-31 15:48:24 -0400 |
commit | 9a9ee2c779c8390e6d82e9d61873c5425dd109ab (patch) | |
tree | cd179ed06d36047d7fbaf430d57f9ebea5550169 | |
parent | 74419a2237cb24fc99a7db0f012377ff3236040f (diff) |
Split XKB keymap compilation out into separate function
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
-rw-r--r-- | src/compositor.c | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/src/compositor.c b/src/compositor.c index 573f765..e15f1ed 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -2242,6 +2242,28 @@ static int weston_compositor_xkb_init(struct weston_compositor *ec, if (!ec->xkb_info.names.layout) ec->xkb_info.names.layout = strdup("us"); + return 0; +} + +static void weston_compositor_xkb_destroy(struct weston_compositor *ec) +{ + free((char *) ec->xkb_info.names.rules); + free((char *) ec->xkb_info.names.model); + free((char *) ec->xkb_info.names.layout); + free((char *) ec->xkb_info.names.variant); + free((char *) ec->xkb_info.names.options); + + if (ec->xkb_info.keymap) + xkb_map_unref(ec->xkb_info.keymap); + xkb_context_unref(ec->xkb_info.context); +} + +static int +weston_compositor_build_global_keymap(struct weston_compositor *ec) +{ + if (ec->xkb_info.keymap != NULL) + return 0; + ec->xkb_info.keymap = xkb_map_new_from_names(ec->xkb_info.context, &ec->xkb_info.names, 0); if (ec->xkb_info.keymap == NULL) { @@ -2266,16 +2288,19 @@ static int weston_compositor_xkb_init(struct weston_compositor *ec, return 0; } -static void weston_compositor_xkb_destroy(struct weston_compositor *ec) +WL_EXPORT void +weston_seat_init_keyboard(struct weston_seat *seat) { - xkb_map_unref(ec->xkb_info.keymap); - xkb_context_unref(ec->xkb_info.context); + if (seat->has_keyboard) + return; - free((char *) ec->xkb_info.names.rules); - free((char *) ec->xkb_info.names.model); - free((char *) ec->xkb_info.names.layout); - free((char *) ec->xkb_info.names.variant); - free((char *) ec->xkb_info.names.options); + if (weston_compositor_build_global_keymap(seat->compositor) == -1) + return; + + wl_keyboard_init(&seat->keyboard); + wl_seat_set_keyboard(&seat->seat, &seat->keyboard); + + seat->has_keyboard = 1; } WL_EXPORT void @@ -2291,18 +2316,6 @@ weston_seat_init_pointer(struct weston_seat *seat) } WL_EXPORT void -weston_seat_init_keyboard(struct weston_seat *seat) -{ - if (seat->has_keyboard) - return; - - wl_keyboard_init(&seat->keyboard); - wl_seat_set_keyboard(&seat->seat, &seat->keyboard); - - seat->has_keyboard = 1; -} - -WL_EXPORT void weston_seat_init_touch(struct weston_seat *seat) { if (seat->has_touch) |