t = ecore_time_unix_get();
g_mutex_lock(&e_comp_wl->kbd.focused_mutex);
+ g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
EINA_LIST_FOREACH(e_comp_wl->kbd.focused, l, res)
{
wl_array_for_each(k, &e_comp_wl->kbd.keys)
k->key, WL_KEYBOARD_KEY_STATE_PRESSED);
}
}
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
return EINA_FALSE;
}
/* update keyboard modifier state */
+ g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
wl_array_for_each(k, &e_comp_wl->kbd.keys)
e_comp_wl_input_keyboard_state_update(k->key, EINA_FALSE);
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
if (!ec->comp_data->surface) return;
g_mutex_lock(&e_comp_wl->kbd.resource_mutex);
t = ecore_time_unix_get();
g_mutex_lock(&e_comp_wl->kbd.focused_mutex);
+ g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
EINA_LIST_FOREACH_SAFE(e_comp_wl->kbd.focused, l, ll, res)
{
wl_array_for_each(k, &e_comp_wl->kbd.keys)
e_comp_wl->kbd.focused =
eina_list_remove_list(e_comp_wl->kbd.focused, l);
}
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
}
if (!e_foreign_global_init(e_comp_wl->wl.disp))
ELOGF("COMP", "Failed to initialize the e_foreign global", NULL);
- g_mutex_init(&_wl_display_mutex);
-
/* prepend a mouse move event handler to prevent the mouse move event from being delivered to
the other mouse move event handlers when a pointer constraint is activated */
E_LIST_HANDLER_PREPEND(handlers, ECORE_EVENT_MOUSE_MOVE, _e_comp_wl_cb_mouse_move_preventer, NULL);
}
#endif
+ g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
+
end = (E_Comp_Wl_Key_Data *)e_comp_wl->kbd.keys.data + (e_comp_wl->kbd.keys.size / sizeof(*k));
for (k = e_comp_wl->kbd.keys.data; k < end; k++)
/* ignore server-generated key repeats */
if (k->key == keycode)
{
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
return EINA_FALSE;
}
}
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
if ((!e_client_action_get()) && (!e_comp->input_key_grabs))
{
ec = e_client_focused_get();
_e_comp_wl_key_send(ev, dev, WL_KEYBOARD_KEY_STATE_PRESSED, e_comp_wl->kbd.focused, ec);
/* A key only sent to clients is added to the list */
+ g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
e_comp_wl->kbd.keys.size = (const char *)end - (const char *)e_comp_wl->kbd.keys.data;
+
if (!(k = wl_array_add(&e_comp_wl->kbd.keys, sizeof(*k))))
{
DBG("wl_array_add: Out of memory\n");
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
return EINA_FALSE;
}
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
k->key = keycode;
k->dev = ev->dev;
}
return EINA_FALSE;
}
+ g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
+
end = (E_Comp_Wl_Key_Data *)e_comp_wl->kbd.keys.data + (e_comp_wl->kbd.keys.size / sizeof(*k));
for (k = e_comp_wl->kbd.keys.data; k < end; k++)
{
e_comp_wl->kbd.keys.size =
(const char *)end - (const char *)e_comp_wl->kbd.keys.data;
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
/* If a key down event have been sent to clients, send a key up event to client for garantee key event sequence pair. (down/up) */
+ g_mutex_lock(&e_comp->input_key_grabs_mutex);
if ((delivered_key) ||
((!e_client_action_get()) && (!e_comp->input_key_grabs)))
{
}
g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
}
+ g_mutex_unlock(&e_comp->input_key_grabs_mutex);
/* update modifier state */
e_comp_wl_input_keyboard_state_update(keycode, EINA_FALSE);
g_mutex_lock(&ec->comp_data->surface_mutex);
g_mutex_lock(&e_comp_wl->kbd.mod_changed_mutex);
g_mutex_lock(&e_comp_wl->kbd.focused_mutex);
+ g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
EINA_LIST_FOREACH(e_comp_wl->kbd.focused, l, res)
{
wl_keyboard_send_enter(res, serial, ec->comp_data->surface,
e_comp_wl->kbd.mod_locked,
e_comp_wl->kbd.mod_group);
}
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
g_mutex_unlock(&e_comp_wl->kbd.mod_changed_mutex);
g_mutex_unlock(&ec->comp_data->surface_mutex);
g_mutex_init(&e_comp_wl->kbd.mod_changed_mutex);
g_mutex_init(&e_comp_wl->kbd.resource_mutex);
g_mutex_init(&e_comp_wl->kbd.focused_mutex);
+ g_mutex_init(&e_comp_wl->kbd.keys_mutex);
g_mutex_init(&e_comp_wl->xkb.keymap_mutex);
g_mutex_init(&e_comp_wl->xkb.state_mutex);
_e_comp_wl_input_cb_surface_commit,
NULL);
-
+ g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
wl_array_init(&e_comp_wl->kbd.keys);
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
wl_array_init(&e_comp_wl->kbd.routed_keys);
E_EVENT_TEXT_INPUT_PANEL_VISIBILITY_CHANGE = ecore_event_type_new();
wl_resource_destroy(res);
/* destroy e_comp_wl->kbd.keys array */
+ g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
wl_array_release(&e_comp_wl->kbd.keys);
+ g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
wl_array_release(&e_comp_wl->kbd.routed_keys);
/* unmap any existing keyboard area */
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);
}
EINTERN Eina_Bool