add idle flush support - 0.5 secs of no rendering gets the engine to flush

all floating data.


SVN revision: 30358
This commit is contained in:
Carsten Haitzler 2007-06-17 03:41:43 +00:00
parent 0a4199c841
commit aa68331c2a
7 changed files with 50 additions and 5 deletions

View File

@ -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 */

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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

View File

@ -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)
{

View File

@ -59,6 +59,8 @@
#include <Evas_Engine_Buffer.h>
#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

View File

@ -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