2 #include "e_mod_main_wl.h"
5 static Eina_Bool _e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev);
6 static Eina_Bool _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev);
7 static Eina_Bool _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev);
8 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);
10 static Eina_Bool _e_keyrouter_send_key_events_register(int type, Ecore_Event_Key *ev);
12 static Eina_Bool _e_keyrouter_is_key_grabbed(int key);
13 static Eina_Bool _e_keyrouter_check_top_visible_window(E_Client *ec_focus, int arr_idx);
16 _e_keyrouter_is_key_grabbed(int key)
18 if (!krt->HardKeys[key].keycode)
22 if (krt->HardKeys[key].excl_ptr ||
23 krt->HardKeys[key].or_excl_ptr ||
24 krt->HardKeys[key].top_ptr ||
25 krt->HardKeys[key].shared_ptr ||
26 krt->HardKeys[key].registered_ptr)
34 /* Function for checking the existing grab for a key and sending key event(s) */
36 e_keyrouter_process_key_event(void *event, int type)
38 Eina_Bool res = EINA_TRUE;
39 Ecore_Event_Key *ev = event;
43 KLDBG("[%s] keyname: %s, key: %s, keycode: %d\n", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
47 KLDBG("data is exist send to compositor: %p\n", ev->data);
51 if (krt->max_tizen_hwkeys < ev->keycode)
53 KLWRN("The key(%d) is too larger to process keyrouting: Invalid keycode\n", ev->keycode);
57 if ((ECORE_EVENT_KEY_DOWN == type) && (!_e_keyrouter_is_key_grabbed(ev->keycode)))
59 KLDBG("The press key(%d) isn't a grabbable key or has not been grabbed yet !\n", ev->keycode);
63 if ((ECORE_EVENT_KEY_UP == type) && (!krt->HardKeys[ev->keycode].press_ptr))
65 KLDBG("The release key(%d) isn't a grabbable key or has not been grabbed yet !\n", ev->keycode);
69 //KLDBG("The key(%d) is going to be sent to the proper wl client(s) !\n", ev->keycode);
71 if (_e_keyrouter_send_key_events(type, ev))
78 /* Function for sending key events to wl_client(s) */
80 _e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev)
83 if (ECORE_EVENT_KEY_DOWN == type)
85 res = _e_keyrouter_send_key_events_press(type, ev);
89 res = _e_keyrouter_send_key_events_release(type, ev);
95 _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev)
97 E_Keyrouter_Key_List_NodePtr key_node_data;
98 Eina_Bool res = EINA_TRUE, ret = EINA_TRUE;
100 /* Deliver release clean up pressed key list */
101 EINA_LIST_FREE(krt->HardKeys[ev->keycode].press_ptr, key_node_data)
105 res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev,
106 key_node_data->focused, TIZEN_KEYROUTER_MODE_PRESSED);
107 KLINF("Release Pair : Key %s(%s:%d)(Focus: %d) ===> E_Client (%p) WL_Client (%p) (pid: %d)\n",
108 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
109 key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
110 E_FREE(key_node_data);
111 if (res == EINA_FALSE) ret = EINA_FALSE;
114 krt->HardKeys[ev->keycode].press_ptr = NULL;
120 _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
122 unsigned int keycode = ev->keycode;
123 struct wl_resource *surface_focus = NULL;
124 E_Client *ec_focus = NULL;
125 Eina_Bool res = EINA_TRUE;
127 E_Keyrouter_Key_List_NodePtr key_node_data;
130 EINA_LIST_FOREACH(krt->HardKeys[keycode].excl_ptr, l, key_node_data)
134 res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev,
135 key_node_data->focused, TIZEN_KEYROUTER_MODE_EXCLUSIVE);
136 KLINF("EXCLUSIVE Mode : Key %s(%s:%d) ===> Surface (%p) WL_Client (%p) (pid: %d)\n",
137 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
138 key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
144 EINA_LIST_FOREACH(krt->HardKeys[keycode].or_excl_ptr, l, key_node_data)
148 res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev,
149 key_node_data->focused, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE);
150 KLINF("OVERRIDABLE_EXCLUSIVE Mode : Key %s(%s:%d) ===> Surface (%p) WL_Client (%p) (pid: %d)\n",
151 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
152 key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
158 ec_focus = e_client_focused_get();
159 surface_focus = e_keyrouter_util_get_surface_from_eclient(ec_focus);
161 // Top position grab must need a focus surface.
164 EINA_LIST_FOREACH(krt->HardKeys[keycode].top_ptr, l, key_node_data)
168 if ((EINA_FALSE == krt->isWindowStackChanged) && (surface_focus == key_node_data->surface))
170 res = _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev, key_node_data->focused,
171 TIZEN_KEYROUTER_MODE_TOPMOST);
172 KLINF("TOPMOST (TOP_POSITION) Mode : Key %s (%s:%d) ===> Surface (%p) (pid: %d)\n",
173 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
174 key_node_data->surface, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
178 krt->isWindowStackChanged = EINA_FALSE;
180 if (_e_keyrouter_check_top_visible_window(ec_focus, keycode))
182 res = _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev, key_node_data->focused,
183 TIZEN_KEYROUTER_MODE_TOPMOST);
184 KLINF("TOPMOST (TOP_POSITION) Mode : Key %s (%s:%d) ===> Surface (%p) (pid: %d)\n",
185 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
186 key_node_data->surface, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
195 if (krt->HardKeys[keycode].shared_ptr)
197 res = _e_keyrouter_send_key_event(type, surface_focus, NULL, ev, EINA_TRUE, TIZEN_KEYROUTER_MODE_SHARED);
198 KLINF("SHARED [Focus client] : Key %s (%s:%d) ===> Surface (%p) (pid: %d)\n",
199 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up "), ev->keyname, ev->keycode,
200 surface_focus, e_keyrouter_util_get_pid(NULL, surface_focus));
201 e_keyrouter_add_surface_destroy_listener(surface_focus);
203 EINA_LIST_FOREACH(krt->HardKeys[keycode].shared_ptr, l, key_node_data)
207 if (key_node_data->surface)
209 if (key_node_data->surface != surface_focus)
211 _e_keyrouter_send_key_event(type, key_node_data->surface,
212 key_node_data->wc, ev, EINA_FALSE,
213 TIZEN_KEYROUTER_MODE_SHARED);
214 KLINF("SHARED Mode : Key %s(%s:%d) ===> Surface (%p) WL_Client (%p) (pid: %d)\n",
215 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
216 key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
221 if (((surface_focus) && (key_node_data->wc != wl_resource_get_client(surface_focus))) ||
224 _e_keyrouter_send_key_event(type, key_node_data->surface,
225 key_node_data->wc, ev, EINA_FALSE,
226 TIZEN_KEYROUTER_MODE_SHARED);
227 KLINF("SHARED Mode : Key %s(%s:%d) ===> Surface (%p) WL_Client (%p) (pid: %d)\n",
228 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
229 key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
238 if (_e_keyrouter_send_key_events_register(type, ev))
247 _e_keyrouter_send_key_events_register(int type, Ecore_Event_Key *ev)
249 unsigned int keycode = ev->keycode;
250 Eina_Bool res = EINA_TRUE;
252 if (!krt->HardKeys[keycode].registered_ptr)
254 KLDBG("This keycode is not registered\n");
258 res = _e_keyrouter_send_key_event(type, krt->HardKeys[keycode].registered_ptr->surface,
259 NULL, ev, krt->HardKeys[keycode].registered_ptr->focused,
260 TIZEN_KEYROUTER_MODE_REGISTERED);
261 KLINF("REGISTER Mode : Key %s(%s:%d) ===> Surface (%p) (pid: %d)\n",
262 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
263 krt->HardKeys[keycode].registered_ptr->surface, e_keyrouter_util_get_pid(NULL, krt->HardKeys[keycode].registered_ptr->surface));
269 _e_keyrouter_check_top_visible_window(E_Client *ec_focus, int arr_idx)
271 E_Client *ec_top = NULL;
272 Eina_List *l = NULL, *l_next = NULL;
273 E_Keyrouter_Key_List_NodePtr key_node_data = NULL;
275 ec_top = e_client_top_get();
279 if (!ec_top->visible && ec_top == ec_focus)
281 KLDBG("Top Client(%p) is invisible(%d) but focus client\n", ec_top, ec_top->visible);
285 /* TODO: Check this client is located inside a display boundary */
287 EINA_LIST_FOREACH_SAFE(krt->HardKeys[arr_idx].top_ptr, l, l_next, key_node_data)
291 if (ec_top == wl_resource_get_user_data(key_node_data->surface))
293 krt->HardKeys[arr_idx].top_ptr = eina_list_promote_list(krt->HardKeys[arr_idx].top_ptr, l);
294 KLDBG("Move a client(%p) to first index of list(key: %d)\n",
301 if (ec_top == ec_focus)
303 KLDBG("The Client(%p) is a focus client\n", ec_top);
307 ec_top = e_client_below_get(ec_top);
312 /* Function for sending key event to wl_client(s) */
314 _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)
316 struct wl_client *wc_send;
317 Ecore_Event_Key *ev_cpy;
326 wc_send = wl_resource_get_client(surface);
331 KLWRN("surface: %p or wc: %p returns null wayland client\n", surface, wc);
335 if (ECORE_EVENT_KEY_DOWN == type)
337 if (mode == TIZEN_KEYROUTER_MODE_EXCLUSIVE ||
338 mode == TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE ||
339 mode == TIZEN_KEYROUTER_MODE_TOPMOST ||
340 mode == TIZEN_KEYROUTER_MODE_REGISTERED)
344 KLDBG("Send only one key! wc_send: %p(%d)\n", wc_send, e_keyrouter_util_get_pid(wc_send, NULL));
346 else if (focused == EINA_TRUE)
350 e_keyrouter_prepend_to_keylist(surface, wc, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, focused);
354 if (focused == EINA_TRUE) ev->data = wc_send;
357 if (focused == EINA_TRUE) return EINA_FALSE;
359 KLDBG("Generate new key event! wc_send: %p(%d)\n", wc_send, e_keyrouter_util_get_pid(wc_send, NULL));
361 ev_cpy = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
362 len = sizeof(Ecore_Event_Key) + strlen(ev->key) + strlen(ev->keyname) + ((ev->compose) ? strlen(ev->compose) : 0) + 3;
363 ev_cpy = calloc(1, len);
364 memcpy(ev_cpy, ev, len);
365 ev_cpy->data = wc_send;
367 if (ECORE_EVENT_KEY_DOWN == type)
368 ecore_event_add(ECORE_EVENT_KEY_DOWN, ev_cpy, NULL, NULL);
370 ecore_event_add(ECORE_EVENT_KEY_UP, ev_cpy, NULL, NULL);
376 e_keyrouter_util_get_surface_from_eclient(E_Client *client)
378 EINA_SAFETY_ON_NULL_RETURN_VAL
380 EINA_SAFETY_ON_NULL_RETURN_VAL
381 (client->comp_data, NULL);
383 return client->comp_data->wl_surface;
387 e_keyrouter_util_get_pid(struct wl_client *client, struct wl_resource *surface)
392 struct wl_client *cur_client = NULL;
394 if (client) cur_client = client;
395 else if (surface) cur_client = wl_resource_get_client(surface);
396 EINA_SAFETY_ON_NULL_RETURN_VAL(cur_client, 0);
398 wl_client_get_credentials(cur_client, &pid, &uid, &gid);