E_Client_Hook *client_del_hook;
struct wl_listener destroy;
+ struct wl_listener precommit_to_cache;
+ struct wl_listener precommit_from_cache;
+ struct wl_listener precommit_from_pending;
struct wl_listener commit;
struct wl_listener new_subsurface;
{
struct wl_signal destroy;
struct wl_signal parent_destroy;
+ struct wl_signal precommit_to_cache;
+ struct wl_signal precommit_from_cache;
+ struct wl_signal precommit_from_pending;
struct wl_signal commit;
} events;
};
struct wl_listener destroy;
struct wl_listener surface_destroy;
struct wl_listener parent_surface_destroy;
- struct wl_listener cached;
- struct wl_listener sync_precommit;
- struct wl_listener desync_precommit;
struct wl_listener request_move;
struct
{
struct wl_signal destroy;
- struct wl_signal cached;
- struct wl_signal sync_precommit;
- struct wl_signal desync_precommit;
} events;
Eina_Bool internal;
static void _e_surface_ds_surface_set(E_Surface *surface, struct ds_surface *ds_surface);
static void _e_surface_cb_client_del(void *data, E_Client *ec);
static void _e_surface_cb_destroy(struct wl_listener *listener, void *data);
+static void _e_surface_cb_precommit_to_cache(struct wl_listener *listener, void *data);
+static void _e_surface_cb_precommit_from_cache(struct wl_listener *listener, void *data);
+static void _e_surface_cb_precommit_from_pending(struct wl_listener *listener, void *data);
static void _e_surface_cb_commit(struct wl_listener *listener, void *data);
static void _e_surface_cb_new_subsurface(struct wl_listener *listener, void *data);
static void _e_subsurface_destroy(E_Subsurface *sub);
static void _e_subsurface_commit(E_Subsurface *sub);
static void _e_subsurface_place_below_parent(E_Subsurface *sub);
+static Eina_Bool _e_subsurface_synchronized_check(E_Subsurface *sub);
static void _e_subsurface_cb_destroy(struct wl_listener *listener, void *data);
-static void _e_subsurface_cb_cached(struct wl_listener *listener, void *data);
-static void _e_subsurface_cb_sync_precommit(struct wl_listener *listener, void *data);
-static void _e_subsurface_cb_desync_precommit(struct wl_listener *listener, void *data);
static void _e_subsurface_cb_request_move(struct wl_listener *listener, void *data);
static void _e_subsurface_cb_surface_destroy(struct wl_listener *listener, void *data);
static void _e_subsurface_cb_parent_surface_destroy(struct wl_listener *listener, void *data);
}
EINTERN void
+e_surface_precommit_to_cache_listener_add(E_Surface *surface, struct wl_listener *listener)
+{
+ wl_signal_add(&surface->events.precommit_to_cache, listener);
+}
+
+EINTERN void
+e_surface_precommit_from_cache_listener_add(E_Surface *surface, struct wl_listener *listener)
+{
+ wl_signal_add(&surface->events.precommit_from_cache, listener);
+}
+EINTERN void
+e_surface_precommit_from_pending_listener_add(E_Surface *surface, struct wl_listener *listener)
+{
+ wl_signal_add(&surface->events.precommit_from_pending, listener);
+}
+
+EINTERN void
e_surface_commit_listener_add(E_Surface *surface, struct wl_listener *listener)
{
wl_signal_add(&surface->events.commit, listener);
wl_signal_init(&surface->events.destroy);
wl_signal_init(&surface->events.parent_destroy);
+ wl_signal_init(&surface->events.precommit_to_cache);
+ wl_signal_init(&surface->events.precommit_from_cache);
+ wl_signal_init(&surface->events.precommit_from_pending);
wl_signal_init(&surface->events.commit);
wl_signal_init(&surface->base.destroy_signal);
wl_signal_init(&surface->base.apply_viewport_signal);
surface->destroy.notify = _e_surface_cb_destroy;
ds_surface_add_destroy_listener(ds_surface, &surface->destroy);
+ surface->precommit_to_cache.notify = _e_surface_cb_precommit_to_cache;
+ ds_surface_add_precommit_to_cache_listener(ds_surface, &surface->precommit_to_cache);
+
+ surface->precommit_from_cache.notify = _e_surface_cb_precommit_from_cache;
+ ds_surface_add_precommit_from_cache_listener(ds_surface, &surface->precommit_from_cache);
+
+ surface->precommit_from_pending.notify = _e_surface_cb_precommit_from_pending;
+ ds_surface_add_precommit_from_pending_listener(ds_surface, &surface->precommit_from_pending);
+
surface->commit.notify = _e_surface_cb_commit;
ds_surface_add_commit_listener(ds_surface, &surface->commit);
wl_signal_emit(&surface->events.destroy, surface);
wl_list_remove(&surface->destroy.link);
+ wl_list_remove(&surface->precommit_to_cache.link);
+ wl_list_remove(&surface->precommit_from_cache.link);
+ wl_list_remove(&surface->precommit_from_pending.link);
wl_list_remove(&surface->commit.link);
wl_list_remove(&surface->new_subsurface.link);
surface->ds_surface = NULL;
}
static void
+_e_surface_cb_precommit_to_cache(struct wl_listener *listener, void *data)
+{
+ E_Surface *surface;
+ E_Subsurface *subsurface;
+
+ surface = wl_container_of(listener, surface, precommit_to_cache);
+ subsurface = _e_subsurface_from_surface(surface);
+
+ wl_signal_emit(&surface->events.precommit_to_cache, surface);
+
+ e_presentation_time_container_feedback_discard(&subsurface->base.cached.presentation_container);
+ e_presentation_time_container_feedback_merge(&subsurface->base.cached.presentation_container,
+ &surface->base.pending.presentation_container);
+
+ subsurface->base.cached.has_data = EINA_TRUE;
+
+ e_comp_wl_hook_call(E_COMP_WL_HOOK_SUBSURFACE_COMMIT_TO_CACHE, surface->ec);
+}
+
+static void
+_e_surface_cb_precommit_from_cache(struct wl_listener *listener, void *data)
+{
+ E_Surface *surface;
+ E_Subsurface *subsurface;
+
+ surface = wl_container_of(listener, surface, precommit_from_cache);
+ subsurface = _e_subsurface_from_surface(surface);
+
+ wl_signal_emit(&surface->events.precommit_from_cache, surface);
+
+ if (subsurface->base.cached.has_data)
+ {
+ e_presentation_time_container_feedback_discard(&surface->base.presentation_container);
+ e_presentation_time_container_feedback_merge(&surface->base.presentation_container,
+ &subsurface->base.cached.presentation_container);
+ subsurface->base.cached.has_data = EINA_FALSE;
+ }
+
+ // The _e_subsurface_synchronized_check() should be called, because this
+ // callback could be called due to the wl_subsurface.set_desync()
+ if (_e_subsurface_synchronized_check(subsurface))
+ {
+ e_comp_wl_hook_call(E_COMP_WL_HOOK_SUBSURFACE_SYNCHRONIZED_COMMIT,
+ surface->ec);
+ }
+}
+
+static void
+_e_surface_cb_precommit_from_pending(struct wl_listener *listener, void *data)
+{
+ E_Surface *surface;
+
+ surface = wl_container_of(listener, surface, precommit_from_pending);
+
+ wl_signal_emit(&surface->events.precommit_from_pending, surface);
+
+ e_presentation_time_container_feedback_discard(&surface->base.presentation_container);
+ e_presentation_time_container_feedback_merge(&surface->base.presentation_container,
+ &surface->base.pending.presentation_container);
+}
+
+static void
_e_surface_cb_commit(struct wl_listener *listener, void *data)
{
E_Surface *surface;
}
wl_signal_init(&sub->events.destroy);
- wl_signal_init(&sub->events.cached);
- wl_signal_init(&sub->events.sync_precommit);
- wl_signal_init(&sub->events.desync_precommit);
sub->ds_subsurface = ds_subsurface;
sub->destroy.notify = _e_subsurface_cb_destroy;
wl_signal_add(&ds_subsurface->events.destroy, &sub->destroy);
- sub->cached.notify = _e_subsurface_cb_cached;
- wl_signal_add(&ds_subsurface->events.cached, &sub->cached);
-
- sub->sync_precommit.notify = _e_subsurface_cb_sync_precommit;
- ds_surface_add_sync_precommit_listener(ds_subsurface->surface, &sub->sync_precommit);
-
- sub->desync_precommit.notify = _e_subsurface_cb_desync_precommit;
- ds_surface_add_desync_precommit_listener(ds_subsurface->surface, &sub->desync_precommit);
-
sub->request_move.notify = _e_subsurface_cb_request_move;
wl_signal_add(&ds_subsurface->events.request_move, &sub->request_move);
_e_subsurface_view_finish(&sub->view);
e_comp_wl_client_subsurface_finish(sub->surface->ec);
- wl_list_remove(&sub->desync_precommit.link);
- wl_list_remove(&sub->sync_precommit.link);
wl_list_remove(&sub->request_move.link);
wl_list_remove(&sub->parent_surface_destroy.link);
- wl_list_remove(&sub->cached.link);
wl_list_remove(&sub->surface_destroy.link);
wl_list_remove(&sub->destroy.link);
free(sub);
}
static void
-_e_subsurface_cb_cached(struct wl_listener *listener, void *data)
-{
- E_Subsurface *sub;
-
- sub = wl_container_of(listener, sub, cached);
-
- wl_signal_emit(&sub->events.cached, sub);
-
- e_presentation_time_container_feedback_discard(&sub->base.cached.presentation_container);
- e_presentation_time_container_feedback_merge(&sub->base.cached.presentation_container,
- &sub->surface->base.pending.presentation_container);
-
- sub->base.cached.has_data = EINA_TRUE;
-
- e_comp_wl_hook_call(E_COMP_WL_HOOK_SUBSURFACE_COMMIT_TO_CACHE, sub->surface->ec);
-}
-
-static void
-_e_subsurface_cb_sync_precommit(struct wl_listener *listener, void *data)
-{
- E_Subsurface *sub;
-
- sub = wl_container_of(listener, sub, sync_precommit);
-
- wl_signal_emit(&sub->events.sync_precommit, sub);
-
- if (sub->base.cached.has_data)
- {
- e_presentation_time_container_feedback_discard(&sub->surface->base.presentation_container);
- e_presentation_time_container_feedback_merge(&sub->surface->base.presentation_container,
- &sub->base.cached.presentation_container);
- sub->base.cached.has_data = EINA_FALSE;
- }
-
- // The _e_subsurface_synchronized_check() should be called, because this
- // callback could be called due to the wl_subsurface.set_desync()
- if (_e_subsurface_synchronized_check(sub))
- {
- e_comp_wl_hook_call(E_COMP_WL_HOOK_SUBSURFACE_SYNCHRONIZED_COMMIT,
- sub->surface->ec);
- }
-}
-
-static void
-_e_subsurface_cb_desync_precommit(struct wl_listener *listener, void *data)
-{
- E_Subsurface *sub;
-
- sub = wl_container_of(listener, sub, desync_precommit);
-
- wl_signal_emit(&sub->events.desync_precommit, sub);
-
- if (sub->base.cached.has_data)
- {
- e_presentation_time_container_feedback_discard(&sub->base.cached.presentation_container);
- e_presentation_time_container_feedback_merge(&sub->base.cached.presentation_container,
- &sub->surface->base.pending.presentation_container);
-
- e_presentation_time_container_feedback_discard(&sub->surface->base.presentation_container);
- e_presentation_time_container_feedback_merge(&sub->surface->base.presentation_container,
- &sub->base.cached.presentation_container);
- sub->base.cached.has_data = EINA_FALSE;
- }
- else
- {
- e_presentation_time_container_feedback_discard(&sub->surface->base.presentation_container);
- e_presentation_time_container_feedback_merge(&sub->surface->base.presentation_container,
- &sub->surface->base.pending.presentation_container);
- }
-}
-
-static void
_e_subsurface_cb_request_move(struct wl_listener *listener, void *data)
{
E_Subsurface *sub;
}
EINTERN void
-e_subsurface_cached_listener_add(E_Subsurface *subsurface, struct wl_listener *listener)
-{
- EINA_SAFETY_ON_NULL_RETURN(subsurface);
- assert(!subsurface->internal);
- wl_signal_add(&subsurface->events.cached, listener);
-}
-
-EINTERN void
-e_subsurface_sync_precommit_listener_add(E_Subsurface *subsurface, struct wl_listener *listener)
-{
- EINA_SAFETY_ON_NULL_RETURN(subsurface);
- assert(!subsurface->internal);
- wl_signal_add(&subsurface->events.sync_precommit, listener);
-}
-
-EINTERN void
-e_subsurface_desync_precommit_listener_add(E_Subsurface *subsurface, struct wl_listener *listener)
-{
- EINA_SAFETY_ON_NULL_RETURN(subsurface);
- assert(!subsurface->internal);
- wl_signal_add(&subsurface->events.desync_precommit, listener);
-}
-
-EINTERN void
e_subsurface_coord_get(E_Subsurface *subsurface, int *x, int *y)
{
E_Subsurface *iter = subsurface;
uuid_t handle;
struct wl_listener destroy;
- struct wl_listener cached;
- struct wl_listener sync_precommit;
- struct wl_listener desync_precommit;
+ struct wl_listener precommit_to_cache;
+ struct wl_listener precommit_from_cache;
+ struct wl_listener precommit_from_pending;
struct wl_listener parent_map;
struct wl_listener parent_unmap;
struct wl_listener source_destroy;
wl_resource_set_user_data(viewport->resource, NULL);
wl_list_remove(&viewport->parent_map.link);
wl_list_remove(&viewport->parent_unmap.link);
- wl_list_remove(&viewport->sync_precommit.link);
- wl_list_remove(&viewport->desync_precommit.link);
- wl_list_remove(&viewport->cached.link);
+ wl_list_remove(&viewport->precommit_from_cache.link);
+ wl_list_remove(&viewport->precommit_from_pending.link);
+ wl_list_remove(&viewport->precommit_to_cache.link);
wl_list_remove(&viewport->destroy.link);
free(viewport);
}
}
static void
-_viewport_cb_cached(struct wl_listener *listener, void *data)
+_viewport_cb_precommit_to_cache(struct wl_listener *listener, void *data)
{
- E_Video_Viewport *viewport = wl_container_of(listener, viewport, cached);
+ E_Video_Viewport *viewport = wl_container_of(listener, viewport, precommit_to_cache);
- _viewport_state_move(&viewport->cache, &viewport->pending);
+ VS_INF("VIEWPORT %p| Precommit to cache (pending.committed:%d, cache.committed:%d)",
+ viewport, viewport->pending.committed, viewport->cache.committed);
- VS_INF("VIEWPORT %p| Commit to cache(cache.committed:%d)",
- viewport, viewport->cache.committed);
+ _viewport_state_move(&viewport->cache, &viewport->pending);
}
static void
-_viewport_cb_sync_precommit(struct wl_listener *listener, void *data)
+_viewport_cb_precommit_from_cache(struct wl_listener *listener, void *data)
{
- E_Video_Viewport *viewport = wl_container_of(listener, viewport, sync_precommit);
+ E_Video_Viewport *viewport = wl_container_of(listener, viewport, precommit_from_cache);
- VS_INF("VIEWPORT %p| Sync Commit (pending.committed:%d, cache.committed:%d)",
- viewport, viewport->pending.committed, viewport->cache.committed);
+ VS_INF("VIEWPORT %p| Precommit from cache (cache.committed:%d)",
+ viewport, viewport->cache.committed);
if (viewport->cache.committed != E_VIDEO_VIEWPORT_STATE_CLEAN)
_viewport_state_commit(viewport, &viewport->cache);
}
static void
-_viewport_cb_desync_precommit(struct wl_listener *listener, void *data)
+_viewport_cb_precommit_from_pending(struct wl_listener *listener, void *data)
{
- E_Video_Viewport *viewport = wl_container_of(listener, viewport, desync_precommit);
+ E_Video_Viewport *viewport = wl_container_of(listener, viewport, precommit_from_pending);
- VS_INF("VIEWPORT %p| Desync Commit (pending.committed:%d, cache.committed:%d)",
- viewport, viewport->pending.committed, viewport->cache.committed);
+ VS_INF("VIEWPORT %p| Precommit from pending (pending.committed:%d)",
+ viewport, viewport->pending.committed);
- if (viewport->cache.committed != E_VIDEO_VIEWPORT_STATE_CLEAN)
- {
- _viewport_state_move(&viewport->cache, &viewport->pending);
- _viewport_state_commit(viewport, &viewport->cache);
- }
- else
- {
- _viewport_state_commit(viewport, &viewport->pending);
- }
+ _viewport_state_commit(viewport, &viewport->pending);
}
static void
_video_shell_cb_export_viewport(struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *subsurface_resource)
{
E_Video_Viewport *viewport;
- E_Surface *parent_surface;
+ E_Surface *surface, *parent_surface;
viewport = calloc(1, sizeof(*viewport));
if (!viewport)
viewport->destroy.notify = _viewport_cb_subsurface_destroy;
e_subsurface_destroy_listener_add(viewport->subsurface, &viewport->destroy);
- viewport->cached.notify = _viewport_cb_cached;
- e_subsurface_cached_listener_add(viewport->subsurface, &viewport->cached);
+ surface = e_subsurface_surface_get(viewport->subsurface);
+ viewport->precommit_to_cache.notify = _viewport_cb_precommit_to_cache;
+ e_surface_precommit_to_cache_listener_add(surface, &viewport->precommit_to_cache);
- viewport->sync_precommit.notify = _viewport_cb_sync_precommit;
- e_subsurface_sync_precommit_listener_add(viewport->subsurface, &viewport->sync_precommit);
+ viewport->precommit_from_cache.notify = _viewport_cb_precommit_from_cache;
+ e_surface_precommit_from_cache_listener_add(surface, &viewport->precommit_from_cache);
- viewport->desync_precommit.notify = _viewport_cb_desync_precommit;
- e_subsurface_desync_precommit_listener_add(viewport->subsurface, &viewport->desync_precommit);
+ viewport->precommit_from_pending.notify = _viewport_cb_precommit_from_pending;
+ e_surface_precommit_from_pending_listener_add(surface, &viewport->precommit_from_pending);
parent_surface = e_subsurface_parent_get(viewport->subsurface);