if (e_comp_wl->xkb.fd >= 0) close(e_comp_wl->xkb.fd);
/* unreference any existing keyboard state */
+ g_mutex_lock(&e_comp_wl->xkb.state_mutex);
if (e_comp_wl->xkb.state)
{
latched =
/* create a new xkb state */
e_comp_wl->xkb.state = xkb_state_new(keymap);
- if (!e_comp_wl->xkb.state) return;
+ if (!e_comp_wl->xkb.state)
+ {
+ g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+ return;
+ }
if ((latched) || (locked) || (group))
xkb_state_update_mask(e_comp_wl->xkb.state, 0,
latched, locked, 0, 0, group);
+ g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+
/* increment keymap reference */
g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
e_comp_wl->xkb.keymap = keymap;
g_mutex_init(&e_comp_wl->kbd.focused_mutex);
g_mutex_init(&e_comp_wl->xkb.keymap_mutex);
+ g_mutex_init(&e_comp_wl->xkb.state_mutex);
/* get default keyboard repeat rate/delay from configuration */
e_comp_wl->kbd.repeat_delay = e_config->keyboard.repeat_delay;
if (e_comp_wl->xkb.fd >= 0) close(e_comp_wl->xkb.fd);
/* unreference any existing keyboard state */
+ g_mutex_lock(&e_comp_wl->xkb.state_mutex);
if (e_comp_wl->xkb.state)
xkb_state_unref(e_comp_wl->xkb.state);
+ g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+
/* unreference any existing keymap */
g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
if (e_comp_wl->xkb.keymap)
dont_use_xkb_cache = EINA_FALSE;
g_mutex_clear(&e_comp_wl->xkb.keymap_mutex);
+ g_mutex_clear(&e_comp_wl->xkb.state_mutex);
}
EINTERN Eina_Bool
xkb_layout_index_t grp;
g_mutex_lock(&e_comp_wl->kbd.mod_changed_mutex);
+ g_mutex_lock(&e_comp_wl->xkb.state_mutex);
mod = xkb_state_serialize_mods(e_comp_wl->xkb.state,
XKB_STATE_DEPRESSED);
changed |= grp != e_comp_wl->kbd.mod_group;
e_comp_wl->kbd.mod_group = grp;
+ g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
g_mutex_unlock(&e_comp_wl->kbd.mod_changed_mutex);
return changed;
{
enum xkb_key_direction dir;
- if (!e_comp_wl->xkb.state) return;
+ g_mutex_lock(&e_comp_wl->xkb.state_mutex);
+ if (!e_comp_wl->xkb.state)
+ {
+ g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+ return;
+ }
if (pressed) dir = XKB_KEY_DOWN;
else dir = XKB_KEY_UP;
e_comp_wl->kbd.mod_changed =
xkb_state_update_key(e_comp_wl->xkb.state, keycode + 8, dir);
+ g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+
e_comp_wl_input_keyboard_modifiers_update();
}
EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl->xkb.state, NULL);
+ g_mutex_lock(&e_comp_wl->xkb.state_mutex);
state = e_comp_wl->xkb.state;
+ g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+
sym = xkb_state_key_get_one_sym(state, keycode);
if (sym == XKB_KEY_NoSymbol)
{
g_mutex_unlock(&edev->xkb.keymap_mutex);
+ g_mutex_lock(&edev->xkb.state_mutex);
+
/* create xkb state */
if (!(edev->xkb.state = xkb_state_new(edev->xkb.keymap)))
{
+ g_mutex_unlock(&edev->xkb.state_mutex);
ERR("Failed to create xkb state: %m");
return;
}
+ g_mutex_unlock(&edev->xkb.state_mutex);
+
g_mutex_lock(&edev->xkb.keymap_mutex);
xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, XKB_MOD_NAME_CTRL);
if (xkb_idx != XKB_MOD_INVALID)
{
xkb_mod_mask_t mask;
+ g_mutex_lock(&from->xkb.state_mutex);
+
edev->xkb.depressed =
xkb_state_serialize_mods(from->xkb.state, XKB_STATE_DEPRESSED);
edev->xkb.latched =
edev->xkb.group =
xkb_state_serialize_mods(from->xkb.state, XKB_STATE_EFFECTIVE);
+ g_mutex_unlock(&from->xkb.state_mutex);
+
mask = (edev->xkb.depressed | edev->xkb.latched);
if (mask & from->xkb.ctrl_mask)
return;
}
+ g_mutex_lock(&edev->xkb.state_mutex);
xkb_state_update_key(edev->xkb.state, code,
(state ? XKB_KEY_DOWN : XKB_KEY_UP));
/* get the keysym for this code */
nsyms = xkb_key_get_syms(edev->xkb.state, code, &syms);
+ g_mutex_unlock(&edev->xkb.state_mutex);
+
if (nsyms == 1) sym = syms[0];
/* If no keysym was found, name it "Keycode-NNN" */
/* if shift is active, we need to transform the key to lower */
g_mutex_lock(&edev->xkb.keymap_mutex);
+ g_mutex_lock(&edev->xkb.state_mutex);
if (xkb_state_mod_index_is_active(edev->xkb.state,
xkb_map_mod_get_index(edev->xkb.keymap,
XKB_MOD_NAME_SHIFT),
keyname[0] = tolower(keyname[0]);
}
g_mutex_unlock(&edev->xkb.keymap_mutex);
+ g_mutex_unlock(&edev->xkb.state_mutex);
if (_device_keysym_translate(sym, edev->xkb.modifiers,
compose_buffer, sizeof(compose_buffer)))
if (edev->caps & E_INPUT_SEAT_KEYBOARD)
{
+ g_mutex_lock(&edev->xkb.state_mutex);
if (edev->xkb.state) xkb_state_unref(edev->xkb.state);
+ g_mutex_unlock(&edev->xkb.state_mutex);
+
g_mutex_lock(&edev->xkb.keymap_mutex);
if (edev->xkb.keymap) xkb_map_unref(edev->xkb.keymap);
g_mutex_unlock(&edev->xkb.keymap_mutex);