1 #ifndef _F_ENABLE_KEYROUTER_CORE
4 #include "e_mod_main_wl.h"
6 static Eina_Bool _e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev);
7 static Eina_Bool _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev);
8 static Eina_Bool _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev);
9 static Eina_Bool _e_keyrouter_send_key_event(int type, struct wl_resource *surface, struct wl_client *wc, Ecore_Event_Key *ev, Eina_Bool focused, unsigned int mode);
11 static Eina_Bool _e_keyrouter_send_key_events_focus(int type, struct wl_resource *surface, Ecore_Event_Key *ev, struct wl_resource **delivered_surface);
12 static void _e_keyrouter_event_generate_key(Ecore_Event_Key *ev, int type, struct wl_client *send_surface);
14 static Eina_Bool _e_keyrouter_is_key_grabbed(int key);
15 static Eina_Bool _e_keyrouter_check_top_visible_window(E_Client *ec_focus, int arr_idx);
18 _e_keyrouter_is_key_grabbed(int key)
20 if (!krt->HardKeys[key].keycode)
24 if (krt->HardKeys[key].excl_ptr ||
25 krt->HardKeys[key].or_excl_ptr ||
26 krt->HardKeys[key].top_ptr ||
27 krt->HardKeys[key].shared_ptr)
36 _e_keyrouter_event_key_free(void *data EINA_UNUSED, void *ev)
38 Ecore_Event_Key *e = ev;
40 eina_stringshare_del(e->keyname);
41 eina_stringshare_del(e->key);
42 eina_stringshare_del(e->string);
43 eina_stringshare_del(e->compose);
45 if (e->dev) ecore_device_unref(e->dev);
51 _e_keyrouter_event_generate_key(Ecore_Event_Key *ev, int type, struct wl_client *send_surface)
53 Ecore_Event_Key *ev_cpy = NULL;
55 ev_cpy = E_NEW(Ecore_Event_Key, 1);
56 EINA_SAFETY_ON_NULL_RETURN(ev_cpy);
58 KLDBG("Generate new key event! send to wl_surface: %p (pid: %d)", send_surface, e_keyrouter_util_get_pid(send_surface, NULL));
60 ev_cpy->keyname = (char *)eina_stringshare_add(ev->keyname);
61 ev_cpy->key = (char *)eina_stringshare_add(ev->key);
62 ev_cpy->string = (char *)eina_stringshare_add(ev->string);
63 ev_cpy->compose = (char *)eina_stringshare_add(ev->compose);
65 ev_cpy->window = ev->window;
66 ev_cpy->root_window = ev->root_window;
67 ev_cpy->event_window = ev->event_window;
69 ev_cpy->timestamp = (int)(ecore_time_get()*1000);
70 ev_cpy->modifiers = ev->modifiers;
72 ev_cpy->same_screen = ev->same_screen;
73 ev_cpy->keycode = ev->keycode;
75 ev_cpy->data = send_surface;
76 ev_cpy->dev = ecore_device_ref(ev->dev);
78 if (ECORE_EVENT_KEY_DOWN == type)
79 ecore_event_add(ECORE_EVENT_KEY_DOWN, ev_cpy, _e_keyrouter_event_key_free, NULL);
81 ecore_event_add(ECORE_EVENT_KEY_UP, ev_cpy, _e_keyrouter_event_key_free, NULL);
84 /* Function for checking the existing grab for a key and sending key event(s) */
86 e_keyrouter_process_key_event(void *event, int type)
88 Eina_Bool res = EINA_TRUE;
89 Ecore_Event_Key *ev = event;
94 KLDBG("[%s] keyname: %s, key: %s, keycode: %d", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
98 KLDBG("data is exist send to compositor: %p", ev->data);
102 if (ev->modifiers != 0)
104 KLDBG("Modifier key delivered to Focus window : Key %s(%d)", ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keycode);
108 if (krt->playback_daemon_surface)
110 wc = wl_resource_get_client(krt->playback_daemon_surface);
113 _e_keyrouter_event_generate_key(ev, type, wc);
114 KLDBG("Sent key to playback-daemon");
118 if (krt->max_tizen_hwkeys < ev->keycode)
120 KLWRN("The key(%d) is too larger to process keyrouting: Invalid keycode", ev->keycode);
124 if (!krt->HardKeys[ev->keycode].keycode) goto finish;
126 if (!e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_BEFORE_KEYROUTING, type, ev))
131 if ((ECORE_EVENT_KEY_UP == type) && (!krt->HardKeys[ev->keycode].press_ptr))
133 KLDBG("The release key(%d) isn't a processed by keyrouter!", ev->keycode);
138 //KLDBG("The key(%d) is going to be sent to the proper wl client(s) !", ev->keycode);
139 KLDBG("[%s] keyname: %s, key: %s, keycode: %d", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
140 if (_e_keyrouter_send_key_events(type, ev))
147 /* Function for sending key events to wl_client(s) */
149 _e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev)
152 if (ECORE_EVENT_KEY_DOWN == type)
154 res = _e_keyrouter_send_key_events_press(type, ev);
158 res = _e_keyrouter_send_key_events_release(type, ev);
164 _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev)
167 char *pname = NULL, *cmd = NULL;
168 E_Keyrouter_Key_List_NodePtr key_node_data;
169 Eina_Bool res = EINA_TRUE, ret = EINA_TRUE;
171 /* Deliver release clean up pressed key list */
172 EINA_LIST_FREE(krt->HardKeys[ev->keycode].press_ptr, key_node_data)
174 if (key_node_data->status == E_KRT_CSTAT_ALIVE)
176 res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev,
177 key_node_data->focused, TIZEN_KEYROUTER_MODE_PRESSED);
179 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
180 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
181 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
182 KLINF("Release Pair : %s(%s:%d)(Focus: %d)(Status: %d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
183 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
184 key_node_data->status, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
185 if(pname) E_FREE(pname);
190 if (key_node_data->focused == EINA_TRUE)
193 if (key_node_data->status == E_KRT_CSTAT_DEAD)
195 ev->data = key_node_data->wc;
199 ev->data = (void *)0x1;
202 KLINF("Release Pair : %s(%s:%d)(Focus: %d)(Status: %d) => wl_surface (%p) wl_client (%p) process is ungrabbed / dead",
203 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
204 key_node_data->status, key_node_data->surface, key_node_data->wc);
207 E_FREE(key_node_data);
208 if (res == EINA_FALSE) ret = EINA_FALSE;
210 krt->HardKeys[ev->keycode].press_ptr = NULL;
216 _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
218 unsigned int keycode = ev->keycode;
219 struct wl_resource *surface_focus = NULL;
220 E_Client *ec_focus = NULL;
221 struct wl_resource *delivered_surface = NULL;
222 Eina_Bool res = EINA_TRUE;
224 char *pname = NULL, *cmd = NULL;
226 E_Keyrouter_Key_List_NodePtr key_node_data;
229 ec_focus = e_client_focused_get();
230 surface_focus = e_keyrouter_util_get_surface_from_eclient(ec_focus);
232 if (krt->isPictureOffEnabled == 1)
234 EINA_LIST_FOREACH(krt->HardKeys[keycode].pic_off_ptr, l, key_node_data)
238 res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, key_node_data->focused, TIZEN_KEYROUTER_MODE_SHARED);
240 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
241 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
242 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
243 KLINF("PICTURE OFF : %s(%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
244 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keycode, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
245 if(pname) E_FREE(pname);
251 if (!_e_keyrouter_is_key_grabbed(ev->keycode))
253 res = _e_keyrouter_send_key_events_focus(type, surface_focus, ev, &delivered_surface);
254 if (delivered_surface)
256 res = e_keyrouter_add_surface_destroy_listener(delivered_surface);
257 if (res != TIZEN_KEYROUTER_ERROR_NONE)
259 KLWRN("Failed to add surface to destroy listener (res: %d)", res);
265 EINA_LIST_FOREACH(krt->HardKeys[keycode].excl_ptr, l, key_node_data)
269 res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev,
270 key_node_data->focused, TIZEN_KEYROUTER_MODE_EXCLUSIVE);
272 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
273 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
274 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
275 KLINF("EXCLUSIVE : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
276 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
277 key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
278 if(pname) E_FREE(pname);
284 EINA_LIST_FOREACH(krt->HardKeys[keycode].or_excl_ptr, l, key_node_data)
288 res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev,
289 key_node_data->focused, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE);
291 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
292 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
293 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
294 KLINF("OVERRIDABLE_EXCLUSIVE : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
295 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
296 key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
297 if(pname) E_FREE(pname);
304 // Top position grab must need a focus surface.
307 EINA_LIST_FOREACH(krt->HardKeys[keycode].top_ptr, l, key_node_data)
311 if ((EINA_FALSE == krt->isWindowStackChanged) && (surface_focus == key_node_data->surface))
313 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
314 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
315 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
317 res = _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev, key_node_data->focused,
318 TIZEN_KEYROUTER_MODE_TOPMOST);
319 KLINF("TOPMOST (TOP_POSITION) : %s (%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
320 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
321 key_node_data->surface, pid, pname ?: "Unknown");
323 if(pname) E_FREE(pname);
327 krt->isWindowStackChanged = EINA_FALSE;
329 if (_e_keyrouter_check_top_visible_window(ec_focus, keycode))
331 E_Keyrouter_Key_List_NodePtr top_key_node_data = eina_list_data_get(krt->HardKeys[keycode].top_ptr);
332 pid = e_keyrouter_util_get_pid(top_key_node_data->wc, top_key_node_data->surface);
333 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
334 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
336 res = _e_keyrouter_send_key_event(type, top_key_node_data->surface, NULL, ev, top_key_node_data->focused,
337 TIZEN_KEYROUTER_MODE_TOPMOST);
338 KLINF("TOPMOST (TOP_POSITION) : %s (%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
339 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
340 top_key_node_data->surface, pid, pname ?: "Unknown");
342 if(pname) E_FREE(pname);
352 if (krt->HardKeys[keycode].shared_ptr)
355 res = _e_keyrouter_send_key_events_focus(type, surface_focus, ev, &delivered_surface);
356 if (delivered_surface)
358 res = e_keyrouter_add_surface_destroy_listener(delivered_surface);
359 if (res != TIZEN_KEYROUTER_ERROR_NONE)
361 KLWRN("Failed to add wl_surface to destroy listener (res: %d)", res);
364 EINA_LIST_FOREACH(krt->HardKeys[keycode].shared_ptr, l, key_node_data)
368 if (delivered_surface && key_node_data->surface == delivered_surface)
370 // Check for already delivered surface
371 // do not deliver double events in this case.
376 _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, key_node_data->focused, TIZEN_KEYROUTER_MODE_SHARED);
377 pid = e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface);
378 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
379 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
380 KLINF("SHARED : %s(%s:%d) => wl_surface (%p) wl_client (%p) (pid: %d) (pname: %s)",
381 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
382 if(pname) E_FREE(pname);
394 _e_keyrouter_send_key_events_focus(int type, struct wl_resource *surface_focus, Ecore_Event_Key *ev, struct wl_resource **delivered_surface)
396 E_Client *ec_top = NULL, *ec_focus = NULL;
397 Eina_Bool below_focus = EINA_FALSE;
398 struct wl_resource *surface = NULL;
399 Eina_List* key_list = NULL;
400 int *key_data = NULL;
401 Eina_List *ll = NULL;
402 int deliver_invisible = 0;
403 Eina_Bool res = EINA_TRUE;
405 char *pname = NULL, *cmd = NULL;
407 if (!e_keyrouter_intercept_hook_call(E_KEYROUTER_INTERCEPT_HOOK_DELIVER_FOCUS, type, ev))
409 if (ev->data && ev->data != (void *)0x1)
411 *delivered_surface = ev->data;
412 ev->data = wl_resource_get_client(ev->data);
417 ec_top = e_client_top_get();
418 ec_focus = e_client_focused_get();
420 if (!krt->HardKeys[ev->keycode].registered_ptr && !e_keyrouter_is_registered_window(surface_focus) &&
421 !IsNoneKeyRegisterWindow(surface_focus) && !krt->invisible_set_window_list)
423 pid = e_keyrouter_util_get_pid(NULL, surface_focus);
424 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
425 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
427 res = _e_keyrouter_send_key_event(type, surface_focus, NULL,ev, EINA_TRUE, TIZEN_KEYROUTER_MODE_SHARED);
428 KLINF("FOCUS DIRECT : %s(%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
429 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, surface_focus, pid, pname ?: "Unknown");
430 *delivered_surface = surface_focus;
431 if(pname) E_FREE(pname);
436 // loop over to next window from top of window stack
437 for (; ec_top != NULL; ec_top = e_client_below_get(ec_top))
439 surface = e_keyrouter_util_get_surface_from_eclient(ec_top);
443 // Not a valid surface.
446 if (ec_top->is_cursor) continue;
448 // Check if window stack reaches to focus window
449 if (ec_top == ec_focus)
451 KLINF("%p is focus e_client & wl_surface: focus %p ==> %p", ec_top, surface_focus, surface);
452 below_focus = EINA_TRUE;
455 // Check for FORCE DELIVER to INVISIBLE WINDOW
456 if (deliver_invisible && IsInvisibleGetWindow(surface))
458 pid = e_keyrouter_util_get_pid(NULL, surface);
459 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
460 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
462 res = _e_keyrouter_send_key_event(type, surface, NULL, ev, EINA_TRUE, TIZEN_KEYROUTER_MODE_REGISTERED);
463 KLINF("FORCE DELIVER : %s(%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
464 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
465 surface, pid, pname ?: "Unknown");
466 *delivered_surface = surface;
467 if(pname) E_FREE(pname);
472 // Check for visible window first <Consider VISIBILITY>
473 // return if not visible
474 if (ec_top->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED || ec_top->visibility.obscured == E_VISIBILITY_UNKNOWN)
479 // Set key Event Delivery for INVISIBLE WINDOW
480 if (IsInvisibleSetWindow(surface))
482 deliver_invisible = 1;
485 if (IsNoneKeyRegisterWindow(surface))
487 // Registered None property is set for this surface
488 // No event will be delivered to this surface.
489 KLINF("wl_surface (%p) is a none register window.", surface);
493 if (e_keyrouter_is_registered_window(surface))
495 // get the key list and deliver events if it has registered for that key
496 // Write a function to get the key list for register window.
497 key_list = _e_keyrouter_registered_window_key_list(surface);
500 EINA_LIST_FOREACH(key_list, ll, key_data)
502 if(!key_data) continue;
504 if(*key_data == ev->keycode)
506 pid = e_keyrouter_util_get_pid(NULL, surface);
507 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
508 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
510 res = _e_keyrouter_send_key_event(type, surface, NULL, ev, EINA_TRUE, TIZEN_KEYROUTER_MODE_REGISTERED);
511 KLINF("REGISTER : %s(%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
512 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, surface, pid, pname ?: "Unknown");
513 *delivered_surface = surface;
514 if(pname) E_FREE(pname);
522 KLDBG("Key_list is Null for registered wl_surface %p", surface);
526 if (surface != surface_focus)
528 if (below_focus == EINA_FALSE) continue;
530 // Deliver to below Non Registered window
531 else if (!e_keyrouter_is_registered_window(surface))
533 pid = e_keyrouter_util_get_pid(NULL, surface);
534 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
535 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
537 res = _e_keyrouter_send_key_event(type, surface, NULL, ev, EINA_TRUE, TIZEN_KEYROUTER_MODE_SHARED);
538 KLINF("NOT REGISTER : %s(%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
539 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, surface, pid, pname ?: "Unknown");
540 *delivered_surface = surface;
541 if(pname) E_FREE(pname);
549 // Deliver to Focus if Non Registered window
550 if (!e_keyrouter_is_registered_window(surface))
552 pid = e_keyrouter_util_get_pid(NULL, surface);
553 cmd = e_keyrouter_util_cmd_get_from_pid(pid);
554 pname = e_keyrouter_util_process_name_get_from_cmd(cmd);
556 res = _e_keyrouter_send_key_event(type, surface, NULL,ev, EINA_TRUE, TIZEN_KEYROUTER_MODE_SHARED);
557 KLINF("FOCUS : %s(%s:%d) => wl_surface (%p) (pid: %d) (pname: %s)",
558 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, surface, pid, pname ?: "Unknown");
559 *delivered_surface = surface;
560 if(pname) E_FREE(pname);
568 KLINF("Couldnt Deliver key:(%s:%d) to any window. Focused wl_surface: %p", ev->keyname, ev->keycode, surface_focus);
573 _e_keyrouter_check_top_visible_window(E_Client *ec_focus, int arr_idx)
575 E_Client *ec_top = NULL;
576 Eina_List *l = NULL, *l_next = NULL;
577 E_Keyrouter_Key_List_NodePtr key_node_data = NULL;
579 ec_top = e_client_top_get();
583 if (!ec_top->visible && ec_top == ec_focus)
585 KLDBG("Top e_client (%p) is invisible(%d) but focus client", ec_top, ec_top->visible);
588 if (!ec_top->visible)
590 ec_top = e_client_below_get(ec_top);
594 /* TODO: Check this client is located inside a display boundary */
596 EINA_LIST_FOREACH_SAFE(krt->HardKeys[arr_idx].top_ptr, l, l_next, key_node_data)
600 if (ec_top == wl_resource_get_user_data(key_node_data->surface))
602 krt->HardKeys[arr_idx].top_ptr = eina_list_promote_list(krt->HardKeys[arr_idx].top_ptr, l);
603 KLDBG("Move a client(e_client: %p, wl_surface: %p) to first index of list(key: %d)",
604 ec_top, key_node_data->surface, arr_idx);
610 if (ec_top == ec_focus)
612 KLDBG("The e_client(%p) is a focus client", ec_top);
616 ec_top = e_client_below_get(ec_top);
621 /* Function for sending key event to wl_client(s) */
623 _e_keyrouter_send_key_event(int type, struct wl_resource *surface, struct wl_client *wc, Ecore_Event_Key *ev, Eina_Bool focused, unsigned int mode)
625 struct wl_client *wc_send;
633 wc_send = wl_resource_get_client(surface);
638 KLWRN("wl_surface: %p or wl_client: %p returns null wayland client", surface, wc);
642 if (ECORE_EVENT_KEY_DOWN == type)
644 if (mode == TIZEN_KEYROUTER_MODE_EXCLUSIVE ||
645 mode == TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE ||
646 mode == TIZEN_KEYROUTER_MODE_TOPMOST ||
647 mode == TIZEN_KEYROUTER_MODE_REGISTERED)
651 KLDBG("Send only one key! wl_client: %p(%d)", wc_send, e_keyrouter_util_get_pid(wc_send, NULL));
653 else if (focused == EINA_TRUE)
657 e_keyrouter_prepend_to_keylist(surface, wc, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, focused);
661 if (focused == EINA_TRUE) ev->data = wc_send;
664 if (focused == EINA_TRUE) return EINA_FALSE;
666 _e_keyrouter_event_generate_key(ev, type, wc_send);
672 e_keyrouter_util_get_surface_from_eclient(E_Client *client)
674 EINA_SAFETY_ON_NULL_RETURN_VAL
676 EINA_SAFETY_ON_NULL_RETURN_VAL
677 (client->comp_data, NULL);
679 return client->comp_data->wl_surface;
683 e_keyrouter_util_get_pid(struct wl_client *client, struct wl_resource *surface)
688 struct wl_client *cur_client = NULL;
690 if (client) cur_client = client;
691 else if (surface) cur_client = wl_resource_get_client(surface);
692 EINA_SAFETY_ON_NULL_RETURN_VAL(cur_client, 0);
694 wl_client_get_credentials(cur_client, &pid, &uid, &gid);
700 e_keyrouter_util_cmd_get_from_pid(int pid)
703 E_Comp_Connected_Client_Info *cdata;
705 EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, NULL);
707 EINA_LIST_FOREACH(e_comp->connected_clients, l, cdata)
709 if (cdata->pid == pid) return strdup(cdata->name);
715 typedef struct _keycode_map{
717 xkb_keycode_t keycode;
721 find_keycode(struct xkb_keymap *keymap, xkb_keycode_t key, void *data)
723 keycode_map *found_keycodes = (keycode_map *)data;
724 xkb_keysym_t keysym = found_keycodes->keysym;
726 const xkb_keysym_t *syms_out = NULL;
728 nsyms = xkb_keymap_key_get_syms_by_level(keymap, key, 0, 0, &syms_out);
729 if (nsyms && syms_out)
731 if (*syms_out == keysym)
733 found_keycodes->keycode = key;
739 _e_keyrouter_keycode_get_from_keysym(struct xkb_keymap *keymap, xkb_keysym_t keysym)
741 keycode_map found_keycodes = {0,};
742 found_keycodes.keysym = keysym;
743 xkb_keymap_key_for_each(keymap, find_keycode, &found_keycodes);
745 return found_keycodes.keycode;
749 e_keyrouter_util_keycode_get_from_string(char * name)
751 struct xkb_keymap *keymap = NULL;
752 xkb_keysym_t keysym = 0x0;
755 keymap = e_comp_wl->xkb.keymap;
756 EINA_SAFETY_ON_NULL_GOTO(keymap, finish);
758 keysym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS);
759 EINA_SAFETY_ON_FALSE_GOTO(keysym != XKB_KEY_NoSymbol, finish);
761 keycode = _e_keyrouter_keycode_get_from_keysym(keymap, keysym);
763 KLDBG("request name: %s, return value: %d", name, keycode);
772 e_keyrouter_util_keyname_get_from_keycode(int keycode)
774 struct xkb_state *state;
775 xkb_keysym_t sym = XKB_KEY_NoSymbol;
776 char name[256] = {0, };
778 EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, NULL);
779 EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl->xkb.state, NULL);
781 state = e_comp_wl->xkb.state;
782 sym = xkb_state_key_get_one_sym(state, keycode);
783 xkb_keysym_get_name(sym, name, sizeof(name));
789 e_keyrouter_util_process_name_get_from_cmd(char *cmd)
797 for (i = 0; i < len; i++)
799 pbuf = cmd[len - i - 1];
802 pname = &cmd[len - i];
803 return strdup(pname);