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);
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)
{
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);