ecore_evas: introduce a generic rendering function.
This commit is contained in:
parent
d7a27363bd
commit
385acef7f9
|
@ -142,6 +142,75 @@ _ecore_evas_idle_exiter(void *data EINA_UNUSED)
|
||||||
return ECORE_CALLBACK_RENEW;
|
return ECORE_CALLBACK_RENEW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
ecore_evas_render_wait(Ecore_Evas *ee)
|
||||||
|
{
|
||||||
|
if (ee->in_async_render) evas_sync(ee->evas);
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI Eina_Bool
|
||||||
|
ecore_evas_render(Ecore_Evas *ee)
|
||||||
|
{
|
||||||
|
Eina_List *ll;
|
||||||
|
Ecore_Evas *ee2;
|
||||||
|
Eina_Bool rend = EINA_FALSE;
|
||||||
|
|
||||||
|
if (ee->in_async_render)
|
||||||
|
{
|
||||||
|
DBG("ee=%p is rendering, skip.", ee);
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ee->engine.func->fn_prepare)
|
||||||
|
if (!ee->engine.func->fn_prepare(ee))
|
||||||
|
return EINA_FALSE;
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
|
||||||
|
{
|
||||||
|
if (ee2->engine.func->fn_render)
|
||||||
|
rend |= ee2->engine.func->fn_render(ee2);
|
||||||
|
else
|
||||||
|
rend |= ecore_evas_render(ee2);
|
||||||
|
}
|
||||||
|
// We do not force the child to be sync, so we should wait for them to be done
|
||||||
|
EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
|
||||||
|
ecore_evas_render_wait(ee2);
|
||||||
|
|
||||||
|
if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
|
||||||
|
|
||||||
|
ee->in_async_render = 1;
|
||||||
|
|
||||||
|
if (!ee->visible)
|
||||||
|
{
|
||||||
|
evas_norender(ee->evas);
|
||||||
|
}
|
||||||
|
else if (ee->can_async_render && !ee->manual_render)
|
||||||
|
{
|
||||||
|
rend |= !!evas_render_async(ee->evas);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Eina_List *updates;
|
||||||
|
|
||||||
|
updates = evas_render_updates(ee->evas);
|
||||||
|
rend |= !!updates;
|
||||||
|
evas_render_updates_free(updates);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rend;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_evas_evas_buffer_rendered(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||||
|
{
|
||||||
|
Ecore_Evas *ee = data;
|
||||||
|
|
||||||
|
_ecore_evas_idle_timeout_update(ee);
|
||||||
|
|
||||||
|
if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
|
||||||
|
ee->in_async_render = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_ecore_evas_idle_enter(void *data EINA_UNUSED)
|
_ecore_evas_idle_enter(void *data EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
@ -221,8 +290,12 @@ _ecore_evas_idle_enter(void *data EINA_UNUSED)
|
||||||
if (ee->engine.func->fn_render)
|
if (ee->engine.func->fn_render)
|
||||||
{
|
{
|
||||||
change = ee->engine.func->fn_render(ee);
|
change = ee->engine.func->fn_render(ee);
|
||||||
rend |= change;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
change = ecore_evas_render(ee);
|
||||||
|
}
|
||||||
|
rend |= change;
|
||||||
/*
|
/*
|
||||||
* Some engines that generate their own ticks based on hardware
|
* Some engines that generate their own ticks based on hardware
|
||||||
* events need to know that render has been considered, and
|
* events need to know that render has been considered, and
|
||||||
|
@ -2470,7 +2543,14 @@ ecore_evas_manual_render(Ecore_Evas *ee)
|
||||||
{
|
{
|
||||||
ECORE_EVAS_CHECK(ee);
|
ECORE_EVAS_CHECK(ee);
|
||||||
if (ee->engine.func->fn_render)
|
if (ee->engine.func->fn_render)
|
||||||
ee->engine.func->fn_render(ee);
|
{
|
||||||
|
ee->engine.func->fn_render(ee);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ecore_evas_render(ee);
|
||||||
|
ecore_evas_render_wait(ee);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
@ -3027,6 +3107,8 @@ _ecore_evas_register(Ecore_Evas *ee)
|
||||||
|
|
||||||
if (_ecore_evas_render_sync) ee->first_frame = EINA_TRUE;
|
if (_ecore_evas_render_sync) ee->first_frame = EINA_TRUE;
|
||||||
if (!_general_tick) _ecore_evas_tick_source_find();
|
if (!_general_tick) _ecore_evas_tick_source_find();
|
||||||
|
if (!ee->engine.func->fn_render)
|
||||||
|
evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST, _evas_evas_buffer_rendered, ee);
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
|
|
@ -167,6 +167,8 @@ struct _Ecore_Evas_Engine_Func
|
||||||
void (*fn_callback_device_mouse_in_set) (Ecore_Evas *ee, Ecore_Evas_Mouse_IO_Cb func);
|
void (*fn_callback_device_mouse_in_set) (Ecore_Evas *ee, Ecore_Evas_Mouse_IO_Cb func);
|
||||||
void (*fn_callback_device_mouse_out_set) (Ecore_Evas *ee, Ecore_Evas_Mouse_IO_Cb func);
|
void (*fn_callback_device_mouse_out_set) (Ecore_Evas *ee, Ecore_Evas_Mouse_IO_Cb func);
|
||||||
void (*fn_pointer_device_xy_get)(const Ecore_Evas *ee, const Efl_Input_Device *pointer, Evas_Coord *x, Evas_Coord *y);
|
void (*fn_pointer_device_xy_get)(const Ecore_Evas *ee, const Efl_Input_Device *pointer, Evas_Coord *x, Evas_Coord *y);
|
||||||
|
|
||||||
|
Eina_Bool (*fn_prepare)(Ecore_Evas *ee);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Ecore_Evas_Interface
|
struct _Ecore_Evas_Interface
|
||||||
|
@ -474,6 +476,10 @@ EAPI void _ecore_evas_default_cursor_hide(Ecore_Evas *ee);
|
||||||
|
|
||||||
Eina_Bool _ecore_evas_cursors_init(Ecore_Evas *ee);
|
Eina_Bool _ecore_evas_cursors_init(Ecore_Evas *ee);
|
||||||
|
|
||||||
|
EAPI void ecore_evas_render_wait(Ecore_Evas *ee);
|
||||||
|
EAPI Eina_Bool ecore_evas_render(Ecore_Evas *ee);
|
||||||
|
|
||||||
|
|
||||||
#undef EAPI
|
#undef EAPI
|
||||||
#define EAPI
|
#define EAPI
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue