ecore_evas/wayland_shm: Delay some operations when in_async_render.

This commit is contained in:
Rafael Antognolli 2013-05-06 14:48:03 -03:00
parent 868206826a
commit aba3064184
3 changed files with 88 additions and 6 deletions

View File

@ -38,6 +38,9 @@ static void _ecore_evas_wayland_resize(Ecore_Evas *ee, int location);
/* local function prototypes */
static int _ecore_evas_wl_common_render_updates_process(Ecore_Evas *ee, Eina_List *updates);
void _ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *event);
static void _rotation_do(Ecore_Evas *ee, int rotation, int resize);
static void _ecore_evas_wayland_alpha_do(Ecore_Evas *ee, int alpha);
static void _ecore_evas_wayland_transparent_do(Ecore_Evas *ee, int transparent);
/* Frame listener */
static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm);
@ -267,8 +270,8 @@ _ecore_evas_wl_common_cb_window_configure(void *data EINA_UNUSED, int type EINA_
return ECORE_CALLBACK_PASS_ON;
}
void
_ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize)
static void
_rotation_do(Ecore_Evas *ee, int rotation, int resize)
{
Ecore_Evas_Engine_Wl_Data *wdata;
int rot_dif;
@ -371,6 +374,19 @@ _ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize)
}
}
void
_ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize)
{
if (ee->in_async_render)
{
ee->delayed.rotation = rotation;
ee->delayed.rotation_resize = resize;
ee->delayed.rotation_changed = EINA_TRUE;
return;
}
_rotation_do(ee, rotation, resize);
}
int
_ecore_evas_wl_common_init(void)
{
@ -1046,6 +1062,22 @@ _ecore_evas_wl_common_render_updates(void *data, Evas *evas EINA_UNUSED, void *e
ee->in_async_render = EINA_FALSE;
_ecore_evas_wl_common_render_updates_process(ee, ev->updated_area);
if (ee->delayed.alpha_changed)
{
_ecore_evas_wayland_alpha_do(ee, ee->delayed.alpha);
ee->delayed.alpha_changed = EINA_FALSE;
}
if (ee->delayed.transparent_changed)
{
_ecore_evas_wayland_transparent_do(ee, ee->delayed.transparent);
ee->delayed.transparent_changed = EINA_FALSE;
}
if (ee->delayed.rotation_changed)
{
_rotation_do(ee, ee->delayed.rotation, ee->delayed.rotation_resize);
ee->delayed.rotation_changed = EINA_FALSE;
}
}
void
@ -1183,6 +1215,30 @@ _ecore_evas_wayland_resize(Ecore_Evas *ee, int location)
}
}
static void
_ecore_evas_wayland_alpha_do(Ecore_Evas *ee, int alpha)
{
if (!ee) return;
if (!strcmp(ee->driver, "wayland_shm"))
{
#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
_ecore_evas_wayland_shm_alpha_do(ee, alpha);
#endif
}
}
static void
_ecore_evas_wayland_transparent_do(Ecore_Evas *ee, int transparent)
{
if (!ee) return;
if (!strcmp(ee->driver, "wayland_shm"))
{
#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
_ecore_evas_wayland_shm_transparent_do(ee, transparent);
#endif
}
}
static void
_ecore_evas_wayland_move(Ecore_Evas *ee, int x, int y)
{

View File

@ -74,6 +74,8 @@ void _ecore_evas_wl_common_frame_border_size_set(Evas_Object *obj, int fx, int f
#ifdef BUILD_ECORE_EVAS_WAYLAND_SHM
void _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location);
void _ecore_evas_wayland_shm_transparent_do(Ecore_Evas *ee, int transparent);
void _ecore_evas_wayland_shm_alpha_do(Ecore_Evas *ee, int transparent);
#endif
#ifdef BUILD_ECORE_EVAS_WAYLAND_EGL

View File

@ -445,8 +445,8 @@ _ecore_evas_wl_hide(Ecore_Evas *ee)
if (ee->func.fn_hide) ee->func.fn_hide(ee);
}
static void
_ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
void
_ecore_evas_wayland_shm_alpha_do(Ecore_Evas *ee, int alpha)
{
Evas_Engine_Info_Wayland_Shm *einfo;
Ecore_Evas_Engine_Wl_Data *wdata;
@ -483,8 +483,20 @@ _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
ecore_wl_window_update_size(win, ee->w + fw, ee->h + fh);
}
static void
_ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
static void
_ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
{
if (ee->in_async_render)
{
ee->delayed.alpha = alpha;
ee->delayed.alpha_changed = EINA_TRUE;
return;
}
_ecore_evas_wayland_shm_alpha_do(ee, alpha);
}
void
_ecore_evas_wayland_shm_transparent_do(Ecore_Evas *ee, int transparent)
{
Evas_Engine_Info_Wayland_Shm *einfo;
Ecore_Evas_Engine_Wl_Data *wdata;
@ -514,6 +526,18 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
ecore_wl_window_update_size(wdata->win, ee->w + fw, ee->h + fh);
}
static void
_ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
{
if (ee->in_async_render)
{
ee->delayed.transparent = transparent;
ee->delayed.transparent_changed = EINA_TRUE;
return;
}
_ecore_evas_wayland_shm_transparent_do(ee, transparent);
}
void
_ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
{