diff --git a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h index b0e5e38fc1..8ca2694010 100644 --- a/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h +++ b/legacy/ecore/src/lib/ecore_evas/Ecore_Evas.h @@ -53,7 +53,7 @@ extern "C" { #define HAVE_ECORE_EVAS_GL 1 #define HAVE_ECORE_EVAS_DIRECTFB 1 -typedef enum +typedef enum _Ecore_Evas_Engine_Type { ECORE_EVAS_ENGINE_SOFTWARE_X11, ECORE_EVAS_ENGINE_SOFTWARE_FB, @@ -70,12 +70,12 @@ typedef unsigned int Ecore_X_Window; #ifndef _ECORE_DIRECTFB_H #define _ECORE_DIRECTFB_WINDOW_PREDEF -typedef void Ecore_DirectFB_Window; +typedef struct _Ecore_DirectFB_Window Ecore_DirectFB_Window; #endif #ifndef _ECORE_EVAS_PRIVATE_H /* basic data types */ -typedef void Ecore_Evas; +typedef struct _Ecore_Evas Ecore_Evas; #endif /* module setup/shutdown calls */ diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c index f8e6397ee6..05c028c80c 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c @@ -1812,6 +1812,29 @@ _ecore_evas_free(Ecore_Evas *ee) ee->prop.cursor.file = NULL; ee->prop.cursor.object = NULL; ee->evas = NULL; + if (ee->engine.idle_flush_timer) + ecore_timer_del(ee->engine.idle_flush_timer); if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee); free(ee); } + +static int +_ecore_evas_cb_idle_flush(void *data) +{ + Ecore_Evas *ee; + + ee = (Ecore_Evas *)data; + evas_render_idle_flush(ee); + ee->engine.idle_flush_timer = NULL; + return 0; +} + +void +_ecore_evas_idle_timeout_update(Ecore_Evas *ee) +{ + if (ee->engine.idle_flush_timer) + ecore_timer_del(ee->engine.idle_flush_timer); + ee->engine.idle_flush_timer = ecore_timer_add(IDLE_FLUSH_TIME, + _ecore_evas_cb_idle_flush, + ee); +} diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c index 2f5f02315b..eb9f1645d2 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_buffer.c @@ -114,6 +114,7 @@ _ecore_evas_buffer_render(Ecore_Evas *ee) if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); _ecore_evas_buffer_render(ee2); if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); + _ecore_evas_idle_timeout_update(ee2); } if (ee->engine.buffer.image) { diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c index 84ee426394..6c66dc8324 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_directfb.c @@ -21,8 +21,20 @@ static Ecore_Idle_Enterer *ecore_evas_directfb_idle_enterer = NULL; static void _ecore_evas_directfb_render(Ecore_Evas *ee) { - Evas_List *updates; + Evas_List *updates, *ll; +#ifdef BUILD_ECORE_EVAS_BUFFER + for (ll = ee->sub_ecore_evas; ll; ll = ll->next) + { + Ecore_Evas *ee2; + + ee2 = ll->data; + if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); + _ecore_evas_buffer_render(ee2); + if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); + _ecore_evas_idle_timeout_update(ee2); + } +#endif if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee); updates = evas_render_updates(ee->evas); if (updates) @@ -45,6 +57,8 @@ _ecore_evas_directfb_render(Ecore_Evas *ee) } evas_render_updates_free(updates); } + if (ee->func.fn_post_render) ee->func.fn_post_render(ee); + _ecore_evas_idle_timeout_update(ee); } static int diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c index ac4c0b84da..20ee450f7c 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c @@ -229,6 +229,7 @@ _ecore_evas_idle_enter(void *data __UNUSED__) } else evas_norender(ee->evas); + _ecore_evas_idle_timeout_update(ee); } if (_ecore_evas_fps_debug) { diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h index 2ea2e724d0..a784e4f907 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h @@ -59,6 +59,8 @@ #include #endif +#define IDLE_FLUSH_TIME 0.5 + typedef struct _Ecore_Evas Ecore_Evas; typedef struct _Ecore_Evas_Engine Ecore_Evas_Engine; typedef struct _Ecore_Evas_Engine_Func Ecore_Evas_Engine_Func; @@ -163,6 +165,7 @@ struct _Ecore_Evas_Engine Ecore_DirectFB_Window *window; } directfb; #endif + Ecore_Timer *idle_flush_timer; }; struct _Ecore_Evas @@ -261,5 +264,6 @@ void _ecore_evas_fps_debug_init(void); void _ecore_evas_fps_debug_shutdown(void); void _ecore_evas_fps_debug_rendertime_add(double t); void _ecore_evas_free(Ecore_Evas *ee); - +void _ecore_evas_idle_timeout_update(Ecore_Evas *ee); + #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c index 2175dd6e3f..df6a45455c 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -148,6 +148,7 @@ _ecore_evas_x_render(Ecore_Evas *ee) if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); _ecore_evas_buffer_render(ee2); if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); + _ecore_evas_idle_timeout_update(ee2); } #endif if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee); @@ -328,6 +329,7 @@ _ecore_evas_x_render(Ecore_Evas *ee) else evas_norender(ee->evas); if (ee->func.fn_post_render) ee->func.fn_post_render(ee); + _ecore_evas_idle_timeout_update(ee); } static void