}
static void
+_e_comp_wl_keymap_update(struct xkb_keymap *keymap, const char *keymap_path)
+{
+ /* FIXME: will be deprecated after migration */
+ char *tmp;
+ xkb_mod_mask_t latched = 0, locked = 0, group = 0;
+
+ /* unreference any existing keymap */
+ if (e_comp_wl->xkb.keymap)
+ xkb_map_unref(e_comp_wl->xkb.keymap);
+
+ /* unmap any existing keyboard area */
+ if (e_comp_wl->xkb.area)
+ munmap(e_comp_wl->xkb.area, e_comp_wl->xkb.size);
+ if (e_comp_wl->xkb.fd >= 0) close(e_comp_wl->xkb.fd);
+
+ /* unreference any existing keyboard state */
+ if (e_comp_wl->xkb.state)
+ {
+ latched =
+ xkb_state_serialize_mods(e_comp_wl->xkb.state,
+ XKB_STATE_MODS_LATCHED);
+ locked =
+ xkb_state_serialize_mods(e_comp_wl->xkb.state,
+ XKB_STATE_MODS_LOCKED);
+ group =
+ xkb_state_serialize_layout(e_comp_wl->xkb.state,
+ XKB_STATE_LAYOUT_EFFECTIVE);
+ xkb_state_unref(e_comp_wl->xkb.state);
+ }
+
+ /* create a new xkb state */
+ e_comp_wl->xkb.state = xkb_state_new(keymap);
+
+ if (!e_comp_wl->xkb.state)
+ {
+ return;
+ }
+
+ if ((latched) || (locked) || (group))
+ xkb_state_update_mask(e_comp_wl->xkb.state, 0,
+ latched, locked, 0, 0, group);
+
+ /* increment keymap reference */
+ e_comp_wl->xkb.keymap = keymap;
+
+ /* fetch updated modifiers */
+ e_comp_wl->kbd.mod_shift =
+ xkb_map_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
+ e_comp_wl->kbd.mod_caps =
+ xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
+ e_comp_wl->kbd.mod_ctrl =
+ xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
+ e_comp_wl->kbd.mod_alt =
+ xkb_map_mod_get_index(keymap, XKB_MOD_NAME_ALT);
+ e_comp_wl->kbd.mod_super =
+ xkb_map_mod_get_index(keymap, XKB_MOD_NAME_LOGO);
+
+ if (!(tmp = xkb_map_get_as_string(keymap)))
+ {
+ ERR("Could not get keymap string");
+ return;
+ }
+
+ e_comp_wl->xkb.size = strlen(tmp) + 1;
+ e_comp_wl->xkb.fd =
+ _e_comp_wl_input_keymap_fd_get(e_comp_wl->xkb.size);
+ if (e_comp_wl->xkb.fd < 0)
+ {
+ ERR("Could not create keymap file");
+ free(tmp);
+ return;
+ }
+
+ e_comp_wl->xkb.area =
+ mmap(NULL, e_comp_wl->xkb.size, (PROT_READ | PROT_WRITE),
+ MAP_SHARED, e_comp_wl->xkb.fd, 0);
+ if (e_comp_wl->xkb.area == MAP_FAILED)
+ {
+ ERR("Failed to mmap keymap area: %m");
+ free(tmp);
+ return;
+ }
+
+ strncpy(e_comp_wl->xkb.area, tmp, e_comp_wl->xkb.size);
+ free(tmp);
+}
+
+static void
_e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_path)
{
char *tmp;
strncpy(e_comp_input_key->xkb.area, tmp, e_comp_input_key->xkb.size);
free(tmp);
+ _e_comp_wl_keymap_update(keymap, keymap_path);
+
/* send updated keymap */
TRACE_INPUT_BEGIN(wl_keyboard_send_keymap_update);
g_mutex_lock(&e_comp_wl->kbd.resource_mutex);
g_mutex_init(&e_comp_wl->kbd.repeat_delay_mutex);
g_mutex_init(&e_comp_wl->kbd.repeat_rate_mutex);
+ g_mutex_init(&e_comp_wl->xkb.keymap_mutex);
+ g_mutex_init(&e_comp_wl->xkb.state_mutex);
+
/* get default keyboard repeat delay from configuration */
atomic_store(&e_comp_wl->kbd.repeat_delay, e_config->keyboard.repeat_delay);
/* check for valid repeat_delay */
wl_array_release(&e_comp_wl->kbd.routed_keys);
+ /* unmap any existing keyboard area */
+ if (e_comp_wl->xkb.area)
+ munmap(e_comp_wl->xkb.area, e_comp_wl->xkb.size);
+ if (e_comp_wl->xkb.fd >= 0) close(e_comp_wl->xkb.fd);
+
+ /* unreference any existing keyboard state */
+ if (e_comp_wl->xkb.state)
+ xkb_state_unref(e_comp_wl->xkb.state);
+
+ /* unreference any existing keymap */
+ if (e_comp_wl->xkb.keymap)
+ xkb_map_unref(e_comp_wl->xkb.keymap);
+
+ /* unreference any existing context */
+ if (e_comp_wl->xkb.context)
+ xkb_context_unref(e_comp_wl->xkb.context);
+
e_comp_input_shutdown();
/* destroy the global relative pointer resource */
dont_set_e_input_keymap = EINA_FALSE;
dont_use_xkb_cache = EINA_FALSE;
+ g_mutex_clear(&e_comp_wl->xkb.keymap_mutex);
+ g_mutex_clear(&e_comp_wl->xkb.state_mutex);
+
g_mutex_clear(&e_comp_wl->kbd.keys_mutex);
g_mutex_clear(&e_comp_wl->kbd.repeat_delay_mutex);
g_mutex_clear(&e_comp_wl->kbd.repeat_rate_mutex);
e_comp_wl_input_keymap_default_variant_get(),
e_comp_wl_input_keymap_default_options_get(),
ctx, map);
-}
\ No newline at end of file
+}