From 350b465d22e310220625fb924f898deb8461ad34 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Wed, 1 Jun 2016 15:32:35 +0900 Subject: [PATCH] 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 ac07077cdf..65db02c93a 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 677c6247e2..6d6dc1565f 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 94abde70f0..8b6a9964ed 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 25bbb43416..e3c837f085 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 7335ea568b..abeb6c0efb 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);