From 615d5ab634df5e8e74ff9de51073e3cfdae54e4b Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Mon, 2 Dec 2013 17:39:24 -0200 Subject: [PATCH] ecore_evas/wayland: Add a function to cleanup the frame callback. This callback must be manually destroyed and removed on ecore_evas_hide(), because it won't be delivered anymore after the surface is destroyed. If the callback still exists, the engine will find it and avoid doing a new redraw until it is finally called. Maybe the correct thing to do is to keep this callback in the Ecore_Wl_Window struct, and have some functions to set/unset it, so it gets destroyed when the window is hidden. Or when the surface is destroyed. --- .../wayland/ecore_evas_wayland_common.c | 23 +++++++++++++++---- .../engines/wayland/ecore_evas_wayland_egl.c | 1 + .../wayland/ecore_evas_wayland_private.h | 2 ++ .../engines/wayland/ecore_evas_wayland_shm.c | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c index 189f382c91..2fcad77197 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c @@ -1200,21 +1200,34 @@ _ecore_evas_wl_common_post_render(Ecore_Evas *ee) if (ee->func.fn_post_render) ee->func.fn_post_render(ee); } +void +_ecore_evas_wl_common_frame_callback_clean(Ecore_Evas *ee) +{ + Ecore_Evas_Engine_Wl_Data *wdata; + + wdata = ee->engine.data; + + if (!wdata->frame_pending) + return; + wl_callback_destroy(wdata->frame_callback); + wdata->frame_callback = NULL; + wdata->frame_pending = EINA_FALSE; +} + static void -_ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm EINA_UNUSED) +_ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback EINA_UNUSED, uint32_t tm EINA_UNUSED) { Ecore_Evas *ee = data; Ecore_Wl_Window *win = NULL; Ecore_Evas_Engine_Wl_Data *wdata; if (!ee) return; + + _ecore_evas_wl_common_frame_callback_clean(ee); + wdata = ee->engine.data; if (!(win = wdata->win)) return; - wdata->frame_callback = NULL; - wdata->frame_pending = EINA_FALSE; - wl_callback_destroy(callback); - if (ecore_wl_window_surface_get(win)) { wdata->frame_callback = diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c index 335111c949..a9a17763a3 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c @@ -344,6 +344,7 @@ _ecore_evas_wl_hide(Ecore_Evas *ee) ee->visible = 0; ee->should_be_visible = 0; + _ecore_evas_wl_common_frame_callback_clean(ee); if (ee->func.fn_hide) ee->func.fn_hide(ee); } diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h index edf7be27cc..a48bdb27c8 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h @@ -78,6 +78,8 @@ void _ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize void _ecore_evas_wl_common_borderless_set(Ecore_Evas *ee, int borderless); void _ecore_evas_wl_common_withdrawn_set(Ecore_Evas *ee, int val); +void _ecore_evas_wl_common_frame_callback_clean(Ecore_Evas *ee); + Evas_Object * _ecore_evas_wl_common_frame_add(Evas *evas); void _ecore_evas_wl_common_frame_border_size_set(Evas_Object *obj, int fx, int fy, int fw, int fh); diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c index c4b7fbcefd..e091830040 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c @@ -343,6 +343,7 @@ _ecore_evas_wl_hide(Ecore_Evas *ee) ee->visible = 0; ee->should_be_visible = 0; + _ecore_evas_wl_common_frame_callback_clean(ee); if (ee->func.fn_hide) ee->func.fn_hide(ee); }