Commit 348f6b42 authored by Marcel Hollerbach's avatar Marcel Hollerbach

ecore_wl2: be compatible with x input

This commit introduces a new state per input, this state is just for the
keymap and no modifieres, the state is used to get the keysym from a
keycode. This is done to stay compatible with x since keyname in efl is
the characters which are describing the key which is pressed, without
the transformation of shift etc.

This also escapes keycodes from beeing a utf8 character, and passes out
a keyname instead of the utf8 symbol.

fix T3976
fix T4184
parent 82f62b62
...@@ -414,33 +414,35 @@ _ecore_wl2_input_key_translate(xkb_keysym_t keysym, unsigned int modifiers, char ...@@ -414,33 +414,35 @@ _ecore_wl2_input_key_translate(xkb_keysym_t keysym, unsigned int modifiers, char
} }
static void 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_wl2_input_symbol_rep_find(xkb_keysym_t keysym, char *buffer, int size, unsigned int code)
{
int n = 0;
n = xkb_keysym_to_utf8(keysym, buffer, size);
/* check if we are a control code */
if (n > 0 && !(buffer[0] > 0x0 && buffer[0] < 0x20))
return;
if (xkb_keysym_get_name(keysym, buffer, size) != 0)
return;
snprintf(buffer, size, "Keycode-%u", code);
}
static void
_ecore_wl2_input_key_send(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, xkb_keysym_t sym, xkb_keysym_t sym_name, unsigned int code, unsigned int state, unsigned int timestamp)
{ {
Ecore_Event_Key *ev; Ecore_Event_Key *ev;
char key[256], keyname[256], compose[256]; char key[256], keyname[256], compose[256];
memset(key, 0, sizeof(key)); memset(key, 0, sizeof(key));
memset(keyname, 0, sizeof(keyname)); memset(keyname, 0, sizeof(keyname));
memset(compose, 0, sizeof(compose));
/*try to get a name or utf char of the given symbol */ /*try to get a name or utf char of the given symbol */
xkb_keysym_to_utf8(sym, keyname, sizeof(keyname)); _ecore_wl2_input_symbol_rep_find(sym, key, sizeof(key), code);
xkb_keysym_get_name(sym, key, sizeof(key)); _ecore_wl2_input_symbol_rep_find(sym_name, keyname, sizeof(keyname), code);
if (keyname[0] == '\0' && key[0] != '\0')
{
memcpy(keyname, key, sizeof(key));
}
else if (keyname[0] != '\0' && key[0] == '\0')
{
memcpy(key, keyname, sizeof(keyname));
}
else if (keyname[0] == '\0' && key[0] == '\0')
{
snprintf(keyname, sizeof(keyname), "Keycode-%u", code);
memcpy(key, keyname, sizeof(keyname));
}
memset(compose, 0, sizeof(compose));
_ecore_wl2_input_key_translate(sym, input->keyboard.modifiers, _ecore_wl2_input_key_translate(sym, input->keyboard.modifiers,
compose, sizeof(compose)); compose, sizeof(compose));
...@@ -463,6 +465,8 @@ _ecore_wl2_input_key_send(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, xkb_ ...@@ -463,6 +465,8 @@ _ecore_wl2_input_key_send(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, xkb_
ev->modifiers = input->keyboard.modifiers; ev->modifiers = input->keyboard.modifiers;
ev->keycode = code; ev->keycode = code;
DBG("Emitting Key event (%s,%s,%s,%s)\n", ev->keyname, ev->key, ev->compose, ev->string);
if (state) if (state)
ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL); ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
else else
...@@ -709,6 +713,7 @@ _keyboard_cb_keymap(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsign ...@@ -709,6 +713,7 @@ _keyboard_cb_keymap(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsign
/* free any existing keymap and state */ /* free any existing keymap and state */
if (input->xkb.keymap) xkb_map_unref(input->xkb.keymap); if (input->xkb.keymap) xkb_map_unref(input->xkb.keymap);
if (input->xkb.state) xkb_state_unref(input->xkb.state); if (input->xkb.state) xkb_state_unref(input->xkb.state);
if (input->xkb.maskless_state) xkb_state_unref(input->xkb.maskless_state);
input->xkb.keymap = input->xkb.keymap =
xkb_map_new_from_string(input->display->xkb_context, map, xkb_map_new_from_string(input->display->xkb_context, map,
...@@ -724,7 +729,9 @@ _keyboard_cb_keymap(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsign ...@@ -724,7 +729,9 @@ _keyboard_cb_keymap(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsign
} }
input->xkb.state = xkb_state_new(input->xkb.keymap); input->xkb.state = xkb_state_new(input->xkb.keymap);
if (!input->xkb.state) input->xkb.maskless_state = xkb_state_new(input->xkb.keymap);
if (!input->xkb.state || !input->xkb.maskless_state)
{ {
ERR("Failed to create keymap state"); ERR("Failed to create keymap state");
xkb_map_unref(input->xkb.keymap); xkb_map_unref(input->xkb.keymap);
...@@ -817,7 +824,7 @@ _keyboard_cb_repeat(void *data) ...@@ -817,7 +824,7 @@ _keyboard_cb_repeat(void *data)
window = input->focus.keyboard; window = input->focus.keyboard;
if (!window) goto out; if (!window) goto out;
_ecore_wl2_input_key_send(input, input->focus.keyboard, input->repeat.sym, input->repeat.key + 8, WL_KEYBOARD_KEY_STATE_PRESSED, input->repeat.time); _ecore_wl2_input_key_send(input, input->focus.keyboard, input->repeat.sym, input->repeat.sym_name, input->repeat.key + 8, WL_KEYBOARD_KEY_STATE_PRESSED, input->repeat.time);
if (!input->repeat.repeating) if (!input->repeat.repeating)
{ {
...@@ -838,9 +845,8 @@ _keyboard_cb_key(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsigned ...@@ -838,9 +845,8 @@ _keyboard_cb_key(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsigned
{ {
Ecore_Wl2_Input *input; Ecore_Wl2_Input *input;
Ecore_Wl2_Window *window; Ecore_Wl2_Window *window;
unsigned int code, nsyms; unsigned int code;
const xkb_keysym_t *syms; xkb_keysym_t sym = XKB_KEY_NoSymbol, sym_name = XKB_KEY_NoSymbol;
xkb_keysym_t sym = XKB_KEY_NoSymbol;
input = data; input = data;
if (!input) return; if (!input) return;
...@@ -854,10 +860,10 @@ _keyboard_cb_key(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsigned ...@@ -854,10 +860,10 @@ _keyboard_cb_key(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsigned
/* xkb rules reflect X broken keycodes, so offset by 8 */ /* xkb rules reflect X broken keycodes, so offset by 8 */
code = keycode + 8; code = keycode + 8;
nsyms = xkb_state_key_get_syms(input->xkb.state, code, &syms); sym = xkb_state_key_get_one_sym(input->xkb.state, code);
if (nsyms == 1) sym = syms[0]; sym_name = xkb_state_key_get_one_sym(input->xkb.maskless_state, code);
_ecore_wl2_input_key_send(input, window, sym, code, state, timestamp); _ecore_wl2_input_key_send(input, window, sym, sym_name, code, state, timestamp);
if (!xkb_keymap_key_repeats(input->xkb.keymap, code)) return; if (!xkb_keymap_key_repeats(input->xkb.keymap, code)) return;
...@@ -876,6 +882,7 @@ _keyboard_cb_key(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsigned ...@@ -876,6 +882,7 @@ _keyboard_cb_key(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsigned
if (!input->repeat.enabled) return; if (!input->repeat.enabled) return;
input->repeat.sym = sym; input->repeat.sym = sym;
input->repeat.sym_name = sym;
input->repeat.key = keycode; input->repeat.key = keycode;
input->repeat.time = timestamp; input->repeat.time = timestamp;
...@@ -1369,6 +1376,7 @@ _ecore_wl2_input_del(Ecore_Wl2_Input *input) ...@@ -1369,6 +1376,7 @@ _ecore_wl2_input_del(Ecore_Wl2_Input *input)
if (input->data.device) wl_data_device_destroy(input->data.device); if (input->data.device) wl_data_device_destroy(input->data.device);
if (input->xkb.state) xkb_state_unref(input->xkb.state); if (input->xkb.state) xkb_state_unref(input->xkb.state);
if (input->xkb.maskless_state) xkb_state_unref(input->xkb.maskless_state);
if (input->xkb.keymap) xkb_map_unref(input->xkb.keymap); if (input->xkb.keymap) xkb_map_unref(input->xkb.keymap);
if (input->wl.seat) wl_seat_destroy(input->wl.seat); if (input->wl.seat) wl_seat_destroy(input->wl.seat);
......
...@@ -388,6 +388,7 @@ struct _Ecore_Wl2_Input ...@@ -388,6 +388,7 @@ struct _Ecore_Wl2_Input
{ {
struct xkb_keymap *keymap; struct xkb_keymap *keymap;
struct xkb_state *state; struct xkb_state *state;
struct xkb_state *maskless_state;
xkb_mod_mask_t control_mask; xkb_mod_mask_t control_mask;
xkb_mod_mask_t alt_mask; xkb_mod_mask_t alt_mask;
xkb_mod_mask_t shift_mask; xkb_mod_mask_t shift_mask;
...@@ -405,7 +406,7 @@ struct _Ecore_Wl2_Input ...@@ -405,7 +406,7 @@ struct _Ecore_Wl2_Input
struct struct
{ {
Ecore_Timer *timer; Ecore_Timer *timer;
unsigned int sym, key, time; unsigned int sym, sym_name, key, time;
double rate, delay; double rate, delay;
Eina_Bool enabled : 1; Eina_Bool enabled : 1;
Eina_Bool repeating : 1; Eina_Bool repeating : 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment