From 7ffa801cf349715b040bd9ffb9f6d7acc0b9585e Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 27 Jan 2016 16:00:42 -0800 Subject: [PATCH] ecore_evas: switch main animator to use the first windows source for tick. --- src/lib/ecore_evas/ecore_evas.c | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index d61f75f9ab..0ac2274e1d 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -3069,6 +3069,8 @@ _ecore_evas_fps_debug_rendertime_add(double t) } } +static Ecore_Evas *_general_tick = NULL; + EAPI void ecore_evas_animator_tick(Ecore_Evas *ee, Eina_Rectangle *viewport) { @@ -3095,6 +3097,39 @@ ecore_evas_animator_tick(Ecore_Evas *ee, Eina_Rectangle *viewport) evas_output_size_get(subee->evas, &a.update_area.w, &a.update_area.h); eo_do(subee->evas, eo_event_callback_call(EFL_CORE_ANIMATOR_EVENT_ANIMATOR_TICK, &a)); } + + // We are the source of sync for general animator. + if (_general_tick == ee) + { + // Check first we didn't tick during this loop + if (!ecore_main_loop_animator_ticked_get()) + ecore_animator_custom_tick(); + } +} + +static void +_ecore_evas_tick_source_find(void) +{ + Ecore_Evas *ee; + + _general_tick = NULL; + EINA_INLIST_FOREACH(ecore_evases, ee) + if (ee->anim_count && + ee->engine.func->fn_animator_register && + ee->engine.func->fn_animator_unregister) + { + _general_tick = ee; + break; + } + + if (!_general_tick) + { + ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER); + } + else + { + ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_CUSTOM); + } } static Eina_Bool @@ -3125,6 +3160,7 @@ _check_animator_event_catcher_add(void *data, { // Backend support per window vsync ee->engine.func->fn_animator_register(ee); + if (!_general_tick) _general_tick = ee; } else { @@ -3162,6 +3198,7 @@ _check_animator_event_catcher_del(void *data, { // Backend support per window vsync ee->engine.func->fn_animator_unregister(ee); + if (_general_tick == ee) _ecore_evas_tick_source_find(); } else { @@ -3226,6 +3263,7 @@ _ecore_evas_free(Ecore_Evas *ee) { // Backend support per window vsync ee->engine.func->fn_animator_unregister(ee); + if (_general_tick == ee) _ecore_evas_tick_source_find(); } if (ee->anim) ecore_animator_del(ee->anim);