diff options
author | Jean Guyomarc'h <jean@guyomarch.bzh> | 2016-10-30 16:35:56 +0100 |
---|---|---|
committer | Jean Guyomarc'h <jean@guyomarch.bzh> | 2016-10-30 16:46:30 +0100 |
commit | 5e149977e749eac878e8bcb01ce77f45f91c47ea (patch) | |
tree | 7a975b22a9bfcd3cf61904e131a5ab755b36f831 | |
parent | 5c366cab268a8e6b1d11b84794277c725040d3e6 (diff) | |
download | efl-5e149977e749eac878e8bcb01ce77f45f91c47ea.tar.gz |
ecore_cocoa: fix handling of some keys
The ascii circumflex (^) can be typed by pressing twice the ^ key on a
mac keyboard. A single press allows composition (e.g. ^+e = ê).
Pressing ^ twice though, led to a segmentation fault in elementary,
because the result character of the operation (^) appeared in the raw
characters stack, and not in the filtered one.
This is a bit weird, as backtick (`) appears in the filtered keys stack.
@fix
-rw-r--r-- | src/lib/ecore_cocoa/ecore_cocoa.m | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/lib/ecore_cocoa/ecore_cocoa.m b/src/lib/ecore_cocoa/ecore_cocoa.m index 7204f89417..8fa9e09c36 100644 --- a/src/lib/ecore_cocoa/ecore_cocoa.m +++ b/src/lib/ecore_cocoa/ecore_cocoa.m @@ -115,6 +115,7 @@ _ecore_cocoa_event_key(NSEvent *event, static Eina_Bool compose = EINA_FALSE; static NSText *edit; unsigned int i; + int kchar = -1; Ecore_Event_Key *ev; @@ -143,22 +144,33 @@ _ecore_cocoa_event_key(NSEvent *event, ev->window = (Ecore_Window)window.ecore_window_data; ev->event_window = ev->window; + /* + * Try to look for the keychar data if available. + * If not, try the raw keychar. + */ if ([keychar length] > 0) + kchar = [keychar characterAtIndex: 0]; + if ((kchar < 0) && ([keycharRaw length] > 0)) + kchar = [keycharRaw characterAtIndex: 0]; + + if (kchar >= 0) { for (i = 0; i < EINA_C_ARRAY_LENGTH(keystable); ++i) { - if (keystable[i].code == [keychar characterAtIndex:0]) + if (keystable[i].code == kchar) { ev->keyname = keystable[i].name; ev->key = ev->keyname; break; } } - if (ev->keyname == NULL) - { - ev->keyname = ""; - ev->key = ""; - } + } + + /* Fallback */ + if (!ev->keyname) + { + ev->keyname = ""; + ev->key = ""; } if (([keycharRaw length] == 0) && (keyType == NSEventTypeKeyDown)) |