diff options
-rw-r--r-- | src/lib/evas/canvas/efl_canvas_object.eo | 2 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_callbacks.c | 68 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_object_main.c | 5 | ||||
-rw-r--r-- | src/lib/evas/include/evas_private.h | 3 |
4 files changed, 33 insertions, 45 deletions
diff --git a/src/lib/evas/canvas/efl_canvas_object.eo b/src/lib/evas/canvas/efl_canvas_object.eo index c6583fa9b8..4a04164366 100644 --- a/src/lib/evas/canvas/efl_canvas_object.eo +++ b/src/lib/evas/canvas/efl_canvas_object.eo @@ -627,6 +627,8 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator, Efl.Object.event_callback_legacy_call; Efl.Object.event_callback_call; Efl.Object.provider_find; + Efl.Object.event_callback_track_registered; + Efl.Object.event_callback_track_unregistered; Efl.Gfx.visible { get; set; } Efl.Gfx.color { get; set; } Efl.Gfx.color_part { get; set; } diff --git a/src/lib/evas/canvas/evas_callbacks.c b/src/lib/evas/canvas/evas_callbacks.c index b2a5e9e3ed..cc2bfc9e20 100644 --- a/src/lib/evas/canvas/evas_callbacks.c +++ b/src/lib/evas/canvas/evas_callbacks.c @@ -633,63 +633,47 @@ evas_post_event_callback_remove_full(Evas *eo_e, Evas_Object_Event_Post_Cb func, static void _animator_repeater(void *data, const Efl_Event *event) { - Evas_Object_Protected_Data *obj = data; + Eo *obj = data; - efl_event_callback_call(obj->object, EFL_EVENT_ANIMATOR_TICK, event->info); - DBG("Emitting animator tick on %p.", obj->object); + efl_event_callback_call(obj, EFL_EVENT_ANIMATOR_TICK, event->info); + DBG("Emitting animator tick on %p.", obj); } -static void -_check_event_catcher_add(void *data, const Efl_Event *event) +void +_efl_canvas_object_efl_object_event_callback_track_registered(Eo *obj, Evas_Object_Protected_Data *pd, const Efl_Event_Description *desc) { - const Efl_Callback_Array_Item *array = event->info; - Evas_Object_Protected_Data *obj = data; Evas_Callback_Type type = EVAS_CALLBACK_LAST; - int i; - for (i = 0; array[i].desc != NULL; i++) + if (desc == EFL_EVENT_ANIMATOR_TICK) { - if (array[i].desc == EFL_EVENT_ANIMATOR_TICK) - { - if (obj->animator_ref++ > 0) break; - - efl_event_callback_add(obj->layer->evas->evas, EFL_EVENT_ANIMATOR_TICK, _animator_repeater, obj); - INF("Registering an animator tick on canvas %p for object %p.", - obj->layer->evas->evas, obj->object); - } - else if ((type = _legacy_evas_callback_type(array[i].desc)) != EVAS_CALLBACK_LAST) - { - obj->callback_mask |= (1 << type); - } + efl_event_callback_add(pd->layer->evas->evas, EFL_EVENT_ANIMATOR_TICK, _animator_repeater, obj); + INF("Registering an animator tick on canvas %p for object %p.", + pd->layer->evas->evas, obj); + } + else if ((type = _legacy_evas_callback_type(desc)) != EVAS_CALLBACK_LAST) + { + pd->callback_mask |= (1 << type); } } -static void -_check_event_catcher_del(void *data, const Efl_Event *event) +void +_efl_canvas_object_efl_object_event_callback_track_unregistered(Eo *obj, Evas_Object_Protected_Data *pd, const Efl_Event_Description *desc) { - const Efl_Callback_Array_Item *array = event->info; - Evas_Object_Protected_Data *obj = data; - int i; - - for (i = 0; array[i].desc != NULL; i++) + if (desc == EFL_EVENT_ANIMATOR_TICK) { - if (array[i].desc == EFL_EVENT_ANIMATOR_TICK) - { - if ((--obj->animator_ref) > 0) break; - - efl_event_callback_del(obj->layer->evas->evas, EFL_EVENT_ANIMATOR_TICK, _animator_repeater, obj); - INF("Unregistering an animator tick on canvas %p for object %p.", - obj->layer->evas->evas, obj->object); - } + efl_event_callback_del(pd->layer->evas->evas, EFL_EVENT_ANIMATOR_TICK, _animator_repeater, obj); + INF("Unregistering an animator tick on canvas %p for object %p.", + pd->layer->evas->evas, pd->object); } } -EFL_CALLBACKS_ARRAY_DEFINE(event_catcher_watch, - { EFL_EVENT_CALLBACK_ADD, _check_event_catcher_add }, - { EFL_EVENT_CALLBACK_DEL, _check_event_catcher_del }); - void -evas_object_callback_init(Efl_Canvas_Object *eo_obj, Evas_Object_Protected_Data *obj) +evas_object_callback_init(Efl_Class *klass) { - efl_event_callback_array_add(eo_obj, event_catcher_watch(), obj); + Evas_Callback_Type type; + + efl_event_callback_track(klass, EFL_EVENT_ANIMATOR_TICK, EINA_FALSE); + + for (type = 0; type < EVAS_CALLBACK_LAST; type++) + efl_event_callback_track(klass, _legacy_evas_callback_table(type), EINA_TRUE); } diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 4ebb7486f5..54d331316a 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -187,7 +187,10 @@ _efl_canvas_object_efl_object_constructor(Eo *eo_obj, Evas_Object_Protected_Data obj->mask = eina_cow_alloc(evas_object_mask_cow); evas_object_inject(eo_obj, obj, evas); - evas_object_callback_init(eo_obj, obj); + + // Ideally this should be called by inheritance during the children class creation + // Sadly Eo doesn't seems to provide this for class constructor. + evas_object_callback_init(eo_obj); return eo_obj; } diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 7360391259..fb359e5a94 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1173,7 +1173,6 @@ struct _Evas_Object_Protected_Data unsigned int ref; - unsigned int animator_ref; uint64_t callback_mask; unsigned char no_change_render; @@ -1631,7 +1630,7 @@ void evas_object_clip_across_check(Evas_Object *obj, Evas_Object_Protected_Data void evas_object_clip_across_clippees_check(Evas_Object *obj, Evas_Object_Protected_Data *pd); void evas_object_mapped_clip_across_mark(Evas_Object *obj, Evas_Object_Protected_Data *pd); void evas_event_callback_call(Evas *e, Evas_Callback_Type type, void *event_info); -void evas_object_callback_init(Efl_Canvas_Object *eo_obj, Evas_Object_Protected_Data *obj); +void evas_object_callback_init(Efl_Class *klass); void evas_object_event_callback_call(Evas_Object *obj, Evas_Object_Protected_Data *pd, Evas_Callback_Type type, void *event_info, int event_id, const Efl_Event_Description *efl_event_desc); Eina_List *evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y); int evas_mem_free(int mem_required); |