tasn pushed a commit to branch eo-events-hash. http://git.enlightenment.org/core/efl.git/commit/?id=85a9d69b8c89d218e683e96761f96974909b29a2
commit 85a9d69b8c89d218e683e96761f96974909b29a2 Author: Tom Hacohen <[email protected]> Date: Thu May 1 14:13:08 2014 +0100 Eo: implemented a function to get event description from name. It's called: eo_event_global_event_from_name_get(). It's useful for dynamic method calling from bindings, and is needed for better legacy (smart) callbacks support. @feature --- src/lib/eo/Eo.h | 9 +++++++++ src/lib/eo/eo.c | 25 +++++++++++++++++++++++++ src/lib/eo/eo_base_class.c | 14 ++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/src/lib/eo/Eo.h b/src/lib/eo/Eo.h index 13179b8..be19528 100644 --- a/src/lib/eo/Eo.h +++ b/src/lib/eo/Eo.h @@ -1258,6 +1258,15 @@ EAPI void eo_event_global_thaw(void); EAPI int eo_event_global_freeze_get(void); /** + * @brief return an event structure from its name. + * + * @param[in] name The name of the events. + * + * @return the event structure with that name. + */ +EAPI const Eo_Event_Description *eo_event_from_name_get(const char *name); + +/** * @def eo_event_callback_add(obj, desc, cb, data) * Add a callback for an event. * @param[in] desc The description of the event to listen to. diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c index b22a15a..cea1a39 100644 --- a/src/lib/eo/eo.c +++ b/src/lib/eo/eo.c @@ -15,6 +15,8 @@ EAPI Eina_Spinlock _eo_class_creation_lock; int _eo_log_dom = -1; +Eina_Hash *_eo_events_hash = NULL; + static _Eo_Class **_eo_classes; static Eo_Id _eo_classes_last_id; static Eina_Bool _eo_init_count = 0; @@ -1418,6 +1420,24 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...) _eo_classes = tmp; _eo_classes[klass->header.id - 1] = klass; } + + /* Add events to the events hash. */ + if (klass->desc->events) + { + const Eo_Event_Description **event_itr; + for (event_itr = klass->desc->events ; *event_itr ; event_itr++) + { + const Eo_Event_Description *event = *event_itr; + + if (eina_hash_find(_eo_events_hash, event->name)) + { + ERR("Event named '%s' was already found. This may cause issues.", event->name); + } + + eina_hash_direct_add(_eo_events_hash, event->name, event); + } + } + eina_spinlock_release(&_eo_class_creation_lock); _eo_class_constructor(klass); @@ -1776,6 +1796,8 @@ eo_init(void) } } + _eo_events_hash = eina_hash_string_superfast_new(NULL); + return EINA_TRUE; } @@ -1792,6 +1814,9 @@ eo_shutdown(void) EINA_LOG_STATE_START, EINA_LOG_STATE_SHUTDOWN); + eina_hash_free(_eo_events_hash); + _eo_events_hash = NULL; + for (i = 0 ; i < _eo_classes_last_id ; i++, cls_itr++) { if (*cls_itr) diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c index 21d7d2d..2644fb6 100644 --- a/src/lib/eo/eo_base_class.c +++ b/src/lib/eo/eo_base_class.c @@ -8,6 +8,7 @@ #include "eo_ptr_indirection.h" #include "eo_private.h" +extern Eina_Hash *_eo_events_hash; static int event_freeze_count = 0; typedef struct _Eo_Callback_Description Eo_Callback_Description; @@ -702,6 +703,7 @@ end: return ret; } + EAPI EO_FUNC_BODYV(eo_event_callback_call, Eina_Bool, EINA_FALSE, EO_FUNC_CALL(desc, event_info), @@ -811,6 +813,17 @@ _ev_global_freeze_get(const Eo_Class *klass EINA_UNUSED, void *class_data EINA_U } EAPI EO_FUNC_BODY(eo_event_global_freeze_get, int, 0); +static const Eo_Event_Description * +_ev_from_name_get(const Eo_Class *klass EINA_UNUSED, const char *name) +{ + return eina_hash_find(_eo_events_hash, name); +} + +EAPI EO_FUNC_BODYV(eo_event_from_name_get, + const Eo_Event_Description *, NULL, + EO_FUNC_CALL(name), + const char *name); + /* Eo_Dbg */ EAPI void eo_dbg_info_free(Eo_Dbg_Info *info) @@ -977,6 +990,7 @@ static Eo_Op_Description op_descs [] = { EO_OP_CLASS_FUNC(eo_event_global_freeze, _ev_global_freeze, "Freezes events globally."), EO_OP_CLASS_FUNC(eo_event_global_thaw, _ev_global_thaw, "Thaws events globally."), EO_OP_CLASS_FUNC(eo_event_global_freeze_get, _ev_global_freeze_get, "Get global event freeze counter."), + EO_OP_CLASS_FUNC(eo_event_from_name_get, _ev_from_name_get, "Translate an event string to an event struct."), EO_OP_FUNC(eo_dbg_info_get, _dbg_info_get, "Get debug info list for obj."), EO_OP_SENTINEL }; --
