summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2017-02-13 16:50:17 -0800
committerCedric Bail <cedric@osg.samsung.com>2017-02-14 15:11:45 -0800
commitf700664f7b099fd4b1a6980300cdd19a9775d814 (patch)
tree7f0f4423ce1fd6515556de4ad46a5bb7d43766a5
parentc4726d38890aafe257d1c7a97512981833ab974c (diff)
downloadefl-devs/cedric/track_callbacks.tar.gz
evas: use new callback tracker infrastructure.devs/cedric/track_callbacks
-rw-r--r--src/lib/evas/canvas/efl_canvas_object.eo2
-rw-r--r--src/lib/evas/canvas/evas_callbacks.c68
-rw-r--r--src/lib/evas/canvas/evas_object_main.c5
-rw-r--r--src/lib/evas/include/evas_private.h3
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);