static void
_e_comp_wl_surface_state_finish(E_Comp_Wl_Surface_State *state)
{
- struct wl_resource *cb;
-
- EINA_LIST_FREE(state->frames, cb)
- wl_resource_destroy(cb);
-
if (state->buffer) wl_list_remove(&state->buffer_destroy_listener.link);
state->buffer = NULL;
state->sy = 0;
state->new_attach = EINA_FALSE;
- e_surface_frame_done_send(surface);
-
- /* insert state frame callbacks into comp_data->frames
- * NB: This clears state->frames list */
- cdata->frames = eina_list_merge(cdata->frames,
- state->frames);
- state->frames = NULL;
-
if (e_client_view_get(ec))
_e_comp_wl_surface_damage_update(ec);
{
struct wl_resource *resource = data;
E_Frame_Callback *frame_callback;
- E_Surface *surface;
- E_Subsurface *subsurface;
frame_callback = wl_container_of(listener, frame_callback, destroy);
- surface = frame_callback->surface;
-
- if (surface->base.frames)
- surface->base.frames = eina_list_remove(surface->base.frames, resource);
-
- if (surface->base.pending.frames)
- surface->base.pending.frames = eina_list_remove(surface->base.pending.frames, resource);
-
- subsurface = _e_subsurface_try_from_surface(surface);
- if (subsurface && subsurface->base.cached.frames)
- subsurface->base.cached.frames = eina_list_remove(subsurface->base.cached.frames, resource);
+ frame_callback->surface->base.frames = eina_list_remove(frame_callback->surface->base.frames, resource);
wl_list_remove(&frame_callback->destroy.link);
free(frame_callback);
}
static Eina_Bool
-_e_surface_pending_frame_callback_add(E_Surface *surface, struct wl_resource *resource)
+_e_surface_frame_callback_add(E_Surface *surface, struct wl_resource *resource)
{
E_Frame_Callback *frame_callback;
frame_callback->destroy.notify = _frame_callback_cb_destroy;
wl_resource_add_destroy_listener(resource, &frame_callback->destroy);
- surface->base.pending.frames = eina_list_prepend(surface->base.pending.frames, resource);
+ surface->base.frames = eina_list_prepend(surface->base.frames, resource);
return EINA_TRUE;
}
static void
-_e_surface_pending_frame_callback_update(E_Surface *surface)
+_e_surface_frame_callback_list_update(E_Surface *surface)
{
struct ds_surface *ds_surface = surface->ds_surface;
struct wl_resource *resource, *tmp;
+ // FIXME
+ // flush frame callback events to fix the problem that some application
+ // historically had without this.
+ e_surface_frame_done_send(surface);
+
wl_resource_for_each_safe(resource, tmp, &ds_surface->current.frame_callback_list)
{
- if (_e_surface_pending_frame_callback_add(surface, resource))
+ if (_e_surface_frame_callback_add(surface, resource))
{
wl_list_remove(wl_resource_get_link(resource));
wl_list_init(wl_resource_get_link(resource));
_e_surface_pending_buffer_scale_update(surface);
if (ds_surface->current.committed & DS_SURFACE_STATE_FRAME_CALLBACK_LIST)
- _e_surface_pending_frame_callback_update(surface);
+ _e_surface_frame_callback_list_update(surface);
if (ds_surface->current.committed & DS_SURFACE_STATE_VIEWPORT)
_e_surface_pending_viewport_update(surface);