jayji pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=5e149977e749eac878e8bcb01ce77f45f91c47ea

commit 5e149977e749eac878e8bcb01ce77f45f91c47ea
Author: Jean Guyomarc'h <j...@guyomarch.bzh>
Date:   Sun Oct 30 16:35:56 2016 +0100

    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
---
 src/lib/ecore_cocoa/ecore_cocoa.m | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/lib/ecore_cocoa/ecore_cocoa.m 
b/src/lib/ecore_cocoa/ecore_cocoa.m
index 7204f89..8fa9e09 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))

-- 


Reply via email to