e_client: support a event delivered function for key cancel 66/226166/2
authorjeon <jhyuni.kang@samsung.com>
Thu, 27 Feb 2020 08:22:28 +0000 (17:22 +0900)
committerjeon <jhyuni.kang@samsung.com>
Thu, 27 Feb 2020 08:29:52 +0000 (17:29 +0900)
Change-Id: I424e3b8aa1107413fa7d3389bc63079d75edef04

src/bin/e_client.c
src/bin/e_client.h
src/bin/e_comp_wl.c
src/bin/e_comp_wl.h
src/bin/e_comp_wl_rsm.c

index 407d6a81315b312aba1148f8742d4113f04a0951..b47d217e48da458bc036230ccf63cb210125327b 100644 (file)
@@ -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)
 {
index 971ecd64d1b075b85dbb90501ba56ea69eb22bcf..b3a07c4992cd1f7b31b26aaf60230f87e51752ad 100644 (file)
@@ -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);
index b09ca650e0d4774e298806f87d7f47f67da367c7..e638fa2018bffedf344ffd05b9e8ca2d20030102 100644 (file)
@@ -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)
 {
index fee1b0d642bb24fbbc56913a3fa352908f542f09..16cefdfa3c159120ef85569ef659a46c8b5ad51c 100644 (file)
@@ -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);
index 6e0063181eba8743724166ba877fcf9f65ea396d..e5e8319f449b54cd2bd00b4692814bd3a8c31af2 100644 (file)
@@ -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;