summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2016-01-28 16:15:20 -0800
committerCedric BAIL <cedric@osg.samsung.com>2016-02-02 10:47:01 -0800
commite8134e868a4369a89e2bb1d65e8ea8dfd72684ad (patch)
treeda37b66957656f552d4ad84be496bdd1c6899950
parent62030c1003111985922cdb25d56d448601584606 (diff)
downloadefl-e8134e868a4369a89e2bb1d65e8ea8dfd72684ad.tar.gz
evas: make evas object an animator provider.
-rw-r--r--src/lib/evas/canvas/evas_object.eo2
-rw-r--r--src/lib/evas/canvas/evas_object_main.c79
-rw-r--r--src/lib/evas/include/evas_private.h2
3 files changed, 82 insertions, 1 deletions
diff --git a/src/lib/evas/canvas/evas_object.eo b/src/lib/evas/canvas/evas_object.eo
index 8baa9656ac..5f9bb56c32 100644
--- a/src/lib/evas/canvas/evas_object.eo
+++ b/src/lib/evas/canvas/evas_object.eo
@@ -1,6 +1,6 @@
import evas_types;
-abstract Evas.Object (Eo.Base, Evas.Common_Interface, Efl.Gfx.Base, Efl.Gfx.Stack)
+abstract Evas.Object (Eo.Base, Evas.Common_Interface, Efl.Gfx.Base, Efl.Gfx.Stack, Efl.Core.Animator)
{
eo_prefix: evas_obj;
data: Evas_Object_Protected_Data;
diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c
index 9f83689524..3c986a7fbf 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -82,6 +82,83 @@ _init_cow(void)
return EINA_TRUE;
}
+static Eina_Bool
+_animator_repeater(void *data,
+ Eo *eo_obj EINA_UNUSED,
+ const Eo_Event_Description2 *desc EINA_UNUSED,
+ void *event_info)
+{
+ Evas_Object_Protected_Data *obj = data;
+
+ eo_do(obj->object,
+ eo_event_callback_call(EFL_CORE_ANIMATOR_EVENT_ANIMATOR_TICK, event_info));
+ DBG("Emitting animator tick on %p.", obj->object);
+
+ return EO_CALLBACK_CONTINUE;
+}
+
+static Eina_Bool
+_check_event_catcher_add(void *data,
+ Eo *eo_obj EINA_UNUSED,
+ const Eo_Event_Description2 *desc EINA_UNUSED,
+ void *event_info)
+{
+ const Eo_Callback_Array_Item *array = event_info;
+ Evas_Object_Protected_Data *obj = data;
+ int i;
+
+ for (i = 0; array[i].desc != NULL; i++)
+ {
+ if (array[i].desc == EFL_CORE_ANIMATOR_EVENT_ANIMATOR_TICK)
+ {
+ if (obj->animator_ref++ > 0) break;
+
+ eo_do(evas_object_evas_get(obj->object),
+ eo_event_callback_add(EFL_CORE_ANIMATOR_EVENT_ANIMATOR_TICK, _animator_repeater, obj));
+ INF("Registering an animator tick on canvas %p for object %p.",
+ evas_object_evas_get(obj->object), obj->object);
+
+ // No need to walk more than once per array as you can not del
+ // a partial array
+ break;
+ }
+ }
+
+ return EO_CALLBACK_CONTINUE;
+}
+
+static Eina_Bool
+_check_event_catcher_del(void *data,
+ Eo *eo_obj EINA_UNUSED,
+ const Eo_Event_Description2 *desc EINA_UNUSED,
+ void *event_info)
+{
+ const Eo_Callback_Array_Item *array = event_info;
+ Evas_Object_Protected_Data *obj = data;
+ int i;
+
+ for (i = 0; array[i].desc != NULL; i++)
+ {
+ if (array[i].desc == EFL_CORE_ANIMATOR_EVENT_ANIMATOR_TICK)
+ {
+ if ((--obj->animator_ref) > 0) break;
+
+ eo_do(evas_object_evas_get(obj->object),
+ eo_event_callback_del(EFL_CORE_ANIMATOR_EVENT_ANIMATOR_TICK, _animator_repeater, obj));
+ INF("Unregistering an animator tick on canvas %p for object %p.",
+ evas_object_evas_get(obj->object), obj->object);
+
+ break;
+ }
+ }
+
+ return EO_CALLBACK_CONTINUE;
+}
+
+EO_CALLBACKS_ARRAY_DEFINE(event_catcher_watch,
+ { EO_BASE_EVENT_CALLBACK_ADD, _check_event_catcher_add },
+ { EO_BASE_EVENT_CALLBACK_DEL, _check_event_catcher_del });
+
EOLIAN static Eo *
_evas_object_eo_base_constructor(Eo *eo_obj, Evas_Object_Protected_Data *obj)
{
@@ -110,6 +187,8 @@ _evas_object_eo_base_constructor(Eo *eo_obj, Evas_Object_Protected_Data *obj)
evas_object_inject(eo_obj, obj, evas_object_evas_get(parent));
+ eo_do(eo_obj, eo_event_callback_array_add(event_catcher_watch(), obj));
+
return eo_obj;
}
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 664c144c18..28f890b409 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1072,6 +1072,8 @@ struct _Evas_Object_Protected_Data
unsigned int ref;
+ unsigned int animator_ref;
+
unsigned char delete_me;
struct {