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"
8 #include "e_client_intern.h"
9 #include "e_keyrouter_wl_intern.h"
11 #include <tizen-extension-server-protocol.h>
13 static void _e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev, E_Device *dev);
14 static void _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev, E_Device *dev);
15 static void _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev, E_Device *dev);
16 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);
18 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);
20 static Eina_Bool _e_keyrouter_is_key_grabbed(int key);
21 static Eina_Bool _e_keyrouter_check_top_visible_window(E_Client *ec_focus, int arr_idx);
24 _e_keyrouter_is_key_grabbed(int key)
26 g_rec_mutex_lock(&krt->grab_key_mutex);
28 if (!krt->HardKeys[key].keycode)
30 g_rec_mutex_unlock(&krt->grab_key_mutex);
33 if (krt->HardKeys[key].excl_ptr ||
34 krt->HardKeys[key].or_excl_ptr ||
35 krt->HardKeys[key].top_ptr ||
36 krt->HardKeys[key].shared_ptr)
38 g_rec_mutex_unlock(&krt->grab_key_mutex);
42 g_rec_mutex_unlock(&krt->grab_key_mutex);
48 _e_keyrouter_event_routed_key_check(Ecore_Event_Key *ev, int type)
50 Eina_List *l, *l_next;
53 if ((ev->modifiers != 0) && (type == ECORE_EVENT_KEY_DOWN))
55 KLDBG("Modifier key delivered to Focus window : Key %s(%d)", ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keycode);
56 keycode_data = E_NEW(int, 1);
59 *keycode_data = ev->keycode;
60 krt->ignore_list = eina_list_append(krt->ignore_list, keycode_data);
65 EINA_LIST_FOREACH_SAFE(krt->ignore_list, l, l_next, keycode_data)
67 if (*keycode_data == ev->keycode)
69 KLDBG("Find ignore key, propagate event (%d)\n", ev->keycode);
71 krt->ignore_list = eina_list_remove_list(krt->ignore_list, l);
77 if (krt->max_tizen_hwkeys < ev->keycode)
79 KLWRN("The key(%d) is too larger to process keyrouting: Invalid keycode", ev->keycode);
83 g_rec_mutex_lock(&krt->grab_key_mutex);
85 if (!krt->HardKeys[ev->keycode].keycode)
87 g_rec_mutex_unlock(&krt->grab_key_mutex);
91 g_rec_mutex_unlock(&krt->grab_key_mutex);
97 _e_keyrouter_key_free(Ecore_Event_Key *ev)
101 eina_stringshare_del(ev->keyname);
102 eina_stringshare_del(ev->key);
103 eina_stringshare_del(ev->string);
104 eina_stringshare_del(ev->compose);
106 if (e_input_thread_mode_get())
108 if (ev->dev) g_object_unref(ev->dev);
112 if (ev->dev) ecore_device_unref(ev->dev);
114 if (ev->data) E_FREE(ev->data);
119 static Ecore_Event_Key *
120 _e_keyrouter_key_create(char *keyname)
122 Ecore_Event_Key *ev_key;
123 E_Keyrouter_Event_Data *key_data;
126 EINA_SAFETY_ON_NULL_RETURN_VAL(keyname, NULL);
128 ev_key = E_NEW(Ecore_Event_Key, 1);
129 EINA_SAFETY_ON_NULL_RETURN_VAL(ev_key, NULL);
131 key_data = E_NEW(E_Keyrouter_Event_Data, 1);
132 EINA_SAFETY_ON_NULL_GOTO(key_data, failed);
134 keycode = e_comp_wl_input_keymap_keyname_to_keycode(keyname);
135 EINA_SAFETY_ON_FALSE_GOTO((0 < keycode && keycode <= krt->max_tizen_hwkeys), failed);
137 ev_key->key = (char *)eina_stringshare_add(keyname);
138 ev_key->keyname = (char *)eina_stringshare_add(ev_key->key);
139 ev_key->compose = (char *)eina_stringshare_add(ev_key->key);
140 ev_key->timestamp = e_util_timestamp_get();
141 ev_key->same_screen = 1;
143 ev_key->window = e_comp->ee_win;
144 ev_key->event_window = e_comp->ee_win;
145 ev_key->root_window = e_comp->ee_win;
146 ev_key->keycode = keycode;
147 ev_key->data = key_data;
152 if (ev_key) E_FREE(ev_key);
153 if (key_data) E_FREE(key_data);
158 _e_keyrouter_key_send(int type, Ecore_Event_Key *ev, E_Device *dev, E_Keyrouter_Key_List_NodePtr key_node)
160 Eina_Bool res_hook = EINA_TRUE;
161 E_Keyrouter_Event_Data *key_data = NULL;
163 if (key_node->focused)
165 res_hook = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_DELIVER_FOCUS, type, ev);
166 key_data = (E_Keyrouter_Event_Data *)ev->data;
168 if (!res_hook || key_data->ignored)
170 KLINF("This hook is called to notify a current key is cancel. Please check why hook returns FALSE or ignored.\n");
173 e_keyrouter_wl_key_send(ev, dev, (type == ECORE_EVENT_KEY_DOWN)?EINA_TRUE:EINA_FALSE,
174 key_node->wc, key_node->surface, key_node->focused);
178 _e_keyrouter_key_cancel(int keycode)
180 Ecore_Event_Key *key_cancel, *key_release;
182 E_Keyrouter_Key_List_NodePtr key_node_data;
184 char *pname = NULL, *cmd = NULL;
185 Eina_List *press_ptr_list = NULL;
187 key_cancel = _e_keyrouter_key_create("Cancel");
188 EINA_SAFETY_ON_NULL_RETURN(key_cancel);
190 keyname = e_comp_wl_input_keymap_keycode_to_keyname(keycode);
191 EINA_SAFETY_ON_NULL_GOTO(keyname, failed);
192 key_release = _e_keyrouter_key_create(keyname);
194 EINA_SAFETY_ON_NULL_GOTO(key_release, failed);
196 g_rec_mutex_lock(&krt->grab_key_mutex);
197 press_ptr_list = krt->HardKeys[keycode].press_ptr;
198 EINA_LIST_FREE(press_ptr_list, key_node_data)
200 _e_keyrouter_key_send(ECORE_EVENT_KEY_DOWN, key_cancel, NULL, key_node_data);
201 _e_keyrouter_key_send(ECORE_EVENT_KEY_UP, key_release, NULL, key_node_data);
202 _e_keyrouter_key_send(ECORE_EVENT_KEY_UP, key_cancel, NULL, key_node_data);
204 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
205 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
206 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
207 KLINF("CANCEL : => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
208 key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
209 if(pname) E_FREE(pname);
212 E_FREE(key_node_data);
215 krt->HardKeys[keycode].press_ptr = NULL;
216 g_rec_mutex_unlock(&krt->grab_key_mutex);
218 _e_keyrouter_key_free(key_cancel);
219 _e_keyrouter_key_free(key_release);
224 if (key_cancel) _e_keyrouter_key_free(key_cancel);
229 _e_keyrouter_long_timer(void *data)
231 E_Keyrouter_Event_Key_Long *ev;
233 ev = E_NEW(E_Keyrouter_Event_Key_Long, 1);
236 krt->longkey.timer = 0;
237 krt->longkey.key = 0;
239 return G_SOURCE_REMOVE;
242 ev->keycode = krt->longkey.key;
244 _e_keyrouter_key_cancel(krt->longkey.key);
245 ecore_event_add(E_KEYROUTER_EVENT_KEY_LONG, ev, NULL, NULL);
247 KLINF("LONGKEY : %s(%d) long press event is generated.\n",
248 krt->HardKeys[krt->longkey.key].keyname, krt->longkey.key);
250 krt->longkey.timer = 0;
252 /* Cancel a longkey to prevent irregal operation */
253 if (krt->composition_key.waiting_timer > 0)
255 g_source_remove(krt->composition_key.waiting_timer);
256 krt->composition_key.waiting_timer = 0;
257 krt->composition_key.key[0] = 0;
258 krt->composition_key.key[1] = 0;
261 return G_SOURCE_REMOVE;
265 _e_keyrouter_long_check(int type, Ecore_Event_Key *ev)
267 if (type == ECORE_EVENT_KEY_DOWN)
269 if (krt->longkey.timer || krt->longkey.key)
271 KLDBG("Already long pressed key(%d) is exist\n", krt->longkey.key);
273 else if (krt->HardKeys[ev->keycode].longkey.enabled)
275 krt->longkey.timer = g_timeout_add(krt->HardKeys[ev->keycode].longkey.time*1000, _e_keyrouter_long_timer, NULL);
277 krt->longkey.key = ev->keycode;
282 if (krt->longkey.timer == 0)
284 /* Already process a long press key. So ignore a long pressed key's release event */
285 if (krt->longkey.key && krt->longkey.key == ev->keycode)
287 krt->longkey.key = 0;
288 return ECORE_CALLBACK_DONE;
290 /* just a short press key event */
291 return ECORE_CALLBACK_PASS_ON;
294 /* Current key event is a short press, so cancel a long press timer. */
295 if (krt->longkey.key == ev->keycode)
297 g_source_remove(krt->longkey.timer);
298 krt->longkey.timer = 0;
299 krt->longkey.key = 0;
303 return ECORE_CALLBACK_PASS_ON;
307 _e_keyrouter_composition_key_event(Eina_Bool pressed)
309 E_Keyrouter_Event_Key_Composition *ev = NULL;
311 ev = E_NEW(E_Keyrouter_Event_Key_Composition, 1);
312 EINA_SAFETY_ON_NULL_RETURN(ev);
314 ev->keys[0] = krt->composition_key.key[0];
315 ev->keys[1] = krt->composition_key.key[1];
317 ev->timestamp = e_util_timestamp_get();
319 KLINF("COMPOSITION_KEY : %s(%d) and %s(%d) composition key %s event is generated (time: %d).\n",
320 krt->HardKeys[ev->keys[0]].keyname, ev->keys[0],
321 krt->HardKeys[ev->keys[1]].keyname, ev->keys[1],
322 pressed?"press":"release", ev->timestamp);
325 ecore_event_add(E_KEYROUTER_EVENT_KEY_COMPOSITION_PRESS, ev, NULL, NULL);
327 ecore_event_add(E_KEYROUTER_EVENT_KEY_COMPOSITION_RELEASE, ev, NULL, NULL);
331 _e_keyrouter_composition_key_timer(void *data)
333 krt->composition_key.key[0] = 0;
334 krt->composition_key.key[1] = 0;
336 krt->composition_key.waiting_timer = 0;
338 return G_SOURCE_REMOVE;
342 _e_keyrouter_composition_key_check(int type, Ecore_Event_Key *ev)
347 if (type == ECORE_EVENT_KEY_DOWN)
349 if (krt->composition_key.waiting_timer)
352 EINA_LIST_FOREACH(krt->HardKeys[krt->composition_key.key[0]].composition_key_list, l, wait_key_data)
354 if (*wait_key_data == ev->keycode)
356 krt->composition_key.key[1] = ev->keycode;
358 g_source_remove(krt->composition_key.waiting_timer);
359 krt->composition_key.waiting_timer = 0;
361 /* Cancel a longkey to prevent irregal operation */
362 if (krt->longkey.timer)
364 g_source_remove(krt->longkey.timer);
365 krt->longkey.timer = 0;
366 krt->longkey.key = 0;
369 _e_keyrouter_key_cancel(krt->composition_key.key[0]);
370 _e_keyrouter_composition_key_event(EINA_TRUE);
372 return ECORE_CALLBACK_DONE;
376 /* Not modkey is pressed, cancel current modkey process */
377 if (krt->composition_key.waiting_timer > 0)
379 g_source_remove(krt->composition_key.waiting_timer);
380 krt->composition_key.waiting_timer = 0;
381 krt->composition_key.key[0] = 0;
382 krt->composition_key.key[1] = 0;
385 else if (!krt->composition_key.key[0] && !krt->composition_key.key[1])
387 if (eina_list_count(krt->HardKeys[ev->keycode].composition_key_list) > 0)
389 krt->composition_key.key[0] = ev->keycode;
390 krt->composition_key.waiting_timer = g_timeout_add(krt->composition_key.waiting_time*1000, _e_keyrouter_composition_key_timer, NULL);
396 if (!krt->composition_key.waiting_timer)
398 /* Already send modkey press and modkey release event is came. */
399 if ((krt->composition_key.key[0] == ev->keycode) ||
400 (krt->composition_key.key[1] == ev->keycode))
402 /* send modkey release event */
403 if (krt->composition_key.key[0] && krt->composition_key.key[1])
405 _e_keyrouter_composition_key_event(EINA_FALSE);
408 if (krt->composition_key.key[0] == ev->keycode)
410 krt->composition_key.key[0] = 0;
414 krt->composition_key.key[1] = 0;
416 return ECORE_CALLBACK_DONE;
418 /* Modkey is not yet pressed */
419 return ECORE_CALLBACK_PASS_ON;
422 /* Not modkey, just key short press */
423 if (krt->composition_key.key[0] == ev->keycode)
425 g_source_remove(krt->composition_key.waiting_timer);
426 krt->composition_key.waiting_timer = 0;
427 krt->composition_key.key[0] = 0;
429 return ECORE_CALLBACK_PASS_ON;
433 return ECORE_CALLBACK_PASS_ON;
437 /* Function for checking the existing grab for a key and sending key event(s) */
439 e_keyrouter_event_process(void *event, E_Device *dev, int type)
441 Eina_Bool res = EINA_FALSE;
442 Ecore_Event_Key *ev = event;
443 E_Keyrouter_Event_Data *key_data;
445 KLDBG("[%s] keyname: %s, key: %s, keycode: %d", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
447 e_screensaver_notidle();
449 key_data = (E_Keyrouter_Event_Data *)ev->data;
452 KLWRN("%s key (%d) %s is not handled by keyrouter\n", ev->keyname, ev->keycode, (type == ECORE_EVENT_KEY_DOWN) ? "press" : "release");
456 if (key_data->client || key_data->surface)
458 e_keyrouter_wl_key_send(ev, dev, (type==ECORE_EVENT_KEY_DOWN)?EINA_TRUE:EINA_FALSE, key_data->client, key_data->surface, EINA_FALSE);
462 if (!_e_keyrouter_event_routed_key_check(event, type))
467 res = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_BEFORE_KEYROUTING, type, ev);
468 if (!res) goto finish;
469 if (key_data->ignored) goto finish;
471 if (key_data->client || key_data->surface)
473 e_keyrouter_wl_key_send(ev, dev,
474 (type == ECORE_EVENT_KEY_DOWN) ? EINA_TRUE : EINA_FALSE,
475 key_data->client, key_data->surface, EINA_FALSE);
479 //KLDBG("The key(%d) is going to be sent to the proper wl client(s) !", ev->keycode);
480 KLDBG("[%s] keyname: %s, key: %s, keycode: %d", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
481 if (e_config->key_input_ttrace_enable)
483 TRACE_INPUT_BEGIN(_e_keyrouter_send_key_events);
484 ELOGF("INPUT", "_e_keyrouter_send_key_events|B|", NULL);
487 _e_keyrouter_send_key_events(type, ev, dev);
489 if (e_config->key_input_ttrace_enable)
492 ELOGF("INPUT", "_e_keyrouter_send_key_events|E|", NULL);
498 if (e_config->key_input_ttrace_enable)
500 TRACE_INPUT_BEGIN(e_comp_wl_key_process);
501 ELOGF("INPUT", "e_comp_wl_key_process|B|", NULL);
504 res = e_comp_wl_key_process(event, dev, type);
506 if (e_config->key_input_ttrace_enable)
509 ELOGF("INPUT", "e_comp_wl_key_process|E|", NULL);
515 /* Function for sending key events to wl_client(s) */
517 _e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev, E_Device *dev)
519 int pid = 0, keycode = 0;
520 char *pname = NULL, *cmd = NULL;
521 E_Keyrouter_Key_List_NodePtr key_node_data;
524 keycode = ev->keycode;
526 if (krt->isPictureOffEnabled == 1)
528 g_rec_mutex_lock(&krt->grab_key_mutex);
529 Eina_List *pic_off_ptr_list = krt->HardKeys[keycode].pic_off_ptr;
530 EINA_LIST_FOREACH(pic_off_ptr_list, l, key_node_data)
534 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev, key_node_data->focused, TIZEN_KEYROUTER_MODE_SHARED);
536 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
537 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
538 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
539 KLINF("PICTURE OFF : %s(%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
540 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keycode, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
542 if(pname) E_FREE(pname);
546 g_rec_mutex_unlock(&krt->grab_key_mutex);
550 if (!_e_keyrouter_composition_key_check(type, ev))
552 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"));
556 if (!_e_keyrouter_long_check(type, ev))
558 if (type == ECORE_EVENT_KEY_UP)
559 KLINF("Ignore %s(%d) key up. This key is already processed for long press.\n", ev->keyname, ev->keycode);
563 if (ECORE_EVENT_KEY_DOWN == type)
565 _e_keyrouter_send_key_events_press(type, ev, dev);
569 _e_keyrouter_send_key_events_release(type, ev, dev);
574 _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev, E_Device *dev)
577 char *pname = NULL, *cmd = NULL;
578 E_Keyrouter_Key_List_NodePtr key_node_data;
579 Eina_Bool res_hook = EINA_TRUE;
580 E_Keyrouter_Event_Data *key_data = NULL;
582 /* Deliver release clean up pressed key list */
583 g_rec_mutex_lock(&krt->grab_key_mutex);
584 Eina_List *press_ptr_list = krt->HardKeys[ev->keycode].press_ptr;
585 EINA_LIST_FREE(press_ptr_list, key_node_data)
587 if (key_node_data->focused == EINA_TRUE)
589 res_hook = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_DELIVER_FOCUS, type, ev);
590 key_data = (E_Keyrouter_Event_Data *)ev->data;
594 if (key_data->ignored)
596 E_FREE(key_node_data);
599 if (key_data->surface || key_data->client)
601 _e_keyrouter_send_key_event(type, key_data->surface, key_data->client, ev, dev,
602 EINA_FALSE, TIZEN_KEYROUTER_MODE_PRESSED);
604 pid = e_keyrouter_util_get_pid(key_data->client, key_data->surface);
605 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
606 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
607 KLINF("Release Hook : %s(%s:%d)(Focus: %d)(Status: %d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
608 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
609 key_node_data->status, key_data->surface, key_data->client, pid, pname ?: "Unknown");
610 if(pname) E_FREE(pname);
613 E_FREE(key_node_data);
621 E_FREE(key_node_data);
625 if (key_node_data->status == E_KRT_CSTAT_ALIVE)
627 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev,
628 key_node_data->focused, TIZEN_KEYROUTER_MODE_PRESSED);
630 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
631 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
632 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
633 KLINF("Release Pair : %s(%s:%d)(Focus: %d)(Status: %d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
634 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
635 key_node_data->status, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
636 if(pname) E_FREE(pname);
641 KLINF("Release Skip : %s(%s:%d)(Focus: %d)(Status: %d) => wl_surface (%p) wl_client (%p) process is ungrabbed / dead",
642 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
643 key_node_data->status, key_node_data->surface, key_node_data->wc);
646 E_FREE(key_node_data);
648 krt->HardKeys[ev->keycode].press_ptr = NULL;
649 g_rec_mutex_unlock(&krt->grab_key_mutex);
653 _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev, E_Device *dev)
655 unsigned int keycode = ev->keycode;
656 struct wl_resource *surface_focus = NULL;
657 E_Client *ec_focus = NULL;
658 struct wl_resource *delivered_surface = NULL;
662 char *pname = NULL, *cmd = NULL;
664 E_Keyrouter_Key_List_NodePtr key_node_data;
666 Eina_List *shared_ptr_list = NULL;
668 ec_focus = e_client_focused_get();
669 surface_focus = e_keyrouter_util_get_surface_from_eclient(ec_focus);
671 if (!_e_keyrouter_is_key_grabbed(ev->keycode))
673 _e_keyrouter_send_key_events_focus(type, surface_focus, ev, dev, &delivered_surface);
677 g_rec_mutex_lock(&krt->grab_key_mutex);
678 Eina_List *excl_ptr_list = krt->HardKeys[keycode].excl_ptr;
679 EINA_LIST_FOREACH(excl_ptr_list, l, key_node_data)
683 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev,
684 key_node_data->focused, TIZEN_KEYROUTER_MODE_EXCLUSIVE);
686 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
687 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
688 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
689 KLINF("EXCLUSIVE : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
690 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
691 key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
692 if(pname) E_FREE(pname);
694 g_rec_mutex_unlock(&krt->grab_key_mutex);
698 g_rec_mutex_unlock(&krt->grab_key_mutex);
700 g_rec_mutex_lock(&krt->grab_key_mutex);
701 Eina_List *or_excl_ptr = krt->HardKeys[keycode].or_excl_ptr;
702 EINA_LIST_FOREACH(or_excl_ptr, l, key_node_data)
706 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev,
707 key_node_data->focused, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE);
709 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
710 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
711 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
712 KLINF("OVERRIDABLE_EXCLUSIVE : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
713 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
714 key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
715 if(pname) E_FREE(pname);
717 g_rec_mutex_unlock(&krt->grab_key_mutex);
721 g_rec_mutex_unlock(&krt->grab_key_mutex);
723 // Top position grab must need a focus surface.
726 g_rec_mutex_lock(&krt->grab_key_mutex);
727 Eina_List *top_ptr_list = krt->HardKeys[keycode].top_ptr;
728 EINA_LIST_FOREACH(top_ptr_list, l, key_node_data)
732 if ((EINA_FALSE == krt->isWindowStackChanged) && (surface_focus == key_node_data->surface))
734 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
735 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
736 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
738 _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev, dev, key_node_data->focused,
739 TIZEN_KEYROUTER_MODE_TOPMOST);
740 KLINF("TOPMOST (TOP_POSITION) : %s (%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
741 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
742 key_node_data->surface, pid, pname ?: "Unknown");
744 if(pname) E_FREE(pname);
746 g_rec_mutex_unlock(&krt->grab_key_mutex);
749 krt->isWindowStackChanged = EINA_FALSE;
751 if (_e_keyrouter_check_top_visible_window(ec_focus, keycode))
753 E_Keyrouter_Key_List_NodePtr top_key_node_data = eina_list_data_get(krt->HardKeys[keycode].top_ptr);
754 pid = e_keyrouter_util_get_pid(top_key_node_data->wc, top_key_node_data->surface);
755 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
756 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
758 _e_keyrouter_send_key_event(type, top_key_node_data->surface, NULL, ev, dev, top_key_node_data->focused,
759 TIZEN_KEYROUTER_MODE_TOPMOST);
760 KLINF("TOPMOST (TOP_POSITION) : %s (%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
761 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
762 top_key_node_data->surface, pid, pname ?: "Unknown");
764 if(pname) E_FREE(pname);
766 g_rec_mutex_unlock(&krt->grab_key_mutex);
772 g_rec_mutex_unlock(&krt->grab_key_mutex);
776 g_rec_mutex_lock(&krt->grab_key_mutex);
777 shared_ptr_list = krt->HardKeys[keycode].shared_ptr;
778 g_rec_mutex_unlock(&krt->grab_key_mutex);
783 res = _e_keyrouter_send_key_events_focus(type, surface_focus, ev, dev, &delivered_surface);
784 if (delivered_surface)
786 ret = e_keyrouter_wl_add_surface_destroy_listener(delivered_surface);
787 if (ret != TIZEN_KEYROUTER_ERROR_NONE)
789 KLWRN("Failed to add wl_surface to destroy listener (res: %d)", res);
794 g_rec_mutex_lock(&krt->grab_key_mutex);
795 shared_ptr_list = krt->HardKeys[keycode].shared_ptr;
796 EINA_LIST_FOREACH(shared_ptr_list, l, key_node_data)
800 if (delivered_surface && key_node_data->surface == delivered_surface)
802 // Check for already delivered surface
803 // do not deliver double events in this case.
808 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev, key_node_data->focused, TIZEN_KEYROUTER_MODE_SHARED);
809 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
810 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
811 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
812 KLINF("SHARED : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
813 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
814 if(pname) E_FREE(pname);
819 g_rec_mutex_unlock(&krt->grab_key_mutex);
825 _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)
827 Eina_Bool res = EINA_TRUE;
829 char *pname = NULL, *cmd = NULL;
830 E_Keyrouter_Event_Data *key_data;
832 res = e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_DELIVER_FOCUS, type, ev);
833 key_data = (E_Keyrouter_Event_Data *)ev->data;
836 if (key_data->ignored)
838 e_keyrouter_prepend_to_keylist(NULL, NULL, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, EINA_TRUE);
841 else if (key_data->surface)
843 *delivered_surface = key_data->surface;
844 e_keyrouter_prepend_to_keylist(key_data->surface, key_data->client, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, EINA_TRUE);
845 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);
847 pid = e_keyrouter_util_get_pid(NULL, key_data->surface);
848 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
849 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
851 KLINF("FOCUS HOOK : %s(%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
852 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
853 key_data->surface, pid, pname ?: "Unknown");
855 if(pname) E_FREE(pname);
862 e_keyrouter_prepend_to_keylist(NULL, NULL, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, EINA_TRUE);
866 pid = e_keyrouter_util_get_pid(NULL, surface_focus);
867 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
868 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
870 _e_keyrouter_send_key_event(type, surface_focus, NULL,ev, dev, EINA_TRUE, TIZEN_KEYROUTER_MODE_SHARED);
871 KLINF("FOCUS DIRECT : %s(%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
872 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, surface_focus, pid, pname ?: "Unknown");
873 *delivered_surface = surface_focus;
874 if(pname) E_FREE(pname);
880 _e_keyrouter_check_top_visible_window(E_Client *ec_focus, int arr_idx)
882 E_Client *ec_top = NULL;
883 Eina_List *l = NULL, *l_next = NULL;
884 E_Keyrouter_Key_List_NodePtr key_node_data = NULL;
886 ec_top = e_client_top_get();
890 if (e_client_visibility_get(ec_top) != E_VISIBILITY_UNOBSCURED)
892 if (ec_top == ec_focus)
894 KLDBG("Top e_client (%p) is invisible(%d) but focus client", ec_top, ec_top->visible);
897 ec_top = e_client_below_get(ec_top);
901 /* TODO: Check this client is located inside a display boundary */
902 g_rec_mutex_lock(&krt->grab_key_mutex);
903 Eina_List *top_ptr_list = krt->HardKeys[arr_idx].top_ptr;
904 EINA_LIST_FOREACH_SAFE(top_ptr_list, l, l_next, key_node_data)
908 if (ec_top == e_client_from_surface_resource(key_node_data->surface))
910 krt->HardKeys[arr_idx].top_ptr = eina_list_promote_list(krt->HardKeys[arr_idx].top_ptr, l);
911 KLDBG("Move a client(e_client: %p, wl_surface: %p) to first index of list(key: %d)",
912 ec_top, key_node_data->surface, arr_idx);
913 g_rec_mutex_unlock(&krt->grab_key_mutex);
919 g_rec_mutex_unlock(&krt->grab_key_mutex);
921 if (ec_top == ec_focus)
923 KLDBG("The e_client(%p) is a focus client", ec_top);
927 ec_top = e_client_below_get(ec_top);
932 /* Function for sending key event to wl_client(s) */
934 _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)
936 struct wl_client *wc_send;
937 Eina_Bool pressed = EINA_FALSE;
939 if (surface == NULL) wc_send = wc;
940 else wc_send = wl_resource_get_client(surface);
944 KLWRN("wl_surface: %p or wl_client: %p returns null wayland client", surface, wc);
948 if (ECORE_EVENT_KEY_DOWN == type)
951 e_keyrouter_prepend_to_keylist(surface, wc, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, focused);
954 if (e_config->key_input_ttrace_enable)
956 TRACE_INPUT_BEGIN(e_keyrouter_wl_key_send);
957 ELOGF("INPUT", "e_keyrouter_wl_key_send|B|", NULL);
960 e_keyrouter_wl_key_send(ev, dev, pressed, wc_send, surface, focused);
962 if (e_config->key_input_ttrace_enable)
965 ELOGF("INPUT", "e_keyrouter_wl_key_send|E|", NULL);
972 e_keyrouter_util_get_surface_from_eclient(E_Client *client)
974 if (!client || !client->comp_data) return NULL;
976 return client->comp_data->wl_surface;
980 e_keyrouter_util_get_pid(struct wl_client *client, struct wl_resource *surface)
985 struct wl_client *cur_client = NULL;
987 if (client) cur_client = client;
988 else if (surface) cur_client = wl_resource_get_client(surface);
989 EINA_SAFETY_ON_NULL_RETURN_VAL(cur_client, 0);
991 wl_client_get_credentials(cur_client, &pid, &uid, &gid);
997 e_keyrouter_util_cmd_get_from_pid(int pid)
1000 E_Comp_Connected_Client_Info *cdata;
1002 EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, NULL);
1004 EINA_LIST_FOREACH(e_comp->connected_clients, l, cdata)
1006 if (cdata->pid == pid) return strdup(cdata->name);
1013 e_keyrouter_util_process_name_get_from_cmd(char *cmd)
1021 for (i = 0; i < len; i++)
1023 pbuf = cmd[len - i - 1];
1026 pname = &cmd[len - i];
1027 return strdup(pname);