cedric pushed a commit to branch master.

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

commit ae4389a7bd8a6807c3df041cde7c1357b0c13a0c
Author: pierre lamot <pierre.la...@openwide.fr>
Date:   Thu Feb 19 16:34:33 2015 +0100

    ecore_cocoa: fix keyboad event handling
    
    This patch allows to interpret correctly several types of key combinations:
      - alt keys : € œ ¬
      - dead keys : ä ë
      - dead keys (bis, they are handled differently) : ~ ã
      - control keys: ^C ^A
      - page up/ page down
    
    @fix
    
    Signed-off-by: Cedric BAIL <ced...@osg.samsung.com>
---
 src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h |   4 +-
 src/lib/ecore_cocoa/ecore_cocoa.m      | 150 +++++++++++++++++----------------
 2 files changed, 79 insertions(+), 75 deletions(-)

diff --git a/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h 
b/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h
index f66ae91..89004d2 100644
--- a/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h
+++ b/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h
@@ -240,8 +240,8 @@ static const struct _ecore_cocoa_keys_s keystable[] =
 { NSInsertFunctionKey,       "Insert",       "" },
 { NSHomeFunctionKey,         "Home",         "" },
 { NSEndFunctionKey,          "End",          "" },
-{ NSPageUpFunctionKey,       "Page_Up",      "" },
-{ NSPageDownFunctionKey,     "Page_Down",    "" },
+{ NSPageUpFunctionKey,       "Prior",      "" },
+{ NSPageDownFunctionKey,     "Next",    "" },
 { NSDeleteFunctionKey,       "Delete",       "\010"},
 
 { NSF1FunctionKey,           "F1",           "" },
diff --git a/src/lib/ecore_cocoa/ecore_cocoa.m 
b/src/lib/ecore_cocoa/ecore_cocoa.m
index 60229b7..4f1b01f 100644
--- a/src/lib/ecore_cocoa/ecore_cocoa.m
+++ b/src/lib/ecore_cocoa/ecore_cocoa.m
@@ -86,7 +86,7 @@ _ecore_cocoa_event_modifiers(unsigned int mod)
 
    if(mod & NSShiftKeyMask) modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
    if(mod & NSControlKeyMask) modifiers |= ECORE_EVENT_MODIFIER_CTRL;
-   if(mod & NSAlternateKeyMask) modifiers |= ECORE_EVENT_MODIFIER_ALT;
+   if(mod & NSAlternateKeyMask) modifiers |= ECORE_EVENT_MODIFIER_ALTGR;
    if(mod & NSCommandKeyMask) modifiers |= ECORE_EVENT_MODIFIER_WIN;
    if(mod & NSNumericPadKeyMask) modifiers |= ECORE_EVENT_LOCK_NUM;
 
@@ -94,6 +94,63 @@ _ecore_cocoa_event_modifiers(unsigned int mod)
    return modifiers;
 }
 
+
+static inline Ecore_Event_Key*
+_ecore_cocoa_event_key(NSEvent *event, int keyType)
+{
+   static Eina_Bool compose = EINA_FALSE;
+   static NSText *edit;
+   unsigned int i;
+
+   Ecore_Event_Key *ev;
+
+   EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
+   NSString *keychar = [event charactersIgnoringModifiers];
+   NSString *keycharRaw = [event characters];
+
+   ev = calloc(1, sizeof (Ecore_Event_Key));
+   if (!ev) return NULL;
+
+   if (compose && keyType == NSKeyDown)
+     {
+        [edit interpretKeyEvents:[NSArray arrayWithObject:event]];
+        compose=EINA_FALSE;
+     }
+
+   ev->modifiers = _ecore_cocoa_event_modifiers([event modifierFlags]);
+
+   ev->keycode = event.keyCode;
+   ev->string = [keycharRaw cStringUsingEncoding:NSUTF8StringEncoding];
+   ev->compose = ev->string;
+
+   ev->window = (Ecore_Window)window.ecore_window_data;
+   ev->event_window = ev->window;
+
+   if ([keychar length] > 0)
+     {
+        for (i = 0; i < sizeof (keystable) / sizeof (struct 
_ecore_cocoa_keys_s); ++i)
+          {
+             if (keystable[i].code == [keychar characterAtIndex:0])
+               {
+                  ev->keyname = keystable[i].name;
+                  ev->key = ev->keyname;
+                  break;
+               }
+          }
+     }
+
+   if ([keycharRaw length] == 0  && keyType == NSKeyDown)
+     {
+        compose=EINA_TRUE;
+        edit = [[event window]  fieldEditor:YES forObject:nil];
+        [edit interpretKeyEvents:[NSArray arrayWithObject:event]];
+        free(ev);
+        return NULL;
+     }
+
+   return ev;
+}
+
 static inline Eina_Bool
 _nsevent_window_is_type_of(NSEvent *event, Class class)
 {
@@ -116,8 +173,6 @@ ecore_cocoa_feed_events(void *anEvent)
    NSEvent *event = anEvent;
    unsigned int time = (unsigned int)((unsigned long long)(ecore_time_get() * 
1000.0) & 0xffffffff);
    Eina_Bool pass = EINA_FALSE;
-   static Eina_Bool compose = EINA_FALSE;
-   static NSText *edit;
 
    switch ([event type])
    {
@@ -138,77 +193,24 @@ ecore_cocoa_feed_events(void *anEvent)
       case NSKeyDown:
       {
          Ecore_Event_Key *ev;
-         unsigned int     i;
-         EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
-         NSString *keychar = [event characters];
-
-         ev = calloc(1, sizeof (Ecore_Event_Key));
-         if (!ev) return pass;
-         ev->timestamp = time;
-         ev->modifiers = _ecore_cocoa_event_modifiers([event modifierFlags]);
 
-         if (compose)
-           {
-              [edit interpretKeyEvents:[NSArray arrayWithObject:event]];
-              compose=EINA_FALSE;
-           }
+         ev = _ecore_cocoa_event_key(event, NSKeyDown);
+         if (ev == NULL) return EINA_TRUE;
 
-         if ([keychar length] > 0)
-           {
-              for (i = 0; i < sizeof (keystable) / sizeof (struct 
_ecore_cocoa_keys_s); ++i)
-                {
-                   if (keystable[i].code == [keychar characterAtIndex:0])
-                     {
-                        DBG("Key pressed: %s %d\n", keystable[i].name, 
[keychar characterAtIndex:0]);
-                        ev->keyname = keystable[i].name;
-                        ev->key = keystable[i].name;
-                        ev->string = keystable[i].compose;
-                        ev->window = (Ecore_Window)window.ecore_window_data;
-                        ev->event_window = ev->window;
-                        ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
-                        return pass;
-                     }
-                }
-           }
-         else
-           {
-              compose=EINA_TRUE;
-              edit = [[event window]  fieldEditor:YES forObject:nil];
-              [edit interpretKeyEvents:[NSArray arrayWithObject:event]];
-           }
+         ev->timestamp = time;
+         ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
 
          break;
       }
       case NSKeyUp:
       {
          Ecore_Event_Key *ev;
-         unsigned int     i;
-         EcoreCocoaWindow *window = (EcoreCocoaWindow *)[event window];
-         NSString *keychar = [event characters];
 
-         DBG("Key Up\n");
+         ev = _ecore_cocoa_event_key(event, NSKeyUp);
+         if (ev == NULL) return EINA_TRUE;
 
-         ev = calloc(1, sizeof (Ecore_Event_Key));
-         if (!ev) return pass;
          ev->timestamp = time;
-         ev->modifiers = _ecore_cocoa_event_modifiers([event modifierFlags]);
-
-         if ([keychar length] > 0)
-           {
-              for (i = 0; i < sizeof (keystable) / sizeof (struct 
_ecore_cocoa_keys_s); ++i)
-                {
-                   if (keystable[i].code == [keychar characterAtIndex:0])
-                     {
-                        ev->keyname = keystable[i].name;
-                        ev->key = keystable[i].name;
-                        ev->string = keystable[i].compose;
-                        ev->window = (Ecore_Window)window.ecore_window_data;
-                        ev->event_window = ev->window;
-                        ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
-                        return pass;
-                     }
-                }
-           }
+         ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
 
          break;
       }
@@ -222,13 +224,6 @@ ecore_cocoa_feed_events(void *anEvent)
          evDown = calloc(1, sizeof (Ecore_Event_Key));
          if (!evDown) return pass;
 
-         evUp = calloc(1, sizeof (Ecore_Event_Key));
-         if (!evUp)
-           {
-              free(evDown);
-              return pass;
-           }
-
          // Turn special key flags on
          if (flags & NSShiftKeyMask)
             evDown->key = "Shift_L";
@@ -243,13 +238,22 @@ ecore_cocoa_feed_events(void *anEvent)
 
          if (evDown->key)
          {
+            evDown->keyname = evDown->key;
             evDown->timestamp = time;
-            evDown->string = "";
+            evDown->string = NULL;
             ecore_event_add(ECORE_EVENT_KEY_DOWN, evDown, NULL, NULL);
             old_flags = flags;
             break;
          }
 
+         free(evDown);
+
+         evUp = calloc(1, sizeof (Ecore_Event_Key));
+         if (!evUp)
+           {
+              return pass;
+           }
+
          int changed_flags = flags ^ old_flags;
 
          // Turn special key flags off
@@ -266,8 +270,9 @@ ecore_cocoa_feed_events(void *anEvent)
 
          if (evUp->key)
          {
+            evUp->keyname = evDown->key;
             evUp->timestamp = time;
-            evUp->string = "";
+            evUp->string = NULL;
             ecore_event_add(ECORE_EVENT_KEY_UP, evUp, NULL, NULL);
             old_flags = flags;
             break;
@@ -361,4 +366,3 @@ ecore_cocoa_titlebar_height_get(void)
      }
    return height;
 }
-

-- 


Reply via email to