devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=bd83d4c03ab9f6f6ae225976b9595a1dfde61237
commit bd83d4c03ab9f6f6ae225976b9595a1dfde61237 Author: Chris Michael <cp.mich...@samsung.com> Date: Wed Oct 14 14:54:54 2015 -0400 ecore-wayland: Redo window animators to not use Custom source animators Summary: This moves window animators (for frame callbacks) to not use a custom animator source but rather use a timer-based source. This also moves animators to be per-window based (in that an animator is created per-window). @fix Signed-off-by: Chris Michael <cp.mich...@samsung.com> --- src/lib/ecore_wayland/ecore_wl_private.h | 2 ++ src/lib/ecore_wayland/ecore_wl_window.c | 52 ++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/lib/ecore_wayland/ecore_wl_private.h b/src/lib/ecore_wayland/ecore_wl_private.h index 3493472..872409f 100644 --- a/src/lib/ecore_wayland/ecore_wl_private.h +++ b/src/lib/ecore_wayland/ecore_wl_private.h @@ -157,6 +157,7 @@ struct _Ecore_Wl_Window Eina_Bool alpha : 1; Eina_Bool transparent : 1; Eina_Bool has_buffer : 1; + Eina_Bool visible : 1; Ecore_Wl_Window_Type type; Ecore_Wl_Window_Buffer_Type buffer_type; @@ -164,6 +165,7 @@ struct _Ecore_Wl_Window Ecore_Wl_Input *pointer_device; Ecore_Wl_Input *keyboard_device; + Ecore_Animator *animator; Eina_Bool anim_pending : 1; struct wl_callback *anim_callback; diff --git a/src/lib/ecore_wayland/ecore_wl_window.c b/src/lib/ecore_wayland/ecore_wl_window.c index 8250e78..9f60e88 100644 --- a/src/lib/ecore_wayland/ecore_wl_window.c +++ b/src/lib/ecore_wayland/ecore_wl_window.c @@ -16,6 +16,7 @@ static void _ecore_xdg_handle_surface_configure(void *data, struct xdg_surface * static void _ecore_xdg_handle_surface_delete(void *data, struct xdg_surface *xdg_surface); static void _ecore_xdg_handle_popup_done(void *data, struct xdg_popup *xdg_popup); static void _ecore_session_recovery_uuid(void *data, struct session_recovery *session_recovery, const char *uuid); +static void _anim_cb_animate(void *data, struct wl_callback *callback, uint32_t serial EINA_UNUSED); /* local variables */ static Eina_Hash *_windows = NULL; @@ -44,6 +45,44 @@ static const struct session_recovery_listener _ecore_session_recovery_listener = _ecore_session_recovery_uuid, }; +static const struct wl_callback_listener _anim_listener = +{ + _anim_cb_animate +}; + +static void +_anim_cb_animate(void *data, struct wl_callback *callback, uint32_t serial EINA_UNUSED) +{ + Ecore_Wl_Window *win; + + win = data; + if (!win) return; + + if ((win->anim_callback) && (callback != win->anim_callback)) return; + + wl_callback_destroy(callback); + win->anim_callback = NULL; +} + +static Eina_Bool +_ecore_wl_window_cb_animate(void *data) +{ + Ecore_Wl_Window *win; + + win = data; + if (!win->visible) return ECORE_CALLBACK_CANCEL; + + if (!win->anim_callback) + { + win->anim_callback = wl_surface_frame(win->surface); + wl_callback_add_listener(win->anim_callback, &_anim_listener, win); + } + + wl_surface_commit(win->surface); + + return ECORE_CALLBACK_RENEW; +} + /* internal functions */ void _ecore_wl_window_init(void) @@ -405,6 +444,11 @@ ecore_wl_window_show(Ecore_Wl_Window *win) default: break; } + + win->visible = EINA_TRUE; + + if (!win->animator) + win->animator = ecore_animator_add(_ecore_wl_window_cb_animate, win); } EAPI void @@ -414,6 +458,14 @@ ecore_wl_window_hide(Ecore_Wl_Window *win) if (!win) return; + win->visible = EINA_FALSE; + + if (win->anim_callback) wl_callback_destroy(win->anim_callback); + win->anim_callback = NULL; + + if (win->animator) ecore_animator_del(win->animator); + win->animator = NULL; + if (win->xdg_surface) xdg_surface_destroy(win->xdg_surface); win->xdg_surface = NULL; --