From 8d8d959a1701918ce97f37f823695899221fc6c8 Mon Sep 17 00:00:00 2001 From: jeon Date: Thu, 27 Feb 2020 17:22:28 +0900 Subject: [PATCH] e_client: support a event delivered function for key cancel Change-Id: I424e3b8aa1107413fa7d3389bc63079d75edef04 --- src/bin/e_client.c | 10 ++++ src/bin/e_client.h | 1 + src/bin/e_comp_wl.c | 107 ++++++++++++++++++++++++++++++++++++++++ src/bin/e_comp_wl.h | 1 + src/bin/e_comp_wl_rsm.c | 6 +++ 5 files changed, 125 insertions(+) diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 407d6a8131..b47d217e48 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -7298,6 +7298,16 @@ e_client_key_send(E_Client *ec, int keycode, Eina_Bool pressed, Evas_Device *dev return res; } +E_API Eina_Bool +e_client_key_cancel(E_Client *ec, int keycode, Evas_Device *dev, unsigned int time) +{ + Eina_Bool res; + + res = e_comp_wl_key_cancel(ec, keycode, dev, time); + + return res; +} + E_API Eina_Bool e_client_touch_send(E_Client *ec, int idx, int x, int y, Eina_Bool pressed, Evas_Device *dev, double radius_x, double radius_y, double pressure, double angle, unsigned int time) { diff --git a/src/bin/e_client.h b/src/bin/e_client.h index 971ecd64d1..b3a07c4992 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -1173,6 +1173,7 @@ E_API E_Pixmap *e_client_pixmap_change(E_Client *ec, E_Pixmap *newcp); E_API void e_client_window_role_set(E_Client *ec, const char *role); E_API Eina_Bool e_client_key_send(E_Client *ec, int keycode, Eina_Bool pressed, Evas_Device *dev, unsigned int time); +E_API Eina_Bool e_client_key_cancel(E_Client *ec, int keycode, Evas_Device *dev, unsigned int time); E_API Eina_Bool e_client_touch_send(E_Client *ec, int idx, int x, int y, Eina_Bool pressed, Evas_Device *dev, double radius_x, double radius_y, double pressure, double angle, unsigned int time); E_API Eina_Bool e_client_touch_update_send(E_Client *ec, int idx, int x, int y, Evas_Device *dev, double radius_x, double radius_y, double pressure, double angle, unsigned int time); E_API Eina_Bool e_client_touch_cancel_send(E_Client *ec); diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index b09ca650e0..e638fa2018 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -5135,6 +5135,113 @@ e_comp_wl_key_send(E_Client *ec, int keycode, Eina_Bool pressed, Ecore_Device *d return EINA_TRUE; } +typedef struct _keycode_map{ + xkb_keysym_t keysym; + xkb_keycode_t keycode; +} keycode_map; + +static void +find_keycode(struct xkb_keymap *keymap, xkb_keycode_t key, void *data) +{ + keycode_map *found_keycodes = (keycode_map *)data; + xkb_keysym_t keysym = found_keycodes->keysym; + int nsyms = 0; + const xkb_keysym_t *syms_out = NULL; + + nsyms = xkb_keymap_key_get_syms_by_level(keymap, key, 0, 0, &syms_out); + if (nsyms && syms_out) + { + if (*syms_out == keysym) + { + found_keycodes->keycode = key; + } + } +} + +static int +_e_comp_wl_keycode_get_from_keysym(struct xkb_keymap *keymap, xkb_keysym_t keysym) +{ + keycode_map found_keycodes = {0,}; + found_keycodes.keysym = keysym; + xkb_keymap_key_for_each(keymap, find_keycode, &found_keycodes); + + return found_keycodes.keycode; +} + +static int +_e_comp_wl_keycode_get_from_string(char * name) +{ + struct xkb_keymap *keymap = NULL; + xkb_keysym_t keysym = 0x0; + int keycode = 0; + + keymap = e_comp_wl->xkb.keymap; + EINA_SAFETY_ON_NULL_GOTO(keymap, finish); + + keysym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS); + EINA_SAFETY_ON_FALSE_GOTO(keysym != XKB_KEY_NoSymbol, finish); + + keycode = _e_comp_wl_keycode_get_from_keysym(keymap, keysym); + + return keycode; + +finish: + return 0; +} + + +EINTERN Eina_Bool +e_comp_wl_key_cancel(E_Client *ec, int keycode, Ecore_Device *dev, uint32_t time) +{ + struct wl_resource *res; + struct wl_client *wc; + Eina_List *l; + uint32_t serial, wl_keycode, cancel_keycode; + E_Comp_Config *comp_conf = NULL; + + EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(ec->comp_data, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(ec->comp_data->surface, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl->xkb.keymap, EINA_FALSE); + + cancel_keycode = _e_comp_wl_keycode_get_from_string("Cancel"); + if (cancel_keycode == XKB_KEYCODE_INVALID) + { + ELOGF("Key", "Failed to send key cancel for %d key, Cancel key is not supported\n", ec, keycode); + return EINA_FALSE; + } + cancel_keycode = cancel_keycode - 8; + + wl_keycode = keycode - 8; + EINA_SAFETY_ON_TRUE_RETURN_VAL(wl_keycode <= 0, EINA_FALSE); + + wc = wl_resource_get_client(ec->comp_data->surface); + serial = wl_display_next_serial(e_comp_wl->wl.disp); + if (!time) time = (uint32_t)(ecore_time_get() * 1000); + + comp_conf = e_comp_config_get(); + + EINA_LIST_FOREACH(e_comp_wl->kbd.resources, l, res) + { + if (wl_resource_get_client(res) != wc) continue; + if (dev) _e_comp_wl_send_event_device(wc, time, dev, serial); + else _e_comp_wl_device_send_last_event_device(ec, ECORE_DEVICE_CLASS_KEYBOARD, time); + + if (comp_conf && comp_conf->input_log_enable) + ELOGF("Key", "Send Key Cancel (time: %d)", ec, time); + wl_keyboard_send_key(res, serial, time, + cancel_keycode, WL_KEYBOARD_KEY_STATE_PRESSED); + wl_keyboard_send_key(res, serial, time, + wl_keycode, WL_KEYBOARD_KEY_STATE_RELEASED); + wl_keyboard_send_key(res, serial, time, + cancel_keycode, WL_KEYBOARD_KEY_STATE_RELEASED); + } + + return EINA_TRUE; +} + + EINTERN Eina_Bool e_comp_wl_touch_send(E_Client *ec, int idx, int x, int y, Eina_Bool pressed, Ecore_Device *dev, double radius_x, double radius_y, double pressure, double angle, uint32_t time) { diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h index fee1b0d642..16cefdfa3c 100644 --- a/src/bin/e_comp_wl.h +++ b/src/bin/e_comp_wl.h @@ -599,6 +599,7 @@ E_API void e_comp_wl_input_cursor_timer_enable_set(Eina_Bool enabled); EINTERN void e_comp_wl_send_event_device(struct wl_client *wc, uint32_t timestamp, Ecore_Device *dev, uint32_t serial); EINTERN Eina_Bool e_comp_wl_key_send(E_Client *ec, int keycode, Eina_Bool pressed, Ecore_Device *dev, uint32_t time); +EINTERN Eina_Bool e_comp_wl_key_cancel(E_Client *ec, int keycode, Ecore_Device *dev, uint32_t time); EINTERN Eina_Bool e_comp_wl_touch_send(E_Client *ec, int idx, int x, int y, Eina_Bool pressed, Ecore_Device *dev, double radius_x, double radius_y, double pressure, double angle, uint32_t time); EINTERN Eina_Bool e_comp_wl_touch_update_send(E_Client *ec, int idx, int x, int y, Ecore_Device *dev, double radius_x, double radius_y, double pressure, double angle, uint32_t time); EINTERN Eina_Bool e_comp_wl_touch_cancel_send(E_Client *ec); diff --git a/src/bin/e_comp_wl_rsm.c b/src/bin/e_comp_wl_rsm.c index 6e0063181e..e5e8319f44 100644 --- a/src/bin/e_comp_wl_rsm.c +++ b/src/bin/e_comp_wl_rsm.c @@ -1900,6 +1900,12 @@ _remote_surface_cb_key_event_transfer(struct wl_client *client, struct wl_resour edev, time); break; + case TIZEN_REMOTE_SURFACE_EVENT_TYPE_KEY_CANCEL: + e_client_key_cancel(ec, + keycode, + edev, + time); + break; default: ERR("Not supported event_type(%d)", event_type); break; -- 2.34.1