ecore-wl2: Implement ecore_animators for windows instead of using a

custom animator

Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
Chris Michael 2015-10-09 11:56:56 -04:00
parent def834380b
commit 055b398e8d
2 changed files with 46 additions and 15 deletions

View File

@ -115,6 +115,8 @@ struct _Ecore_Wl2_Window
struct xdg_popup *xdg_popup; struct xdg_popup *xdg_popup;
struct wl_callback *anim_cb; struct wl_callback *anim_cb;
Ecore_Animator *animator;
Eina_Rectangle geometry; Eina_Rectangle geometry;
Eina_Rectangle opaque; Eina_Rectangle opaque;
Eina_Rectangle input_rect; Eina_Rectangle input_rect;

View File

@ -231,17 +231,24 @@ _anim_cb_animate(void *data, struct wl_callback *callback, uint32_t serial EINA_
window = data; window = data;
if (!window) return; if (!window) return;
ecore_animator_custom_tick();
wl_callback_destroy(callback); wl_callback_destroy(callback);
window->anim_cb = NULL; window->anim_cb = NULL;
}
if (_animator_busy) static Eina_Bool
{ _ecore_wl2_window_cb_animate(void *data)
window->anim_cb = wl_surface_frame(window->surface); {
wl_callback_add_listener(window->anim_cb, &_anim_listener, window); Ecore_Wl2_Window *window;
wl_surface_commit(window->surface);
} window = data;
if (!window->surface) return ECORE_CALLBACK_CANCEL;
if (window->anim_cb) return ECORE_CALLBACK_RENEW;
window->anim_cb = wl_surface_frame(window->surface);
wl_callback_add_listener(window->anim_cb, &_anim_listener, window);
wl_surface_commit(window->surface);
return ECORE_CALLBACK_RENEW;
} }
void void
@ -342,6 +349,10 @@ ecore_wl2_window_show(Ecore_Wl2_Window *window)
wl_compositor_create_surface(window->display->wl.compositor); wl_compositor_create_surface(window->display->wl.compositor);
} }
if ((window->type == ECORE_WL2_WINDOW_TYPE_DND) ||
(window->type == ECORE_WL2_WINDOW_TYPE_NONE))
goto type_set;
if ((disp->wl.xdg_shell) && (!window->xdg_surface)) if ((disp->wl.xdg_shell) && (!window->xdg_surface))
{ {
window->xdg_surface = window->xdg_surface =
@ -372,8 +383,15 @@ ecore_wl2_window_show(Ecore_Wl2_Window *window)
&_wl_shell_surface_listener, window); &_wl_shell_surface_listener, window);
} }
type_set:
_ecore_wl2_window_type_set(window); _ecore_wl2_window_type_set(window);
if (!window->animator)
{
window->animator =
ecore_animator_add(_ecore_wl2_window_cb_animate, window);
}
return; return;
surf_err: surf_err:
@ -385,6 +403,12 @@ ecore_wl2_window_hide(Ecore_Wl2_Window *window)
{ {
EINA_SAFETY_ON_NULL_RETURN(window); EINA_SAFETY_ON_NULL_RETURN(window);
if (window->anim_cb) wl_callback_destroy(window->anim_cb);
window->anim_cb = NULL;
if (window->animator) ecore_animator_del(window->animator);
window->animator = NULL;
if (window->xdg_surface) xdg_surface_destroy(window->xdg_surface); if (window->xdg_surface) xdg_surface_destroy(window->xdg_surface);
window->xdg_surface = NULL; window->xdg_surface = NULL;
@ -425,8 +449,6 @@ ecore_wl2_window_free(Ecore_Wl2_Window *window)
} }
} }
if (window->anim_cb) wl_callback_destroy(window->anim_cb);
EINA_INLIST_FOREACH_SAFE(window->subsurfs, tmp, subsurf) EINA_INLIST_FOREACH_SAFE(window->subsurfs, tmp, subsurf)
_ecore_wl2_subsurf_free(subsurf); _ecore_wl2_subsurf_free(subsurf);
@ -877,7 +899,6 @@ EAPI void
ecore_wl2_window_pointer_set(Ecore_Wl2_Window *window, struct wl_surface *surface, int hot_x, int hot_y) ecore_wl2_window_pointer_set(Ecore_Wl2_Window *window, struct wl_surface *surface, int hot_x, int hot_y)
{ {
EINA_SAFETY_ON_NULL_RETURN(window); EINA_SAFETY_ON_NULL_RETURN(window);
/* EINA_SAFETY_ON_NULL_RETURN(window->input); */
if (!window->input) return; if (!window->input) return;
@ -893,7 +914,6 @@ EAPI void
ecore_wl2_window_cursor_from_name_set(Ecore_Wl2_Window *window, const char *cursor) ecore_wl2_window_cursor_from_name_set(Ecore_Wl2_Window *window, const char *cursor)
{ {
EINA_SAFETY_ON_NULL_RETURN(window); EINA_SAFETY_ON_NULL_RETURN(window);
/* EINA_SAFETY_ON_NULL_RETURN(window->input); */
eina_stringshare_replace(&window->cursor, cursor); eina_stringshare_replace(&window->cursor, cursor);
@ -913,8 +933,17 @@ ecore_wl2_window_type_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_Type type)
EAPI Ecore_Wl2_Input * EAPI Ecore_Wl2_Input *
ecore_wl2_window_input_get(Ecore_Wl2_Window *window) ecore_wl2_window_input_get(Ecore_Wl2_Window *window)
{ {
EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL); Ecore_Wl2_Input *input;
EINA_SAFETY_ON_NULL_RETURN_VAL(window->input, NULL);
return window->input; EINA_SAFETY_ON_NULL_RETURN_VAL(window, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(window->display, NULL);
if (window->input) return window->input;
EINA_INLIST_FOREACH(window->display->inputs, input)
{
if (input->focus.pointer) return input;
}
return NULL;
} }