/* raise client priority */
_e_comp_wl_client_priority_raise(ec);
- e_comp_wl_input_keyboard_enter_send(ec);
wc = wl_resource_get_client(ec->comp_data->surface);
- serial = wl_display_next_serial(e_comp->wl_comp_data->wl.disp);
EINA_LIST_FOREACH(e_comp->wl_comp_data->kbd.resources, l, res)
if (wl_resource_get_client(res) == wc)
- {
- wl_array_for_each(k, &e_comp->wl_comp_data->kbd.keys)
- wl_keyboard_send_key(res, serial, ecore_time_unix_get(),
- *k, WL_KEYBOARD_KEY_STATE_PRESSED);
- }
+ e_comp->wl_comp_data->kbd.focused = eina_list_append(e_comp->wl_comp_data->kbd.focused, res);
+ if (!e_comp->wl_comp_data->kbd.focused) return;
+ e_comp_wl_input_keyboard_enter_send(ec);
+ serial = wl_display_next_serial(e_comp->wl_comp_data->wl.disp);
+ EINA_LIST_FOREACH(e_comp->wl_comp_data->kbd.focused, l, res)
+ wl_array_for_each(k, &e_comp->wl_comp_data->kbd.keys)
+ wl_keyboard_send_key(res, serial, ecore_time_unix_get(),
+ *k, WL_KEYBOARD_KEY_STATE_PRESSED);
}
static void
E_Client *ec;
E_Comp_Wl_Data *cdata;
struct wl_resource *res;
- struct wl_client *wc;
uint32_t serial, *k;
- Eina_List *l;
+ Eina_List *l, *ll;
if (!(ec = data)) return;
if (!eina_list_count(cdata->kbd.resources)) return;
/* send keyboard_leave to all keyboard resources */
- wc = wl_resource_get_client(ec->comp_data->surface);
serial = wl_display_next_serial(cdata->wl.disp);
- EINA_LIST_FOREACH(cdata->kbd.resources, l, res)
+ EINA_LIST_FOREACH_SAFE(cdata->kbd.focused, l, ll, res)
{
- if (wl_resource_get_client(res) != wc) continue;
wl_array_for_each(k, &cdata->kbd.keys)
wl_keyboard_send_key(res, serial, ecore_time_unix_get(),
*k, WL_KEYBOARD_KEY_STATE_RELEASED);
wl_keyboard_send_leave(res, serial, ec->comp_data->surface);
+ e_comp->wl_comp_data->kbd.focused = eina_list_remove_list(e_comp->wl_comp_data->kbd.focused, l);
}
}
if ((!e_client_action_get()) && (!e_comp->input_key_grabs) && (!e_menu_grab_window_get()))
{
ec = e_client_focused_get();
- if (ec && ec->comp_data->surface && cdata->kbd.resources)
+ if (ec && ec->comp_data->surface && cdata->kbd.focused)
{
- struct wl_client *wc;
struct wl_resource *res;
Eina_List *l;
- wc = wl_resource_get_client(ec->comp_data->surface);
serial = wl_display_next_serial(cdata->wl.disp);
- EINA_LIST_FOREACH(cdata->kbd.resources, l, res)
- {
- if (wl_resource_get_client(res) != wc) continue;
- wl_keyboard_send_key(res, serial, ev->timestamp,
- keycode, WL_KEYBOARD_KEY_STATE_PRESSED);
- }
+ EINA_LIST_FOREACH(cdata->kbd.focused, l, res)
+ wl_keyboard_send_key(res, serial, ev->timestamp,
+ keycode, WL_KEYBOARD_KEY_STATE_PRESSED);
}
}
if ((!e_client_action_get()) && (!e_comp->input_key_grabs) && (!e_menu_grab_window_get()))
{
- struct wl_client *wc = NULL;
-
ec = e_client_focused_get();
- if (ec && ec->comp_data->surface)
- {
- wc = wl_resource_get_client(ec->comp_data->surface);
- }
- if (wc && cdata->kbd.resources)
+ if (cdata->kbd.focused)
{
serial = wl_display_next_serial(cdata->wl.disp);
- EINA_LIST_FOREACH(cdata->kbd.resources, l, res)
- {
- if (wl_resource_get_client(res) != wc) continue;
- wl_keyboard_send_key(res, serial, ev->timestamp,
- keycode, WL_KEYBOARD_KEY_STATE_RELEASED);
- }
+ EINA_LIST_FOREACH(cdata->kbd.focused, l, res)
+ wl_keyboard_send_key(res, serial, ev->timestamp,
+ keycode, WL_KEYBOARD_KEY_STATE_RELEASED);
}
}
static void
_e_comp_wl_input_cb_keyboard_unbind(struct wl_resource *resource)
{
+ Eina_List *l, *ll;
+ struct wl_resource *res;
+
e_comp->wl_comp_data->kbd.resources =
eina_list_remove(e_comp->wl_comp_data->kbd.resources, resource);
+ EINA_LIST_FOREACH_SAFE(e_comp->wl_comp_data->kbd.focused, l, ll, res)
+ if (res == resource)
+ e_comp->wl_comp_data->kbd.focused =
+ eina_list_remove_list(e_comp->wl_comp_data->kbd.resources, l);
}
void
e_comp_wl_input_keyboard_enter_send(E_Client *ec)
{
struct wl_resource *res;
- struct wl_client *wc;
Eina_List *l;
uint32_t serial;
if (!ec->comp_data->surface) return;
- if (!eina_list_count(e_comp->wl_comp_data->kbd.resources)) return;
+ if (!e_comp->wl_comp_data->kbd.focused) return;
e_comp_wl_input_keyboard_modifiers_serialize();
- wc = wl_resource_get_client(ec->comp_data->surface);
serial = wl_display_next_serial(e_comp->wl_comp_data->wl.disp);
- EINA_LIST_FOREACH(e_comp->wl_comp_data->kbd.resources, l, res)
+ EINA_LIST_FOREACH(e_comp->wl_comp_data->kbd.focused, l, res)
{
- if (wl_resource_get_client(res) != wc) continue;
wl_keyboard_send_enter(res, serial, ec->comp_data->surface,
&e_comp->wl_comp_data->kbd.keys);
wl_keyboard_send_modifiers(res, serial,
/* destroy keyboard resources */
EINA_LIST_FREE(e_comp->wl_comp_data->kbd.resources, res)
wl_resource_destroy(res);
+ e_comp->wl_comp_data->kbd.resources = eina_list_free(e_comp->wl_comp_data->kbd.resources);
/* destroy touch resources */
EINA_LIST_FREE(e_comp->wl_comp_data->touch.resources, res)
e_comp_wl_input_keyboard_modifiers_serialize();
- if (!eina_list_count(e_comp->wl_comp_data->kbd.resources)) return;
+ if (!e_comp->wl_comp_data->kbd.focused) return;
serial = wl_display_next_serial(e_comp->wl_comp_data->wl.disp);
EINA_LIST_FOREACH(e_comp->wl_comp_data->kbd.resources, l, res)