1 #include "e_keyrouter_intern.h"
2 #include "e_input_intern.h"
3 #include "e_comp_wl_input_intern.h"
4 #include "e_comp_wl_intern.h"
5 #include "e_utils_intern.h"
6 #include "e_screensaver_intern.h"
7 #include "e_config_intern.h"
9 #include <tizen-extension-server-protocol.h>
11 static void _e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev, E_Device *dev);
12 static void _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev, E_Device *dev);
13 static void _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev, E_Device *dev);
14 static void _e_keyrouter_send_key_event(int type, struct wl_resource *surface, struct wl_client *wc, Ecore_Event_Key *ev, E_Device *dev, Eina_Bool focused, unsigned int mode);
16 static Eina_Bool _e_keyrouter_send_key_events_focus(int type, struct wl_resource *surface, Ecore_Event_Key *ev, E_Device *dev, struct wl_resource **delivered_surface);
18 static Eina_Bool _e_keyrouter_is_key_grabbed(int key);
19 static Eina_Bool _e_keyrouter_check_top_visible_window(E_Client *ec_focus, int arr_idx);
22 _e_keyrouter_is_key_grabbed(int key)
24 if (!krt->HardKeys[key].keycode)
28 if (krt->HardKeys[key].excl_ptr ||
29 krt->HardKeys[key].or_excl_ptr ||
30 krt->HardKeys[key].top_ptr ||
31 krt->HardKeys[key].shared_ptr)
40 _e_keyrouter_event_routed_key_check(Ecore_Event_Key *ev, int type)
42 Eina_List *l, *l_next;
45 if ((ev->modifiers != 0) && (type == ECORE_EVENT_KEY_DOWN))
47 KLDBG("Modifier key delivered to Focus window : Key %s(%d)", ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keycode);
48 keycode_data = E_NEW(int, 1);
51 *keycode_data = ev->keycode;
52 krt->ignore_list = eina_list_append(krt->ignore_list, keycode_data);
57 EINA_LIST_FOREACH_SAFE(krt->ignore_list, l, l_next, keycode_data)
59 if (*keycode_data == ev->keycode)
61 KLDBG("Find ignore key, propagate event (%d)\n", ev->keycode);
63 krt->ignore_list = eina_list_remove_list(krt->ignore_list, l);
69 if (krt->max_tizen_hwkeys < ev->keycode)
71 KLWRN("The key(%d) is too larger to process keyrouting: Invalid keycode", ev->keycode);
75 if (!krt->HardKeys[ev->keycode].keycode)
84 _e_keyrouter_key_free(Ecore_Event_Key *ev)
88 eina_stringshare_del(ev->keyname);
89 eina_stringshare_del(ev->key);
90 eina_stringshare_del(ev->string);
91 eina_stringshare_del(ev->compose);
93 if (e_input_thread_mode_get())
95 if (ev->dev) g_object_unref(ev->dev);
99 if (ev->dev) ecore_device_unref(ev->dev);
101 if (ev->data) E_FREE(ev->data);
106 static Ecore_Event_Key *
107 _e_keyrouter_key_create(char *keyname)
109 Ecore_Event_Key *ev_key;
110 E_Keyrouter_Event_Data *key_data;
113 EINA_SAFETY_ON_NULL_RETURN_VAL(keyname, NULL);
115 ev_key = E_NEW(Ecore_Event_Key, 1);
116 EINA_SAFETY_ON_NULL_RETURN_VAL(ev_key, NULL);
118 key_data = E_NEW(E_Keyrouter_Event_Data, 1);
119 EINA_SAFETY_ON_NULL_GOTO(key_data, failed);
121 keycode = e_comp_wl_input_keymap_keyname_to_keycode(keyname);
122 EINA_SAFETY_ON_FALSE_GOTO((0 < keycode && keycode <= krt->max_tizen_hwkeys), failed);
124 ev_key->key = (char *)eina_stringshare_add(keyname);
125 ev_key->keyname = (char *)eina_stringshare_add(ev_key->key);
126 ev_key->compose = (char *)eina_stringshare_add(ev_key->key);
127 ev_key->timestamp = e_util_timestamp_get();
128 ev_key->same_screen = 1;
130 ev_key->window = e_comp->ee_win;
131 ev_key->event_window = e_comp->ee_win;
132 ev_key->root_window = e_comp->ee_win;
133 ev_key->keycode = keycode;
134 ev_key->data = key_data;
139 if (ev_key) E_FREE(ev_key);
140 if (key_data) E_FREE(key_data);
145 _e_keyrouter_key_send(int type, Ecore_Event_Key *ev, E_Device *dev, E_Keyrouter_Key_List_NodePtr key_node)
147 Eina_Bool res_hook = EINA_TRUE;
148 E_Keyrouter_Event_Data *key_data = NULL;
150 if (key_node->focused)
152 res_hook = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_DELIVER_FOCUS, type, ev);
153 key_data = (E_Keyrouter_Event_Data *)ev->data;
155 if (!res_hook || key_data->ignored)
157 KLINF("This hook is called to notify a current key is cancel. Please check why hook returns FALSE or ignored.\n");
160 e_keyrouter_wl_key_send(ev, dev, (type == ECORE_EVENT_KEY_DOWN)?EINA_TRUE:EINA_FALSE,
161 key_node->wc, key_node->surface, key_node->focused);
165 _e_keyrouter_key_cancel(int keycode)
167 Ecore_Event_Key *key_cancel, *key_release;
169 E_Keyrouter_Key_List_NodePtr key_node_data;
171 char *pname = NULL, *cmd = NULL;
172 Eina_List *press_ptr_list = NULL;
174 key_cancel = _e_keyrouter_key_create("Cancel");
175 EINA_SAFETY_ON_NULL_RETURN(key_cancel);
177 keyname = e_comp_wl_input_keymap_keycode_to_keyname(keycode);
178 EINA_SAFETY_ON_NULL_GOTO(keyname, failed);
179 key_release = _e_keyrouter_key_create(keyname);
181 EINA_SAFETY_ON_NULL_GOTO(key_release, failed);
183 press_ptr_list = krt->HardKeys[keycode].press_ptr;
184 EINA_LIST_FREE(press_ptr_list, key_node_data)
186 _e_keyrouter_key_send(ECORE_EVENT_KEY_DOWN, key_cancel, NULL, key_node_data);
187 _e_keyrouter_key_send(ECORE_EVENT_KEY_UP, key_release, NULL, key_node_data);
188 _e_keyrouter_key_send(ECORE_EVENT_KEY_UP, key_cancel, NULL, key_node_data);
190 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
191 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
192 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
193 KLINF("CANCEL : => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
194 key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
195 if(pname) E_FREE(pname);
198 E_FREE(key_node_data);
201 krt->HardKeys[keycode].press_ptr = NULL;
203 _e_keyrouter_key_free(key_cancel);
204 _e_keyrouter_key_free(key_release);
209 if (key_cancel) _e_keyrouter_key_free(key_cancel);
214 _e_keyrouter_long_timer(void *data)
216 E_Keyrouter_Event_Key_Long *ev;
218 ev = E_NEW(E_Keyrouter_Event_Key_Long, 1);
221 krt->longkey.timer = 0;
222 krt->longkey.key = 0;
224 return G_SOURCE_REMOVE;
227 ev->keycode = krt->longkey.key;
229 _e_keyrouter_key_cancel(krt->longkey.key);
230 ecore_event_add(E_KEYROUTER_EVENT_KEY_LONG, ev, NULL, NULL);
232 KLINF("LONGKEY : %s(%d) long press event is generated.\n",
233 krt->HardKeys[krt->longkey.key].keyname, krt->longkey.key);
235 krt->longkey.timer = 0;
237 /* Cancel a longkey to prevent irregal operation */
238 if (krt->composition_key.waiting_timer > 0)
240 g_source_remove(krt->composition_key.waiting_timer);
241 krt->composition_key.waiting_timer = 0;
242 krt->composition_key.key[0] = 0;
243 krt->composition_key.key[1] = 0;
246 return G_SOURCE_REMOVE;
250 _e_keyrouter_long_check(int type, Ecore_Event_Key *ev)
252 if (type == ECORE_EVENT_KEY_DOWN)
254 if (krt->longkey.timer || krt->longkey.key)
256 KLDBG("Already long pressed key(%d) is exist\n", krt->longkey.key);
258 else if (krt->HardKeys[ev->keycode].longkey.enabled)
260 krt->longkey.timer = g_timeout_add(krt->HardKeys[ev->keycode].longkey.time*1000, _e_keyrouter_long_timer, NULL);
262 krt->longkey.key = ev->keycode;
267 if (krt->longkey.timer == 0)
269 /* Already process a long press key. So ignore a long pressed key's release event */
270 if (krt->longkey.key && krt->longkey.key == ev->keycode)
272 krt->longkey.key = 0;
273 return ECORE_CALLBACK_DONE;
275 /* just a short press key event */
276 return ECORE_CALLBACK_PASS_ON;
279 /* Current key event is a short press, so cancel a long press timer. */
280 if (krt->longkey.key == ev->keycode)
282 g_source_remove(krt->longkey.timer);
283 krt->longkey.timer = 0;
284 krt->longkey.key = 0;
288 return ECORE_CALLBACK_PASS_ON;
292 _e_keyrouter_composition_key_event(Eina_Bool pressed)
294 E_Keyrouter_Event_Key_Composition *ev = NULL;
296 ev = E_NEW(E_Keyrouter_Event_Key_Composition, 1);
297 EINA_SAFETY_ON_NULL_RETURN(ev);
299 ev->keys[0] = krt->composition_key.key[0];
300 ev->keys[1] = krt->composition_key.key[1];
302 ev->timestamp = e_util_timestamp_get();
304 KLINF("COMPOSITION_KEY : %s(%d) and %s(%d) composition key %s event is generated (time: %d).\n",
305 krt->HardKeys[ev->keys[0]].keyname, ev->keys[0],
306 krt->HardKeys[ev->keys[1]].keyname, ev->keys[1],
307 pressed?"press":"release", ev->timestamp);
310 ecore_event_add(E_KEYROUTER_EVENT_KEY_COMPOSITION_PRESS, ev, NULL, NULL);
312 ecore_event_add(E_KEYROUTER_EVENT_KEY_COMPOSITION_RELEASE, ev, NULL, NULL);
316 _e_keyrouter_composition_key_timer(void *data)
318 krt->composition_key.key[0] = 0;
319 krt->composition_key.key[1] = 0;
321 krt->composition_key.waiting_timer = 0;
323 return G_SOURCE_REMOVE;
327 _e_keyrouter_composition_key_check(int type, Ecore_Event_Key *ev)
332 if (type == ECORE_EVENT_KEY_DOWN)
334 if (krt->composition_key.waiting_timer)
337 EINA_LIST_FOREACH(krt->HardKeys[krt->composition_key.key[0]].composition_key_list, l, wait_key_data)
339 if (*wait_key_data == ev->keycode)
341 krt->composition_key.key[1] = ev->keycode;
343 g_source_remove(krt->composition_key.waiting_timer);
344 krt->composition_key.waiting_timer = 0;
346 /* Cancel a longkey to prevent irregal operation */
347 if (krt->longkey.timer)
349 g_source_remove(krt->longkey.timer);
350 krt->longkey.timer = 0;
351 krt->longkey.key = 0;
354 _e_keyrouter_key_cancel(krt->composition_key.key[0]);
355 _e_keyrouter_composition_key_event(EINA_TRUE);
357 return ECORE_CALLBACK_DONE;
361 /* Not modkey is pressed, cancel current modkey process */
362 if (krt->composition_key.waiting_timer > 0)
364 g_source_remove(krt->composition_key.waiting_timer);
365 krt->composition_key.waiting_timer = 0;
366 krt->composition_key.key[0] = 0;
367 krt->composition_key.key[1] = 0;
370 else if (!krt->composition_key.key[0] && !krt->composition_key.key[1])
372 if (eina_list_count(krt->HardKeys[ev->keycode].composition_key_list) > 0)
374 krt->composition_key.key[0] = ev->keycode;
375 krt->composition_key.waiting_timer = g_timeout_add(krt->composition_key.waiting_time*1000, _e_keyrouter_composition_key_timer, NULL);
381 if (!krt->composition_key.waiting_timer)
383 /* Already send modkey press and modkey release event is came. */
384 if ((krt->composition_key.key[0] == ev->keycode) ||
385 (krt->composition_key.key[1] == ev->keycode))
387 /* send modkey release event */
388 if (krt->composition_key.key[0] && krt->composition_key.key[1])
390 _e_keyrouter_composition_key_event(EINA_FALSE);
393 if (krt->composition_key.key[0] == ev->keycode)
395 krt->composition_key.key[0] = 0;
399 krt->composition_key.key[1] = 0;
401 return ECORE_CALLBACK_DONE;
403 /* Modkey is not yet pressed */
404 return ECORE_CALLBACK_PASS_ON;
407 /* Not modkey, just key short press */
408 if (krt->composition_key.key[0] == ev->keycode)
410 g_source_remove(krt->composition_key.waiting_timer);
411 krt->composition_key.waiting_timer = 0;
412 krt->composition_key.key[0] = 0;
414 return ECORE_CALLBACK_PASS_ON;
418 return ECORE_CALLBACK_PASS_ON;
422 /* Function for checking the existing grab for a key and sending key event(s) */
424 e_keyrouter_event_process(void *event, E_Device *dev, int type)
426 Eina_Bool res = EINA_FALSE;
427 Ecore_Event_Key *ev = event;
428 E_Keyrouter_Event_Data *key_data;
430 KLDBG("[%s] keyname: %s, key: %s, keycode: %d", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
432 e_screensaver_notidle();
436 KLWRN("%s key (%d) %s is not handled by keyrouter\n", ev->keyname, ev->keycode, (type == ECORE_EVENT_KEY_DOWN) ? "press" : "release");
440 key_data = (E_Keyrouter_Event_Data *)ev->data;
442 if (key_data->client || key_data->surface)
444 e_keyrouter_wl_key_send(ev, dev, (type==ECORE_EVENT_KEY_DOWN)?EINA_TRUE:EINA_FALSE, key_data->client, key_data->surface, EINA_FALSE);
448 if (!_e_keyrouter_event_routed_key_check(event, type))
453 res = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_BEFORE_KEYROUTING, type, ev);
456 if (key_data->ignored) goto finish;
457 if (key_data->client || key_data->surface)
459 e_keyrouter_wl_key_send(ev, dev, (type==ECORE_EVENT_KEY_DOWN)?EINA_TRUE:EINA_FALSE, key_data->client, key_data->surface, EINA_FALSE);
468 //KLDBG("The key(%d) is going to be sent to the proper wl client(s) !", ev->keycode);
469 KLDBG("[%s] keyname: %s, key: %s, keycode: %d", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
470 if (e_config->key_input_ttrace_enable)
472 TRACE_INPUT_BEGIN(_e_keyrouter_send_key_events);
473 ELOGF("INPUT", "_e_keyrouter_send_key_events|B|", NULL);
476 _e_keyrouter_send_key_events(type, ev, dev);
478 if (e_config->key_input_ttrace_enable)
481 ELOGF("INPUT", "_e_keyrouter_send_key_events|E|", NULL);
487 if (e_config->key_input_ttrace_enable)
489 TRACE_INPUT_BEGIN(e_comp_wl_key_process);
490 ELOGF("INPUT", "e_comp_wl_key_process|B|", NULL);
493 res = e_comp_wl_key_process(event, dev, type);
495 if (e_config->key_input_ttrace_enable)
498 ELOGF("INPUT", "e_comp_wl_key_process|E|", NULL);
504 /* Function for sending key events to wl_client(s) */
506 _e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev, E_Device *dev)
508 int pid = 0, keycode = 0;
509 char *pname = NULL, *cmd = NULL;
510 E_Keyrouter_Key_List_NodePtr key_node_data;
513 keycode = ev->keycode;
515 if (krt->isPictureOffEnabled == 1)
517 Eina_List *pic_off_ptr_list = krt->HardKeys[keycode].pic_off_ptr;
518 EINA_LIST_FOREACH(pic_off_ptr_list, l, key_node_data)
522 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev, key_node_data->focused, TIZEN_KEYROUTER_MODE_SHARED);
524 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
525 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
526 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
527 KLINF("PICTURE OFF : %s(%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
528 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keycode, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
530 if(pname) E_FREE(pname);
537 if (!_e_keyrouter_composition_key_check(type, ev))
539 KLINF("Ignore %s(%d) key %s. This key is already processed for composition key.\n", ev->keyname, ev->keycode, ((ECORE_EVENT_KEY_DOWN == type) ? "down" : "up"));
543 if (!_e_keyrouter_long_check(type, ev))
545 if (type == ECORE_EVENT_KEY_UP)
546 KLINF("Ignore %s(%d) key up. This key is already processed for long press.\n", ev->keyname, ev->keycode);
550 if (ECORE_EVENT_KEY_DOWN == type)
552 _e_keyrouter_send_key_events_press(type, ev, dev);
556 _e_keyrouter_send_key_events_release(type, ev, dev);
561 _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev, E_Device *dev)
564 char *pname = NULL, *cmd = NULL;
565 E_Keyrouter_Key_List_NodePtr key_node_data;
566 Eina_Bool res_hook = EINA_TRUE;
567 E_Keyrouter_Event_Data *key_data = NULL;
569 /* Deliver release clean up pressed key list */
570 Eina_List *press_ptr_list = krt->HardKeys[ev->keycode].press_ptr;
571 EINA_LIST_FREE(press_ptr_list, key_node_data)
573 if (key_node_data->focused == EINA_TRUE)
575 res_hook = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_DELIVER_FOCUS, type, ev);
576 key_data = (E_Keyrouter_Event_Data *)ev->data;
580 if (key_data->ignored)
582 E_FREE(key_node_data);
585 if (key_data->surface || key_data->client)
587 _e_keyrouter_send_key_event(type, key_data->surface, key_data->client, ev, dev,
588 EINA_FALSE, TIZEN_KEYROUTER_MODE_PRESSED);
590 pid = e_keyrouter_util_get_pid(key_data->client, key_data->surface);
591 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
592 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
593 KLINF("Release Hook : %s(%s:%d)(Focus: %d)(Status: %d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
594 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
595 key_node_data->status, key_data->surface, key_data->client, pid, pname ?: "Unknown");
596 if(pname) E_FREE(pname);
599 E_FREE(key_node_data);
607 E_FREE(key_node_data);
611 if (key_node_data->status == E_KRT_CSTAT_ALIVE)
613 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev,
614 key_node_data->focused, TIZEN_KEYROUTER_MODE_PRESSED);
616 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
617 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
618 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
619 KLINF("Release Pair : %s(%s:%d)(Focus: %d)(Status: %d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
620 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
621 key_node_data->status, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
622 if(pname) E_FREE(pname);
627 KLINF("Release Skip : %s(%s:%d)(Focus: %d)(Status: %d) => wl_surface (%p) wl_client (%p) process is ungrabbed / dead",
628 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
629 key_node_data->status, key_node_data->surface, key_node_data->wc);
632 E_FREE(key_node_data);
634 krt->HardKeys[ev->keycode].press_ptr = NULL;
638 _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev, E_Device *dev)
640 unsigned int keycode = ev->keycode;
641 struct wl_resource *surface_focus = NULL;
642 E_Client *ec_focus = NULL;
643 struct wl_resource *delivered_surface = NULL;
647 char *pname = NULL, *cmd = NULL;
649 E_Keyrouter_Key_List_NodePtr key_node_data;
651 Eina_List *shared_ptr_list = NULL;
653 ec_focus = e_client_focused_get();
654 surface_focus = e_keyrouter_util_get_surface_from_eclient(ec_focus);
656 if (!_e_keyrouter_is_key_grabbed(ev->keycode))
658 _e_keyrouter_send_key_events_focus(type, surface_focus, ev, dev, &delivered_surface);
662 Eina_List *excl_ptr_list = krt->HardKeys[keycode].excl_ptr;
663 EINA_LIST_FOREACH(excl_ptr_list, l, key_node_data)
667 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev,
668 key_node_data->focused, TIZEN_KEYROUTER_MODE_EXCLUSIVE);
670 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
671 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
672 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
673 KLINF("EXCLUSIVE : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
674 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
675 key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
676 if(pname) E_FREE(pname);
682 Eina_List *or_excl_ptr = krt->HardKeys[keycode].or_excl_ptr;
683 EINA_LIST_FOREACH(or_excl_ptr, l, key_node_data)
687 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev,
688 key_node_data->focused, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE);
690 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
691 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
692 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
693 KLINF("OVERRIDABLE_EXCLUSIVE : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
694 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
695 key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
696 if(pname) E_FREE(pname);
702 // Top position grab must need a focus surface.
705 Eina_List *top_ptr_list = krt->HardKeys[keycode].top_ptr;
706 EINA_LIST_FOREACH(top_ptr_list, l, key_node_data)
710 if ((EINA_FALSE == krt->isWindowStackChanged) && (surface_focus == key_node_data->surface))
712 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
713 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
714 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
716 _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev, dev, key_node_data->focused,
717 TIZEN_KEYROUTER_MODE_TOPMOST);
718 KLINF("TOPMOST (TOP_POSITION) : %s (%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
719 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
720 key_node_data->surface, pid, pname ?: "Unknown");
722 if(pname) E_FREE(pname);
726 krt->isWindowStackChanged = EINA_FALSE;
728 if (_e_keyrouter_check_top_visible_window(ec_focus, keycode))
730 E_Keyrouter_Key_List_NodePtr top_key_node_data = eina_list_data_get(krt->HardKeys[keycode].top_ptr);
731 pid = e_keyrouter_util_get_pid(top_key_node_data->wc, top_key_node_data->surface);
732 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
733 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
735 _e_keyrouter_send_key_event(type, top_key_node_data->surface, NULL, ev, dev, top_key_node_data->focused,
736 TIZEN_KEYROUTER_MODE_TOPMOST);
737 KLINF("TOPMOST (TOP_POSITION) : %s (%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
738 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
739 top_key_node_data->surface, pid, pname ?: "Unknown");
741 if(pname) E_FREE(pname);
751 shared_ptr_list = krt->HardKeys[keycode].shared_ptr;
755 res = _e_keyrouter_send_key_events_focus(type, surface_focus, ev, dev, &delivered_surface);
756 if (delivered_surface)
758 ret = e_keyrouter_wl_add_surface_destroy_listener(delivered_surface);
759 if (ret != TIZEN_KEYROUTER_ERROR_NONE)
761 KLWRN("Failed to add wl_surface to destroy listener (res: %d)", res);
766 shared_ptr_list = krt->HardKeys[keycode].shared_ptr;
767 EINA_LIST_FOREACH(shared_ptr_list, l, key_node_data)
771 if (delivered_surface && key_node_data->surface == delivered_surface)
773 // Check for already delivered surface
774 // do not deliver double events in this case.
779 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev, key_node_data->focused, TIZEN_KEYROUTER_MODE_SHARED);
780 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
781 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
782 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
783 KLINF("SHARED : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
784 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
785 if(pname) E_FREE(pname);
795 _e_keyrouter_send_key_events_focus(int type, struct wl_resource *surface_focus, Ecore_Event_Key *ev, E_Device *dev, struct wl_resource **delivered_surface)
797 Eina_Bool res = EINA_TRUE;
799 char *pname = NULL, *cmd = NULL;
800 E_Keyrouter_Event_Data *key_data;
802 res = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_DELIVER_FOCUS, type, ev);
803 key_data = (E_Keyrouter_Event_Data *)ev->data;
806 if (key_data->ignored)
808 e_keyrouter_prepend_to_keylist(NULL, NULL, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, EINA_TRUE);
811 else if (key_data->surface)
813 *delivered_surface = key_data->surface;
814 e_keyrouter_prepend_to_keylist(key_data->surface, key_data->client, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, EINA_TRUE);
815 res = e_keyrouter_wl_key_send(ev, dev, (type==ECORE_EVENT_KEY_DOWN)?EINA_TRUE:EINA_FALSE, key_data->client, key_data->surface, EINA_FALSE);
817 pid = e_keyrouter_util_get_pid(NULL, key_data->surface);
818 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
819 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
821 KLINF("FOCUS HOOK : %s(%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
822 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
823 key_data->surface, pid, pname ?: "Unknown");
825 if(pname) E_FREE(pname);
832 e_keyrouter_prepend_to_keylist(NULL, NULL, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, EINA_TRUE);
836 pid = e_keyrouter_util_get_pid(NULL, surface_focus);
837 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
838 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
840 _e_keyrouter_send_key_event(type, surface_focus, NULL,ev, dev, EINA_TRUE, TIZEN_KEYROUTER_MODE_SHARED);
841 KLINF("FOCUS DIRECT : %s(%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
842 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, surface_focus, pid, pname ?: "Unknown");
843 *delivered_surface = surface_focus;
844 if(pname) E_FREE(pname);
850 _e_keyrouter_check_top_visible_window(E_Client *ec_focus, int arr_idx)
852 E_Client *ec_top = NULL;
853 Eina_List *l = NULL, *l_next = NULL;
854 E_Keyrouter_Key_List_NodePtr key_node_data = NULL;
856 ec_top = e_client_top_get();
860 if (ec_top->visibility.obscured != E_VISIBILITY_UNOBSCURED)
862 if (ec_top == ec_focus)
864 KLDBG("Top e_client (%p) is invisible(%d) but focus client", ec_top, ec_top->visible);
867 ec_top = e_client_below_get(ec_top);
871 /* TODO: Check this client is located inside a display boundary */
872 Eina_List *top_ptr_list = krt->HardKeys[arr_idx].top_ptr;
873 EINA_LIST_FOREACH_SAFE(top_ptr_list, l, l_next, key_node_data)
877 if (ec_top == e_client_from_surface_resource(key_node_data->surface))
879 krt->HardKeys[arr_idx].top_ptr = eina_list_promote_list(krt->HardKeys[arr_idx].top_ptr, l);
880 KLDBG("Move a client(e_client: %p, wl_surface: %p) to first index of list(key: %d)",
881 ec_top, key_node_data->surface, arr_idx);
887 if (ec_top == ec_focus)
889 KLDBG("The e_client(%p) is a focus client", ec_top);
893 ec_top = e_client_below_get(ec_top);
898 /* Function for sending key event to wl_client(s) */
900 _e_keyrouter_send_key_event(int type, struct wl_resource *surface, struct wl_client *wc, Ecore_Event_Key *ev, E_Device *dev, Eina_Bool focused, unsigned int mode)
902 struct wl_client *wc_send;
903 Eina_Bool pressed = EINA_FALSE;
905 if (surface == NULL) wc_send = wc;
906 else wc_send = wl_resource_get_client(surface);
910 KLWRN("wl_surface: %p or wl_client: %p returns null wayland client", surface, wc);
914 if (ECORE_EVENT_KEY_DOWN == type)
917 e_keyrouter_prepend_to_keylist(surface, wc, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, focused);
920 if (e_config->key_input_ttrace_enable)
922 TRACE_INPUT_BEGIN(e_keyrouter_wl_key_send);
923 ELOGF("INPUT", "e_keyrouter_wl_key_send|B|", NULL);
926 e_keyrouter_wl_key_send(ev, dev, pressed, wc_send, surface, focused);
928 if (e_config->key_input_ttrace_enable)
931 ELOGF("INPUT", "e_keyrouter_wl_key_send|E|", NULL);
938 e_keyrouter_util_get_surface_from_eclient(E_Client *client)
940 if (!client || !client->comp_data) return NULL;
942 return client->comp_data->wl_surface;
946 e_keyrouter_util_get_pid(struct wl_client *client, struct wl_resource *surface)
951 struct wl_client *cur_client = NULL;
953 if (client) cur_client = client;
954 else if (surface) cur_client = wl_resource_get_client(surface);
955 EINA_SAFETY_ON_NULL_RETURN_VAL(cur_client, 0);
957 wl_client_get_credentials(cur_client, &pid, &uid, &gid);
963 e_keyrouter_util_cmd_get_from_pid(int pid)
966 E_Comp_Connected_Client_Info *cdata;
968 EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, NULL);
970 EINA_LIST_FOREACH(e_comp->connected_clients, l, cdata)
972 if (cdata->pid == pid) return strdup(cdata->name);
979 e_keyrouter_util_process_name_get_from_cmd(char *cmd)
987 for (i = 0; i < len; i++)
989 pbuf = cmd[len - i - 1];
992 pname = &cmd[len - i];
993 return strdup(pname);