int fd;
size_t size;
char *area;
+ GMutex keymap_mutex;
} xkb;
struct
Eina_List *l;
/* unreference any existing keymap */
+ g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
if (e_comp_wl->xkb.keymap)
xkb_map_unref(e_comp_wl->xkb.keymap);
+ g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
+
/* unmap any existing keyboard area */
if (e_comp_wl->xkb.area)
munmap(e_comp_wl->xkb.area, e_comp_wl->xkb.size);
latched, locked, 0, 0, group);
/* increment keymap reference */
+ g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
e_comp_wl->xkb.keymap = keymap;
+ g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
/* fetch updated modifiers */
e_comp_wl->kbd.mod_shift =
g_mutex_init(&e_comp_wl->kbd.resource_mutex);
g_mutex_init(&e_comp_wl->kbd.focused_mutex);
+ g_mutex_init(&e_comp_wl->xkb.keymap_mutex);
+
/* get default keyboard repeat rate/delay from configuration */
e_comp_wl->kbd.repeat_delay = e_config->keyboard.repeat_delay;
e_comp_wl->kbd.repeat_rate = e_config->keyboard.repeat_rate;
xkb_state_unref(e_comp_wl->xkb.state);
/* unreference any existing keymap */
+ g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
if (e_comp_wl->xkb.keymap)
xkb_map_unref(e_comp_wl->xkb.keymap);
+ g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
/* unreference any existing context */
if (e_comp_wl->xkb.context)
dont_set_e_input_keymap = EINA_FALSE;
dont_use_xkb_cache = EINA_FALSE;
+
+ g_mutex_clear(&e_comp_wl->xkb.keymap_mutex);
}
EINTERN Eina_Bool
EINA_SAFETY_ON_NULL_RETURN_VAL(name, 0);
EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, 0);
+ g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
keymap = e_comp_wl->xkb.keymap;
+ g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
EINA_SAFETY_ON_NULL_GOTO(keymap, finish);
keysym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS);
DMWRN("generate is not init\n");
return TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER;
}
+
+ g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
if (!e_comp_wl->xkb.keymap)
{
DMWRN("keymap is not ready\n");
+ g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
return TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER;
}
+ g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
EINA_LIST_FOREACH(e_devicemgr->inputgen.kbd_list, l, ddata)
{
EINA_LIST_FOREACH(dev->seats, l2, seat)
EINA_LIST_FOREACH(e_input_seat_evdev_list_get(seat), l3, edev)
{
+ g_mutex_unlock(&edev->xkb.keymap_mutex);
xkb_keymap_unref(edev->xkb.keymap);
edev->xkb.keymap = xkb_keymap_ref(map);
+ g_mutex_unlock(&edev->xkb.keymap_mutex);
xkb_state_unref(edev->xkb.state);
edev->xkb.state = xkb_state_new(map);
}
if (!(input = edev->seat->input)) return;
if (!input->dev->xkb_ctx) return;
+ g_mutex_init(&edev->xkb.keymap_mutex);
+
/* create keymap from xkb context */
+ g_mutex_lock(&edev->xkb.keymap_mutex);
edev->xkb.keymap = _e_input_device_cached_keymap_get(input->dev->xkb_ctx, NULL, 0);
if (!edev->xkb.keymap)
{
+ g_mutex_unlock(&edev->xkb.keymap_mutex);
ERR("Failed to create keymap: %m");
return;
}
+ g_mutex_unlock(&edev->xkb.keymap_mutex);
+
/* create xkb state */
if (!(edev->xkb.state = xkb_state_new(edev->xkb.keymap)))
{
return;
}
+ 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)
edev->xkb.ctrl_mask = 1 << xkb_idx;
edev->xkb.altgr_mask = 1 << xkb_idx;
else
edev->xkb.altgr_mask = 0;
+
+ g_mutex_unlock(&edev->xkb.keymap_mutex);
}
static int
}
/* if shift is active, we need to transform the key to lower */
+ g_mutex_lock(&edev->xkb.keymap_mutex);
if (xkb_state_mod_index_is_active(edev->xkb.state,
xkb_map_mod_get_index(edev->xkb.keymap,
XKB_MOD_NAME_SHIFT),
if (keyname[0] != '\0')
keyname[0] = tolower(keyname[0]);
}
+ g_mutex_unlock(&edev->xkb.keymap_mutex);
if (_device_keysym_translate(sym, edev->xkb.modifiers,
compose_buffer, sizeof(compose_buffer)))
if (edev->caps & E_INPUT_SEAT_KEYBOARD)
{
if (edev->xkb.state) xkb_state_unref(edev->xkb.state);
+ g_mutex_lock(&edev->xkb.keymap_mutex);
if (edev->xkb.keymap) xkb_map_unref(edev->xkb.keymap);
+ g_mutex_unlock(&edev->xkb.keymap_mutex);
}
if (edev->ecore_dev) ecore_device_del(edev->ecore_dev);
unsigned int depressed, latched, locked, group;
Eina_List *pressed_keys;
+ GMutex keymap_mutex;
} xkb;
Eina_Hash *key_remap_hash;
{
if (krt->HardKeys[data->keycode].repeat == EINA_FALSE)
{
+ g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
res = xkb_keymap_key_set_repeats(e_comp_wl->xkb.keymap, data->keycode, 0);
+ g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
if (!res)
{
KLWRN("Failed to set repeat key(%d), value(%d)", data->keycode, 0);