jpeg pushed a commit to branch master.

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

commit 350b465d22e310220625fb924f898deb8461ad34
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Wed Jun 1 15:32:35 2016 +0900

    Evas: Send Efl_Event_Key data to evas objects
---
 src/lib/evas/Evas_Common.h           |  2 +
 src/lib/evas/canvas/efl_event_key.c  |  1 -
 src/lib/evas/canvas/evas_callbacks.c | 67 ++++++++++------------------
 src/lib/evas/canvas/evas_events.c    | 85 +++++++++++++++++++++++++++++++++---
 src/lib/evas/include/evas_private.h  |  1 +
 5 files changed, 103 insertions(+), 53 deletions(-)

diff --git a/src/lib/evas/Evas_Common.h b/src/lib/evas/Evas_Common.h
index ac07077..65db02c 100644
--- a/src/lib/evas/Evas_Common.h
+++ b/src/lib/evas/Evas_Common.h
@@ -537,6 +537,7 @@ struct _Evas_Event_Key_Down /** Key press event */
    Evas_Device     *dev;
 
    unsigned int     keycode; /**< Key scan code numeric value @since 1.10 */
+   void            *reserved; /**< Reserved field for internal use only. 
@since 1.18 */
 };
 
 struct _Evas_Event_Key_Up /** Key release event */
@@ -554,6 +555,7 @@ struct _Evas_Event_Key_Up /** Key release event */
    Evas_Device     *dev;
 
    unsigned int     keycode; /**< Key scan code numeric value @since 1.10 */
+   void            *reserved; /**< Reserved field for internal use only. 
@since 1.18 */
 };
 
 struct _Evas_Event_Render_Post /** Send when the frame rendering is done 
@since 1.8 */
diff --git a/src/lib/evas/canvas/efl_event_key.c 
b/src/lib/evas/canvas/efl_event_key.c
index 677c624..6d6dc15 100644
--- a/src/lib/evas/canvas/efl_event_key.c
+++ b/src/lib/evas/canvas/efl_event_key.c
@@ -116,7 +116,6 @@ _efl_event_key_efl_event_dup(Eo *obj EINA_UNUSED, 
Efl_Event_Key_Data *pd)
         pd2->keyname   = eina_stringshare_add(pd->keyname);
         pd2->string    = eina_stringshare_add(pd->string);
         pd2->compose   = eina_stringshare_add(pd->compose);
-        pd2->legacy    = NULL;
         pd2->evas_done = 0;
      }
 
diff --git a/src/lib/evas/canvas/evas_callbacks.c 
b/src/lib/evas/canvas/evas_callbacks.c
index 94abde7..8b6a996 100644
--- a/src/lib/evas/canvas/evas_callbacks.c
+++ b/src/lib/evas/canvas/evas_callbacks.c
@@ -71,54 +71,34 @@ typedef struct
 
 
 static inline void *
-_pointer_event_get(const _eo_evas_object_cb_info *info, const Eo_Event *event,
-                   const Eo_Event_Description **pdesc)
+_efl_event_get(const _eo_evas_object_cb_info *info, const Eo_Event *event,
+               const Eo_Event_Description **pdesc, Efl_Event_Flags **pflags)
 {
    if (!info->data) return NULL;
 
    /* See also evas_events.c: _pointer_event_create() */
 
 #define EV_CASE(TYPE, NEWTYPE, Type) \
-   case EVAS_CALLBACK_ ## TYPE: \
-     *pdesc = EFL_EVENT_POINTER_ ## NEWTYPE; \
-     return ((Evas_Event_ ## Type *) event->info)->reserved
+      case EVAS_CALLBACK_ ## TYPE: \
+        *pdesc = EFL_EVENT_ ## NEWTYPE; \
+        *pflags = &((Evas_Event_ ## Type *) event->info)->event_flags; \
+        return ((Evas_Event_ ## Type *) event->info)->reserved
    switch (info->type)
      {
-      EV_CASE(MOUSE_MOVE, MOVE, Mouse_Move);
-      EV_CASE(MOUSE_OUT, OUT, Mouse_Out);
-      EV_CASE(MOUSE_IN, IN, Mouse_In);
-      EV_CASE(MOUSE_DOWN, DOWN, Mouse_Down);
-      EV_CASE(MOUSE_UP, UP, Mouse_Up);
-      EV_CASE(MULTI_MOVE, MOVE, Multi_Move);
-      EV_CASE(MULTI_DOWN, DOWN, Multi_Down);
-      EV_CASE(MULTI_UP, UP, Multi_Up);
-      EV_CASE(MOUSE_WHEEL, WHEEL, Mouse_Wheel);
+      EV_CASE(MOUSE_MOVE,  POINTER_MOVE,  Mouse_Move);
+      EV_CASE(MOUSE_OUT,   POINTER_OUT,   Mouse_Out);
+      EV_CASE(MOUSE_IN,    POINTER_IN,    Mouse_In);
+      EV_CASE(MOUSE_DOWN , POINTER_DOWN,  Mouse_Down);
+      EV_CASE(MOUSE_UP,    POINTER_UP,    Mouse_Up);
+      EV_CASE(MULTI_MOVE,  POINTER_MOVE,  Multi_Move);
+      EV_CASE(MULTI_DOWN,  POINTER_DOWN,  Multi_Down);
+      EV_CASE(MULTI_UP,    POINTER_UP,    Multi_Up);
+      EV_CASE(MOUSE_WHEEL, POINTER_WHEEL, Mouse_Wheel);
+      EV_CASE(KEY_DOWN,    KEY_DOWN,      Key_Down);
+      EV_CASE(KEY_UP,      KEY_UP,        Key_Up);
       default: return NULL;
      }
 #undef EV_CASE
-
-}
-
-static void
-_event_flags_adjust(void *ev, const Efl_Event_Pointer_Data *pedata)
-{
-#define EV_CASE(NEWTYPE, Type) \
-   case EFL_POINTER_ACTION_ ## NEWTYPE: \
-     ((Evas_Event_ ## Type *) ev)->event_flags = pedata->event_flags; \
-     break;
-
-   switch (pedata->action)
-     {
-      EV_CASE(MOVE, Mouse_Move);
-      EV_CASE(OUT, Mouse_Out);
-      EV_CASE(IN, Mouse_In);
-      EV_CASE(DOWN, Mouse_Down);
-      EV_CASE(UP, Mouse_Up);
-      EV_CASE(WHEEL, Mouse_Wheel);
-      default: break;
-     }
-
-#undef EV_CASE
 }
 
 static Eina_Bool
@@ -127,19 +107,16 @@ _eo_evas_object_cb(void *data, const Eo_Event *event)
    _eo_evas_object_cb_info *info = data;
    const Eo_Event_Description *desc;
    Evas *evas = evas_object_evas_get(event->object);
+   Efl_Event_Flags *pflags;
    void *pe;
 
-   pe = _pointer_event_get(info, event, &desc);
+   pe = _efl_event_get(info, event, &desc, &pflags);
    if (pe)
      {
-        Efl_Event_Pointer_Data *pedata;
-        Efl_Event_Flags flags;
-
-        pedata = eo_data_scope_get(pe, EFL_EVENT_POINTER_CLASS);
-        flags = pedata->event_flags;
+        Efl_Event_Flags flags = efl_event_flags_get(pe);
         eo_event_callback_call(event->object, desc, pe);
-        if (flags != pedata->event_flags)
-          _event_flags_adjust(event->info, pedata);
+        // write changes to event_flags back to the legacy struct
+        *pflags = flags;
      }
    if (info->func)
      {
diff --git a/src/lib/evas/canvas/evas_events.c 
b/src/lib/evas/canvas/evas_events.c
index 25bbb43..e3c837f 100644
--- a/src/lib/evas/canvas/evas_events.c
+++ b/src/lib/evas/canvas/evas_events.c
@@ -2636,7 +2636,8 @@ _canvas_event_feed_key_down_internal(Eo *eo_e,
                                      const char *compose,
                                      unsigned int timestamp,
                                      const void *data,
-                                     unsigned int keycode)
+                                     unsigned int keycode,
+                                     Efl_Event_Key_Data *ke)
 {
    Evas_Public_Data *e = _pd;
    int event_id = 0;
@@ -2666,6 +2667,16 @@ _canvas_event_feed_key_down_internal(Eo *eo_e,
    ev.keycode = keycode;
    if (ev.dev) eo_ref(ev.dev);
 
+   ev.reserved = ke ? ke->eo : NULL;
+   if (ke)
+     {
+        ke->device = ev.dev;
+        ke->event_flags = ev.event_flags;
+        ke->modifiers = ev.modifiers;
+        ke->locks = ev.locks;
+        ke->legacy = &ev;
+     }
+
    if (e->grabs)
      {
         Eina_List *l;
@@ -2732,6 +2743,15 @@ _canvas_event_feed_key_down_internal(Eo *eo_e,
    _evas_post_event_callback_call(eo_e, e);
    if (ev.dev) eo_unref(ev.dev);
    _evas_unwalk(e);
+
+   if (ke)
+     {
+        ke->device = NULL;
+        ke->event_flags = 0;
+        ke->modifiers = NULL;
+        ke->locks = NULL;
+        ke->legacy = NULL;
+     }
 }
 
 static void
@@ -2743,7 +2763,8 @@ _canvas_event_feed_key_up_internal(Eo *eo_e,
                                    const char *compose,
                                    unsigned int timestamp,
                                    const void *data,
-                                   unsigned int keycode)
+                                   unsigned int keycode,
+                                   Efl_Event_Key_Data *ke)
 {
    Evas_Public_Data *e = _pd;
    int event_id = 0;
@@ -2772,6 +2793,16 @@ _canvas_event_feed_key_up_internal(Eo *eo_e,
    ev.keycode = keycode;
    if (ev.dev) eo_ref(ev.dev);
 
+   ev.reserved = ke ? ke->eo : NULL;
+   if (ke)
+     {
+        ke->device = ev.dev;
+        ke->event_flags = ev.event_flags;
+        ke->modifiers = ev.modifiers;
+        ke->locks = ev.locks;
+        ke->legacy = &ev;
+     }
+
    if (e->grabs)
      {
         Eina_List *l;
@@ -2838,6 +2869,15 @@ _canvas_event_feed_key_up_internal(Eo *eo_e,
    _evas_post_event_callback_call(eo_e, e);
    if (ev.dev) eo_unref(ev.dev);
    _evas_unwalk(e);
+
+   if (ke)
+     {
+        ke->device = NULL;
+        ke->event_flags = 0;
+        ke->modifiers = NULL;
+        ke->locks = NULL;
+        ke->legacy = NULL;
+     }
 }
 
 EAPI void
@@ -2845,7 +2885,7 @@ evas_event_feed_key_down(Eo *eo_e, const char *keyname, 
const char *key, const c
 {
    Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
    _canvas_event_feed_key_down_internal(eo_e, e, keyname, key, string,
-                                        compose, timestamp, data, 0);
+                                        compose, timestamp, data, 0, NULL);
 }
 
 EAPI void
@@ -2853,7 +2893,7 @@ evas_event_feed_key_up(Eo *eo_e, const char *keyname, 
const char *key, const cha
 {
    Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
    _canvas_event_feed_key_up_internal(eo_e, e, keyname, key, string,
-                                      compose, timestamp, data, 0);
+                                      compose, timestamp, data, 0, NULL);
 }
 
 EAPI void
@@ -2861,7 +2901,7 @@ evas_event_feed_key_down_with_keycode(Eo *eo_e, const 
char *keyname, const char
 {
    Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
    _canvas_event_feed_key_down_internal(eo_e, e, keyname, key, string,
-                                        compose, timestamp, data, keycode);
+                                        compose, timestamp, data, keycode, 
NULL);
 }
 
 EAPI void
@@ -2869,7 +2909,7 @@ evas_event_feed_key_up_with_keycode(Eo *eo_e, const char 
*keyname, const char *k
 {
    Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
    _canvas_event_feed_key_up_internal(eo_e, e, keyname, key, string,
-                                      compose, timestamp, data, keycode);
+                                      compose, timestamp, data, keycode, NULL);
 }
 
 EAPI void
@@ -3298,6 +3338,35 @@ _evas_canvas_event_pointer_cb(void *data, const Eo_Event 
*event)
    return EO_CALLBACK_CONTINUE;
 }
 
+static Eina_Bool
+_evas_canvas_event_key_cb(void *data, const Eo_Event *event)
+{
+   Efl_Event_Key *evt = event->info;
+   Evas_Public_Data *e = data;
+   Efl_Event_Key_Data *ev;
+
+   ev = eo_data_scope_get(evt, EFL_EVENT_KEY_CLASS);
+   if (!ev) return EO_CALLBACK_CONTINUE;
+
+   if (ev->pressed)
+     {
+        _canvas_event_feed_key_down_internal(e->evas, e, ev->keyname, ev->key,
+                                             ev->string, ev->compose,
+                                             ev->timestamp, ev->data,
+                                             ev->keycode, ev);
+     }
+   else
+     {
+        _canvas_event_feed_key_up_internal(e->evas, e, ev->keyname, ev->key,
+                                           ev->string, ev->compose,
+                                           ev->timestamp, ev->data,
+                                           ev->keycode, ev);
+     }
+
+   ev->evas_done = EINA_FALSE;
+   return EO_CALLBACK_CONTINUE;
+}
+
 EO_CALLBACKS_ARRAY_DEFINE(_evas_canvas_event_pointer_callbacks,
 { EFL_EVENT_POINTER_MOVE, _evas_canvas_event_pointer_cb },
 { EFL_EVENT_POINTER_DOWN, _evas_canvas_event_pointer_cb },
@@ -3305,7 +3374,9 @@ 
EO_CALLBACKS_ARRAY_DEFINE(_evas_canvas_event_pointer_callbacks,
 { EFL_EVENT_POINTER_IN, _evas_canvas_event_pointer_cb },
 { EFL_EVENT_POINTER_OUT, _evas_canvas_event_pointer_cb },
 { EFL_EVENT_POINTER_CANCEL, _evas_canvas_event_pointer_cb },
-{ EFL_EVENT_POINTER_WHEEL, _evas_canvas_event_pointer_cb })
+{ EFL_EVENT_POINTER_WHEEL, _evas_canvas_event_pointer_cb },
+{ EFL_EVENT_KEY_DOWN, _evas_canvas_event_key_cb },
+{ EFL_EVENT_KEY_UP, _evas_canvas_event_key_cb })
 
 void
 _evas_canvas_event_init(Evas *eo_e, Evas_Public_Data *e)
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 7335ea5..abeb6c0 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1940,6 +1940,7 @@ Evas_Device *_evas_device_top_get(const Evas *e);
 /* legacy/eo events */
 Eina_Bool efl_event_pointer_legacy_info_set(Efl_Event_Pointer *evt, const void 
*event_info, Evas_Callback_Type type);
 const void *efl_event_pointer_legacy_info_get(const Efl_Event_Pointer *evt, 
Evas_Callback_Type *ptype, Eina_Bool multi);
+Eina_Bool efl_event_key_legacy_info_set(Efl_Event_Key *evt, const void 
*event_info, Evas_Callback_Type type);
 
 Eina_Bool evas_vg_loader_svg(Evas_Object *vg, const Eina_File *f, const char 
*key EINA_UNUSED);
 

-- 


Reply via email to