devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=08c804f5bb2de3cb5a7e95b1264b30043d1aea6f
commit 08c804f5bb2de3cb5a7e95b1264b30043d1aea6f Author: Chris Michael <[email protected]> Date: Wed Sep 23 14:39:24 2015 -0400 ecore-wl2: Send key press/release events when we get wayland event Signed-off-by: Chris Michael <[email protected]> --- src/lib/ecore_wl2/ecore_wl2_input.c | 100 ++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 3 deletions(-) diff --git a/src/lib/ecore_wl2/ecore_wl2_input.c b/src/lib/ecore_wl2/ecore_wl2_input.c index 7058040..2b16dc2 100644 --- a/src/lib/ecore_wl2/ecore_wl2_input.c +++ b/src/lib/ecore_wl2/ecore_wl2_input.c @@ -18,6 +18,8 @@ #include <sys/mman.h> #include "ecore_wl2_private.h" +static void _keyboard_cb_key(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsigned int serial, unsigned int timestamp, unsigned int keycode, unsigned int state); + static void _ecore_wl2_input_mouse_in_send(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window) { @@ -240,6 +242,94 @@ _ecore_wl2_input_focus_out_send(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window ecore_event_add(ECORE_WL2_EVENT_FOCUS_OUT, ev, NULL, NULL); } +static int +_ecore_wl2_input_key_translate(xkb_keysym_t keysym, unsigned int modifiers, char *buffer, int bytes) +{ + unsigned long hbytes = 0; + unsigned char c; + + if (!keysym) return 0; + hbytes = (keysym >> 8); + + if (!(bytes && + ((hbytes == 0) || + ((hbytes == 0xFF) && + (((keysym >= XKB_KEY_BackSpace) && (keysym <= XKB_KEY_Clear)) || + (keysym == XKB_KEY_Return) || (keysym == XKB_KEY_Escape) || + (keysym == XKB_KEY_KP_Space) || (keysym == XKB_KEY_KP_Tab) || + (keysym == XKB_KEY_KP_Enter) || + ((keysym >= XKB_KEY_KP_Multiply) && (keysym <= XKB_KEY_KP_9)) || + (keysym == XKB_KEY_KP_Equal) || (keysym == XKB_KEY_Delete)))))) + return 0; + + if (keysym == XKB_KEY_KP_Space) + c = (XKB_KEY_space & 0x7F); + else if (hbytes == 0xFF) + c = (keysym & 0x7F); + else + c = (keysym & 0xFF); + + if (modifiers & ECORE_EVENT_MODIFIER_CTRL) + { + if (((c >= '@') && (c < '\177')) || c == ' ') + c &= 0x1F; + else if (c == '2') + c = '\000'; + else if ((c >= '3') && (c <= '7')) + c -= ('3' - '\033'); + else if (c == '8') + c = '\177'; + else if (c == '/') + c = '_' & 0x1F; + } + buffer[0] = c; + return 1; +} + +static void +_ecore_wl2_input_key_send(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, xkb_keysym_t sym, unsigned int code, unsigned int state, unsigned int timestamp) +{ + Ecore_Event_Key *ev; + char key[256], keyname[256], compose[256]; + + memset(key, 0, sizeof(key)); + xkb_keysym_get_name(sym, key, sizeof(key)); + + memset(keyname, 0, sizeof(keyname)); + memcpy(keyname, key, sizeof(keyname)); + + if (keyname[0] == '\0') + snprintf(keyname, sizeof(keyname), "Keycode-%u", code); + + memset(compose, 0, sizeof(compose)); + _ecore_wl2_input_key_translate(sym, input->keyboard.modifiers, + compose, sizeof(compose)); + + ev = calloc(1, sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) + + ((compose[0] != '\0') ? strlen(compose) : 0) + 3); + if (!ev) return; + + ev->keyname = (char *)(ev + 1); + ev->key = ev->keyname + strlen(keyname) + 1; + ev->compose = strlen(compose) ? ev->key + strlen(key) + 1 : NULL; + ev->string = ev->compose; + + strcpy((char *)ev->keyname, keyname); + strcpy((char *)ev->key, key); + if (strlen(compose)) strcpy((char *)ev->compose, compose); + + ev->window = window->id; + ev->event_window = window->id; + ev->timestamp = timestamp; + ev->modifiers = input->keyboard.modifiers; + ev->keycode = code; + + if (state) + ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL); + else + ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL); +} + void _ecore_wl2_input_grab(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, unsigned int button) { @@ -527,7 +617,9 @@ _keyboard_cb_repeat(void *data) window = input->focus.keyboard; if (!window) goto out; - /* TODO: Send ecore key event for preseed */ + if (input->focus.keyboard == window) + _keyboard_cb_key(input, NULL, input->display->serial, + input->repeat.time, input->repeat.key, EINA_TRUE); return ECORE_CALLBACK_RENEW; @@ -562,7 +654,9 @@ _keyboard_cb_key(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsigned nsyms = xkb_state_key_get_syms(input->xkb.state, code, &syms); if (nsyms == 1) sym = syms[0]; - /* TODO: Send ecore key event */ + _ecore_wl2_input_key_send(input, window, sym, code, state, timestamp); + + if (!xkb_keymap_key_repeats(input->xkb.keymap, code)) return; if ((state == WL_KEYBOARD_KEY_STATE_RELEASED) && (keycode == input->repeat.key)) @@ -713,7 +807,7 @@ _touch_cb_motion(void *data, struct wl_touch *touch EINA_UNUSED, unsigned int ti if (!input) return; if (!input->focus.touch) return; - _ecore_wl2_input_mouse_move_send(input, input->focus.touch, timestamp, id); + _ecore_wl2_input_mouse_move_send(input, input->focus.touch, id); } static void --
