static Eina_Bool
_e_keyrouter_event_routed_key_check(Ecore_Event_Key *ev, int type)
{
- if (ev->data)
- {
- KLDBG("data is exist send to compositor: %p", ev->data);
- return EINA_FALSE;
- }
-
if (ev->modifiers != 0)
{
KLDBG("Modifier key delivered to Focus window : Key %s(%d)", ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keycode);
{
Eina_Bool res = EINA_FALSE;
Ecore_Event_Key *ev = event;
+ E_Keyrouter_Event_Data *key_data;
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();
+ key_data = (E_Keyrouter_Event_Data *)ev->data;
+
+ if (key_data->client || key_data->surface)
+ {
+ e_keyrouter_wl_key_send(ev, (type==ECORE_EVENT_KEY_DOWN)?EINA_TRUE:EINA_FALSE, key_data->client, key_data->surface, EINA_FALSE);
+ return EINA_TRUE;
+ }
+
if (!_e_keyrouter_event_routed_key_check(event, type))
{
- goto finish;
+ goto focus_deliver;
}
- if (!e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_BEFORE_KEYROUTING, type, ev))
+ res = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_BEFORE_KEYROUTING, type, ev);
+ if (res)
+ {
+ if (key_data->client || key_data->surface)
+ {
+ e_keyrouter_wl_key_send(ev, (type==ECORE_EVENT_KEY_DOWN)?EINA_TRUE:EINA_FALSE, key_data->client, key_data->surface, EINA_FALSE);
+ goto finish;
+ }
+ }
+ else
{
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);
- goto finish;
+ goto focus_deliver;
}
//KLDBG("The key(%d) is going to be sent to the proper wl client(s) !", ev->keycode);
res = _e_keyrouter_send_key_events(type, ev);
if (res) return EINA_FALSE;
-finish:
+focus_deliver:
res = e_comp_wl_key_process(event, type);
+finish:
return res;
}
}
else
{
- if (key_node_data->focused == EINA_TRUE)
- {
- res = EINA_FALSE;
- if (key_node_data->status == E_KRT_CSTAT_DEAD)
- {
- ev->data = key_node_data->wc;
- }
- else
- {
- ev->data = (void *)0x1;
- }
- }
+ if (key_node_data->focused == EINA_TRUE) res = EINA_FALSE;
KLINF("Release Pair : %s(%s:%d)(Focus: %d)(Status: %d) => wl_surface (%p) wl_client (%p) process is ungrabbed / dead",
((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
key_node_data->status, key_node_data->surface, key_node_data->wc);
E_Client *ec_focus = NULL;
struct wl_resource *delivered_surface = NULL;
Eina_Bool res = EINA_TRUE;
+ int ret = 0;
int pid = 0;
char *pname = NULL, *cmd = NULL;
res = _e_keyrouter_send_key_events_focus(type, surface_focus, ev, &delivered_surface);
if (delivered_surface)
{
- res = e_keyrouter_wl_add_surface_destroy_listener(delivered_surface);
- if (res != TIZEN_KEYROUTER_ERROR_NONE)
+ ret = e_keyrouter_wl_add_surface_destroy_listener(delivered_surface);
+ if (ret != TIZEN_KEYROUTER_ERROR_NONE)
{
KLWRN("Failed to add wl_surface to destroy listener (res: %d)", res);
}
}
- EINA_LIST_FOREACH(krt->HardKeys[keycode].shared_ptr, l, key_node_data)
+ if (res)
{
- if (key_node_data)
+ EINA_LIST_FOREACH(krt->HardKeys[keycode].shared_ptr, l, key_node_data)
{
- if (delivered_surface && key_node_data->surface == delivered_surface)
- {
- // Check for already delivered surface
- // do not deliver double events in this case.
- continue;
- }
- else
+ if (key_node_data)
{
- _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, key_node_data->focused, TIZEN_KEYROUTER_MODE_SHARED);
- pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
- cmd = e_keyrouter_util_cmd_get_from_pid(pid);
- pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
- KLINF("SHARED : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
- ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
- if(pname) E_FREE(pname);
- if(cmd) E_FREE(cmd);
+ if (delivered_surface && key_node_data->surface == delivered_surface)
+ {
+ // Check for already delivered surface
+ // do not deliver double events in this case.
+ continue;
+ }
+ else
+ {
+ _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, key_node_data->focused, TIZEN_KEYROUTER_MODE_SHARED);
+ pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
+ cmd = e_keyrouter_util_cmd_get_from_pid(pid);
+ pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
+ KLINF("SHARED : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
+ ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
+ if(pname) E_FREE(pname);
+ if(cmd) E_FREE(cmd);
+ }
}
}
}
Eina_Bool res = EINA_TRUE;
int pid = 0;
char *pname = NULL, *cmd = NULL;
+ E_Keyrouter_Event_Data *key_data;
- if (!e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_DELIVER_FOCUS, type, ev))
+ res = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_DELIVER_FOCUS, type, ev);
+ key_data = (E_Keyrouter_Event_Data *)ev->data;
+ if (res)
{
- if (ev->data)
+ if (key_data->surface)
{
- *delivered_surface = ev->data;
- ev->data = wl_resource_get_client(ev->data);
+ *delivered_surface = key_data->surface;
+ res = e_keyrouter_wl_key_send(ev, (type==ECORE_EVENT_KEY_DOWN)?EINA_TRUE:EINA_FALSE, key_data->client, key_data->surface, EINA_TRUE);
+ return res;
}
- return res;
+ }
+ else
+ {
+ return EINA_FALSE;
}
pid = e_keyrouter_util_get_pid(NULL, surface_focus);
#include "e_keyrouter_private.h"
static void
+_e_keyrouter_event_surface_send(struct wl_resource *surface, int key, int mode)
+{
+ Eina_List *l;
+ struct wl_resource *res_data;
+ struct wl_client *wc;
+
+ EINA_SAFETY_ON_NULL_RETURN(krt);
+ EINA_SAFETY_ON_NULL_RETURN(surface);
+
+ wc = wl_resource_get_client(surface);
+ EINA_SAFETY_ON_NULL_RETURN(wc);
+
+ EINA_LIST_FOREACH(krt->resources, l, res_data)
+ {
+ if (wl_resource_get_client(res_data) != wc) continue;
+ if (wl_resource_get_version(res_data) < 2) continue;
+
+ tizen_keyrouter_send_event_surface(res_data, surface, key, mode);
+ }
+}
+
+static void
_e_keyrouter_wl_key_send(Ecore_Event_Key *ev, enum wl_keyboard_key_state state, Eina_List *key_list, Eina_Bool focused, struct wl_client *client, struct wl_resource *surface)
{
struct wl_resource *res;
comp_conf = e_comp_config_get();
+ if (surface && !focused)
+ {
+ _e_keyrouter_event_surface_send(surface, ev->keycode, TIZEN_KEYROUTER_MODE_NONE);
+ }
+
EINA_LIST_FOREACH(key_list, l, res)
{
wc = wl_resource_get_client(res);
EINA_SAFETY_ON_NULL_RETURN_VAL(krt, EINA_FALSE);
- krt->global = wl_global_create(e_comp_wl->wl.disp, &tizen_keyrouter_interface, 1, krt, _e_keyrouter_cb_bind);
+ krt->global = wl_global_create(e_comp_wl->wl.disp, &tizen_keyrouter_interface, 2, krt, _e_keyrouter_cb_bind);
EINA_SAFETY_ON_NULL_RETURN_VAL(krt->global, EINA_FALSE);
#ifdef HAVE_CYNARA