static int _e_comp_wl_hooks_delete = 0;
static int _e_comp_wl_hooks_walking = 0;
-static Eina_Hash *_last_keydev_hash = NULL;
-
static Eina_Inlist *_e_comp_wl_hooks[] =
{
[E_COMP_WL_HOOK_SHELL_SURFACE_READY] = NULL,
{
if (!ch->delete_me) continue;
_e_comp_wl_hooks[x] = eina_inlist_remove(_e_comp_wl_hooks[x], EINA_INLIST_GET(ch));
- free(ch);
+ free(ch);
}
}
e_comp_wl->wl.gl = NULL;
}
-static void
-_e_comp_wl_client_cb_destroy(struct wl_listener *l, void *data)
-{
- struct wl_client *client = (struct wl_client *)data;
-
- eina_hash_del_by_key(_last_keydev_hash, client);
-
- wl_list_remove(&l->link);
- E_FREE(l);
-}
-
-static void
-_e_comp_wl_client_destroy_listener_add(struct wl_client *client)
-{
- struct wl_listener *destroy_listener;
-
- EINA_SAFETY_ON_NULL_RETURN(client);
- destroy_listener = wl_client_get_destroy_listener(client, _e_comp_wl_client_cb_destroy);
- if (destroy_listener) return;
-
- destroy_listener = E_NEW(struct wl_listener, 1);
- EINA_SAFETY_ON_NULL_RETURN(destroy_listener);
-
- destroy_listener->notify = _e_comp_wl_client_cb_destroy;
- wl_client_add_destroy_listener(client, destroy_listener);
-}
-
-static Eina_Bool
-_e_comp_wl_keydev_hash_free(const Eina_Hash *hash, const void *key, void *data, void *fdata)
-{
- struct wl_listener *destroy_listener;
- struct wl_client *wc;
-
- wc = (struct wl_client *)key;
-
- destroy_listener = wl_client_get_destroy_listener(wc, _e_comp_wl_client_cb_destroy);
-
- if (destroy_listener)
- {
- wl_list_remove(&destroy_listener->link);
- E_FREE(destroy_listener);
- }
-
- return EINA_TRUE;
-}
-
/* public functions */
/**
E_LIST_HOOK_APPEND(hooks, E_CLIENT_HOOK_UNICONIFY, _e_comp_wl_client_cb_uniconify, NULL);
E_EVENT_WAYLAND_GLOBAL_ADD = ecore_event_type_new();
- _last_keydev_hash = eina_hash_pointer_new(NULL);
TRACE_DS_END();
return EINA_TRUE;
#endif
e_comp_wl_remote_surface_shutdown();
- eina_hash_foreach(_last_keydev_hash, _e_comp_wl_keydev_hash_free, NULL);
- eina_hash_free(_last_keydev_hash);
-
e_pixmap_shutdown();
e_comp_wl_shell_shutdown();
e_comp_wl->outputs = eina_list_append(e_comp_wl->outputs, output);
- output->global =
+ output->global =
wl_global_create(e_comp_wl->wl.disp, &wl_output_interface,
2, output, _e_comp_wl_cb_output_bind);
}
static void
-_e_comp_wl_key_send(Ecore_Event_Key *ev, enum wl_keyboard_key_state state, Eina_List *key_list, Eina_Bool focused)
+_e_comp_wl_key_send(Ecore_Event_Key *ev, enum wl_keyboard_key_state state, Eina_List *key_list, E_Client *ec)
{
struct wl_resource *res;
Eina_List *l;
uint32_t serial, keycode;
- struct wl_client *wc;
- Ecore_Device *last_dev;
+ struct wl_client *wc = NULL;
E_Comp_Config *comp_conf = NULL;
keycode = (ev->keycode - 8);
comp_conf = e_comp_config_get();
+ if (ec && ec->comp_data && ec->comp_data->surface)
+ wc = wl_resource_get_client(ec->comp_data->surface);
+
EINA_LIST_FOREACH(key_list, l, res)
{
- wc = wl_resource_get_client(res);
- if (!focused && wc != ev->data) continue;
+ if (wl_resource_get_client(res) != wc) continue;
+
TRACE_INPUT_BEGIN(_e_comp_wl_key_send);
- last_dev = eina_hash_find(_last_keydev_hash, wc);
- if (!last_dev)
- {
- _e_comp_wl_client_destroy_listener_add(wc);
- eina_hash_direct_add(_last_keydev_hash, wc, ev->dev);
- _e_comp_wl_send_event_device(ev->data, ev->timestamp, ev->dev, serial);
- }
- else if (last_dev != ev->dev)
- {
- eina_hash_modify(_last_keydev_hash, wc, ev->dev);
- _e_comp_wl_send_event_device(ev->data, ev->timestamp, ev->dev, serial);
- }
+ _e_comp_wl_send_event_device(ev->data, ev->timestamp, ev->dev, serial);
if (comp_conf && comp_conf->input_log_enable)
INF("[Server] Key %s (time: %d)\n", (state ? "Down" : "Up"), ev->timestamp);
e_comp_wl_key_down(Ecore_Event_Key *ev)
{
E_Client *ec = NULL;
- struct wl_client *wc = NULL;
uint32_t keycode;
E_Comp_Wl_Key_Data *end, *k;
}
#endif
- ec = e_client_focused_get();
- if (ec && ec->comp_data && ec->comp_data->surface)
- wc = wl_resource_get_client(ec->comp_data->surface);
-
- if (ev->data)
- {
- if ((wc != ev->data) && (ev->data != (void *)0x1))
- {
- _e_comp_wl_key_send(ev, WL_KEYBOARD_KEY_STATE_PRESSED, e_comp_wl->kbd.resources, EINA_FALSE);
- }
- else
- {
- ec = NULL;
- end = (E_Comp_Wl_Key_Data *)e_comp_wl->kbd.routed_keys.data + (e_comp_wl->kbd.routed_keys.size / sizeof(*k));
-
- for (k = e_comp_wl->kbd.routed_keys.data; k < end; k++)
- {
- /* ignore server-generated key repeats */
- if (k->key == keycode)
- {
- return EINA_FALSE;
- }
- }
-
- if (ev->data == (void *)0x1) return EINA_FALSE;
-
- if ((!e_client_action_get()) && (!e_comp->input_key_grabs))
- {
- ec = e_client_focused_get();
- if (ec && ec->comp_data && ec->comp_data->surface && e_comp_wl->kbd.focused)
- {
- _e_comp_wl_key_send(ev, WL_KEYBOARD_KEY_STATE_PRESSED, e_comp_wl->kbd.focused, EINA_TRUE);
-
- /* A key only sent to clients is added to the list */
- e_comp_wl->kbd.routed_keys.size = (const char *)end - (const char *)e_comp_wl->kbd.routed_keys.data;
- if (!(k = wl_array_add(&e_comp_wl->kbd.routed_keys, sizeof(*k))))
- {
- DBG("wl_array_add: Out of memory\n");
- return EINA_FALSE;
- }
- k->key = keycode;
- k->dev = ev->dev;
- }
- }
-
- /* update modifier state */
- e_comp_wl_input_keyboard_state_update(keycode, EINA_TRUE);
- }
-
- return !!ec;
- }
-
- ec = NULL;
-
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++)
ec = e_client_focused_get();
if (ec && ec->comp_data && ec->comp_data->surface && e_comp_wl->kbd.focused)
{
- ev->data = wc;
- _e_comp_wl_key_send(ev, WL_KEYBOARD_KEY_STATE_PRESSED, e_comp_wl->kbd.focused, EINA_TRUE);
+ _e_comp_wl_key_send(ev, WL_KEYBOARD_KEY_STATE_PRESSED, e_comp_wl->kbd.focused, ec);
/* A key only sent to clients is added to the list */
e_comp_wl->kbd.keys.size = (const char *)end - (const char *)e_comp_wl->kbd.keys.data;
e_comp_wl_key_up(Ecore_Event_Key *ev)
{
E_Client *ec = NULL;
- struct wl_client *wc = NULL;
uint32_t keycode, delivered_key;
E_Comp_Wl_Key_Data *end, *k;
return EINA_FALSE;
}
- ec = e_client_focused_get();
-
- if (ec && ec->comp_data && ec->comp_data->surface)
- wc = wl_resource_get_client(ec->comp_data->surface);
-
- if (ev->data)
- {
- end = (E_Comp_Wl_Key_Data *)e_comp_wl->kbd.routed_keys.data + (e_comp_wl->kbd.routed_keys.size / sizeof(*k));
- for (k = e_comp_wl->kbd.routed_keys.data; k < end; k++)
- {
- if (k->key == keycode)
- {
- *k = *--end;
- delivered_key = 1;
- }
- }
- e_comp_wl->kbd.routed_keys.size =
- (const char *)end - (const char *)e_comp_wl->kbd.routed_keys.data;
-
- if (wc != ev->data)
- {
- _e_comp_wl_key_send(ev, WL_KEYBOARD_KEY_STATE_RELEASED, e_comp_wl->kbd.resources, EINA_FALSE);
- }
- else
- {
- ec = NULL;
-
- if ((delivered_key) ||
- ((!e_client_action_get()) && (!e_comp->input_key_grabs)))
- {
- ec = e_client_focused_get();
-
- if (e_comp_wl->kbd.focused)
- {
- _e_comp_wl_key_send(ev, WL_KEYBOARD_KEY_STATE_RELEASED, e_comp_wl->kbd.focused, EINA_FALSE);
- }
- }
-
- /* update modifier state */
- e_comp_wl_input_keyboard_state_update(keycode, EINA_FALSE);
- }
- return !!ec;
- }
-
- ec = NULL;
-
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++)
{
if (e_comp_wl->kbd.focused)
{
- ev->data = wc;
- _e_comp_wl_key_send(ev, WL_KEYBOARD_KEY_STATE_RELEASED, e_comp_wl->kbd.focused, EINA_TRUE);
+ _e_comp_wl_key_send(ev, WL_KEYBOARD_KEY_STATE_RELEASED, e_comp_wl->kbd.focused, ec);
}
}
Eina_Bool
e_keyrouter_event_process(void *event, int type)
{
- Eina_Bool res = EINA_TRUE;
+ Eina_Bool res = EINA_FALSE;
Ecore_Event_Key *ev = event;
KLDBG("[%s] keyname: %s, key: %s, keycode: %d", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
+ e_screensaver_notidle();
+
if (!_e_keyrouter_event_routed_key_check(event, type))
{
-// res = e_comp_wl_key_process(event, type);
goto finish;
}
if (!e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_BEFORE_KEYROUTING, type, ev))
{
- res = EINA_FALSE;
goto finish;
}
if ((ECORE_EVENT_KEY_UP == type) && (!krt->HardKeys[ev->keycode].press_ptr))
{
KLDBG("The release key(%d) isn't a processed by keyrouter!", ev->keycode);
- res = EINA_FALSE;
goto finish;
}
//KLDBG("The key(%d) is going to be sent to the proper wl client(s) !", ev->keycode);
KLDBG("[%s] keyname: %s, key: %s, keycode: %d", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
- if (_e_keyrouter_send_key_events(type, ev))
- res = EINA_FALSE;
+ res = _e_keyrouter_send_key_events(type, ev);
+ if (res) return EINA_FALSE;
finish:
+ res = e_comp_wl_key_process(event, type);
return res;
}
struct wl_resource *
e_keyrouter_util_get_surface_from_eclient(E_Client *client)
{
- EINA_SAFETY_ON_NULL_RETURN_VAL
- (client, NULL);
- EINA_SAFETY_ON_NULL_RETURN_VAL
- (client->comp_data, NULL);
+ if (!client || !client->comp_data) return NULL;
return client->comp_data->wl_surface;
}