static int weston_compositor_xkb_init(struct weston_compositor *ec,
struct xkb_rule_names *names)
{
+ ec->xkb_info.context = xkb_context_new();
+ if (ec->xkb_info.context == NULL) {
+ fprintf(stderr, "failed to create XKB context\n");
+ return -1;
+ }
+
ec->xkb_info.names = *names;
if (!ec->xkb_info.names.rules)
ec->xkb_info.names.rules = strdup("evdev");
if (!ec->xkb_info.names.layout)
ec->xkb_info.names.layout = strdup("us");
+ ec->xkb_info.keymap = xkb_map_new_from_names(ec->xkb_info.context,
+ &ec->xkb_info.names);
+ if (ec->xkb_info.keymap == NULL) {
+ fprintf(stderr, "failed to compile XKB keymap\n");
+ return -1;
+ }
+
+ ec->xkb_info.state = xkb_state_new(ec->xkb_info.keymap);
+ if (ec->xkb_info.state == NULL) {
+ fprintf(stderr, "failed to initialise XKB state\n");
+ return -1;
+ }
+
return 0;
}
static void weston_compositor_xkb_destroy(struct weston_compositor *ec)
{
+ xkb_state_unref(ec->xkb_info.state);
+ xkb_map_unref(ec->xkb_info.keymap);
+ xkb_context_unref(ec->xkb_info.context);
+
free(ec->xkb_info.names.rules);
free(ec->xkb_info.names.model);
free(ec->xkb_info.names.layout);