_e_comp_wl_hook_call(E_COMP_WL_HOOK_CLIENT_SURFACE_COMMIT, ec);
}
-static void
-_e_comp_wl_client_subsurface_set(E_Client *ec, E_Comp_Wl_Subsurf_Data *sub)
-{
- e_comp_wl_client_surface_set(ec, ec->comp_data->wl_surface);
- ec->comp_data->sub.data = sub;
-
- /* set subsurface client properties */
- ec->borderless = EINA_TRUE;
- ec->argb = EINA_TRUE;
- ELOGF("SUBSURFACE", "Set argb:%d", ec, ec->argb);
- ec->lock_border = EINA_TRUE;
- ec->lock_focus_in = ec->lock_focus_out = EINA_TRUE;
- ec->netwm.state.skip_taskbar = EINA_TRUE;
- ec->netwm.state.skip_pager = EINA_TRUE;
- ec->border_size = 0;
- ec->lock_user_location = 0;
- ec->lock_client_location = 0;
- ec->lock_user_size = 0;
- ec->lock_client_size = 0;
- ec->lock_client_stacking = 0;
- ec->lock_user_maximize = 0;
- ec->lock_client_maximize = 0;
- ec->changes.need_maximize = 0;
- ec->maximized = E_MAXIMIZE_NONE;
- EC_CHANGED(ec);
-
- ec->new_client = ec->netwm.ping = EINA_TRUE;
- e_comp->new_clients++;
- e_client_unignore(ec);
-}
-
-static void
-_e_comp_wl_client_subsurface_parent_set(E_Client *ec, E_Client *parent)
-{
- E_Comp_Wl_Subsurf_Data *sub = ec->comp_data->sub.data;
- E_Layer layer;
-
- ELOGF("COMP", " |subsurface_parent:%p", ec, parent);
-
- sub->parent = parent;
-
- if (parent->frame)
- {
- layer = e_client_layer_get(parent);
- if (layer > E_LAYER_BOTTOM)
- e_client_layer_set(ec, layer);
- }
-
- if (parent->comp_data)
- {
- /* append this client to the parents subsurface list */
- parent->comp_data->sub.list_pending =
- eina_list_append(parent->comp_data->sub.list_pending, ec);
- parent->comp_data->sub.list_changed = EINA_TRUE;
- }
-}
-
-EINTERN void
-e_comp_wl_client_subsurface_parent_unset(E_Client *ec)
-{
- E_Comp_Wl_Subsurf_Data *sub = ec->comp_data->sub.data;
- E_Client *parent = sub->parent;
-
- parent->comp_data->sub.list =
- eina_list_remove(parent->comp_data->sub.list, ec);
- parent->comp_data->sub.list_pending =
- eina_list_remove(parent->comp_data->sub.list_pending, ec);
- parent->comp_data->sub.below_list =
- eina_list_remove(parent->comp_data->sub.below_list, ec);
- parent->comp_data->sub.below_list_pending =
- eina_list_remove(parent->comp_data->sub.below_list_pending, ec);
-
- sub->parent = NULL;
-}
-
-EINTERN void
-e_comp_wl_client_subsurface_init(E_Client *ec, struct wl_resource *subsurface_resource, E_Comp_Wl_Subsurf_Data *sub, E_Client *parent, E_Client *offscreen_parent)
-{
- sub->resource = subsurface_resource;
- sub->cached_buffer_ref.buffer = NULL;
- sub->synchronized = EINA_TRUE;
- sub->parent = parent;
- sub->remote_surface.offscreen_parent = offscreen_parent;
- if (offscreen_parent)
- ELOGF("SUBSURFACE", " |offscreen_parent:%p", ec, offscreen_parent);
-
- _e_comp_wl_surface_state_init(&sub->cached, ec->w, ec->h);
-
- _e_comp_wl_client_subsurface_set(ec, sub);
- _e_comp_wl_client_subsurface_parent_set(ec, parent);
-
- e_comp_wl_hook_call(E_COMP_WL_HOOK_SUBSURFACE_CREATE, ec);
-}
-
-EINTERN void
-e_comp_wl_client_subsurface_finish(E_Client *ec)
-{
- E_Comp_Wl_Subsurf_Data *sub = ec->comp_data->sub.data;
-
- if (sub->parent)
- e_comp_wl_client_subsurface_parent_unset(ec);
-
- e_comp_wl_surface_state_finish(&sub->cached);
- e_comp_wl_buffer_reference(&sub->cached_buffer_ref, NULL);
-
- ec->comp_data->sub.data = NULL;
-}
-
EINTERN void
e_comp_wl_client_evas_init(E_Client *ec)
{
EINTERN void e_comp_wl_client_surface_frame_callback_remove(E_Client *ec, struct wl_resource *callback_resource);
EINTERN void e_comp_wl_client_surface_pending_commit(E_Client *ec);
-EINTERN void e_comp_wl_client_subsurface_init(E_Client *ec, struct wl_resource *subsurface_resource, E_Comp_Wl_Subsurf_Data *sub, E_Client *parent, E_Client *offscreen_parent);
-EINTERN void e_comp_wl_client_subsurface_finish(E_Client *ec);
-EINTERN void e_comp_wl_client_subsurface_parent_unset(E_Client *ec);
EINTERN Eina_Bool e_comp_wl_client_subsurface_cyclic_reference_check(E_Client *ec, E_Client *parent);
EINTERN void e_comp_wl_client_subsurface_commit_to_cache(E_Client *ec);
EINTERN void e_comp_wl_client_subsurface_commit_from_cache(E_Client *ec);
static void _e_comp_wl_subsurface_commit_from_cache(E_Client *ec);
static void _e_comp_wl_subsurface_stack_update(E_Client *ec);
+static void
+_e_comp_wl_client_subsurface_set(E_Client *ec, E_Comp_Wl_Subsurf_Data *sdata)
+{
+ e_comp_wl_client_surface_set(ec, ec->comp_data->wl_surface);
+ ec->comp_data->sub.data = sdata;
+
+ /* set subsurface client properties */
+ ec->borderless = EINA_TRUE;
+ ec->argb = EINA_TRUE;
+ ELOGF("SUBSURFACE", "Set argb:%d", ec, ec->argb);
+ ec->lock_border = EINA_TRUE;
+ ec->lock_focus_in = ec->lock_focus_out = EINA_TRUE;
+ ec->netwm.state.skip_taskbar = EINA_TRUE;
+ ec->netwm.state.skip_pager = EINA_TRUE;
+ ec->border_size = 0;
+ ec->lock_user_location = 0;
+ ec->lock_client_location = 0;
+ ec->lock_user_size = 0;
+ ec->lock_client_size = 0;
+ ec->lock_client_stacking = 0;
+ ec->lock_user_maximize = 0;
+ ec->lock_client_maximize = 0;
+ ec->changes.need_maximize = 0;
+ ec->maximized = E_MAXIMIZE_NONE;
+ EC_CHANGED(ec);
+
+ ec->new_client = ec->netwm.ping = EINA_TRUE;
+ e_comp->new_clients++;
+ e_client_unignore(ec);
+}
+
+static void
+_e_comp_wl_client_subsurface_parent_set(E_Client *ec, E_Client *parent)
+{
+ E_Comp_Wl_Subsurf_Data *sdata = ec->comp_data->sub.data;
+ E_Layer layer;
+
+ ELOGF("COMP", " |subsurface_parent:%p", ec, parent);
+
+ sdata->parent = parent;
+
+ if (parent->frame)
+ {
+ layer = e_client_layer_get(parent);
+ if (layer > E_LAYER_BOTTOM)
+ e_client_layer_set(ec, layer);
+ }
+
+ if (parent->comp_data)
+ {
+ /* append this client to the parents subsurface list */
+ parent->comp_data->sub.list_pending =
+ eina_list_append(parent->comp_data->sub.list_pending, ec);
+ parent->comp_data->sub.list_changed = EINA_TRUE;
+ }
+}
+
+static void
+_subsurface_data_parent_unset(E_Comp_Wl_Subsurf_Data *sdata)
+{
+ E_Client *parent = sdata->parent;
+ Eina_List *l;
+ E_Client *subc;
+
+ if (!parent)
+ return;
+
+ EINA_LIST_FOREACH(parent->comp_data->sub.list_pending, l, subc)
+ {
+ if (subc->comp_data->sub.data == sdata)
+ {
+ parent->comp_data->sub.list_pending = eina_list_remove_list(parent->comp_data->sub.list_pending, l);
+ break;
+ }
+ }
+ EINA_LIST_FOREACH(parent->comp_data->sub.list, l, subc)
+ {
+ if (subc->comp_data->sub.data == sdata)
+ {
+ parent->comp_data->sub.list = eina_list_remove_list(parent->comp_data->sub.list, l);
+ break;
+ }
+ }
+ EINA_LIST_FOREACH(parent->comp_data->sub.below_list_pending, l, subc)
+ {
+ if (subc->comp_data->sub.data == sdata)
+ {
+ parent->comp_data->sub.below_list_pending = eina_list_remove_list(parent->comp_data->sub.below_list_pending, l);
+ break;
+ }
+ }
+ EINA_LIST_FOREACH(parent->comp_data->sub.below_list, l, subc)
+ {
+ if (subc->comp_data->sub.data == sdata)
+ {
+ parent->comp_data->sub.below_list = eina_list_remove_list(parent->comp_data->sub.below_list, l);
+ break;
+ }
+ }
+
+ sdata->parent = NULL;
+}
+
+EINTERN void
+e_comp_wl_subsurface_data_init(E_Comp_Wl_Subsurf_Data *sdata, E_Client *ec, E_Client *parent, E_Client *offscreen_parent)
+{
+ sdata->cached_buffer_ref.buffer = NULL;
+ sdata->synchronized = EINA_TRUE;
+ sdata->parent = parent;
+ sdata->remote_surface.offscreen_parent = offscreen_parent;
+ if (offscreen_parent)
+ ELOGF("SUBSURFACE", " |offscreen_parent:%p", ec, offscreen_parent);
+
+ e_comp_wl_surface_state_init(&sdata->cached, ec->w, ec->h);
+
+ _e_comp_wl_client_subsurface_set(ec, sdata);
+ _e_comp_wl_client_subsurface_parent_set(ec, parent);
+
+ e_comp_wl_hook_call(E_COMP_WL_HOOK_SUBSURFACE_CREATE, ec);
+}
+
+EINTERN void
+e_comp_wl_subsurface_data_finish(E_Comp_Wl_Subsurf_Data *sdata)
+{
+ _subsurface_data_parent_unset(sdata);
+ e_comp_wl_surface_state_finish(&sdata->cached);
+ e_comp_wl_buffer_reference(&sdata->cached_buffer_ref, NULL);
+}
+
+EINTERN void
+e_comp_wl_subsurface_data_parent_unset(E_Comp_Wl_Subsurf_Data *sdata)
+{
+ _subsurface_data_parent_unset(sdata);
+}
+
EINTERN void
e_comp_wl_client_subsurface_commit_to_cache(E_Client *ec)
{
EINTERN void e_comp_wl_subsurface_resource_stand_alone_mode_set(struct wl_resource *subsurface_resource);
EINTERN void e_comp_wl_subsurface_resource_place_below_parent(struct wl_resource *subsurface_resource);
+EINTERN void e_comp_wl_subsurface_data_init(E_Comp_Wl_Subsurf_Data *sdata, E_Client *ec, E_Client *parent, E_Client *offscreen_parent);
+EINTERN void e_comp_wl_subsurface_data_finish(E_Comp_Wl_Subsurf_Data *sdata);
+EINTERN void e_comp_wl_subsurface_data_parent_unset(E_Comp_Wl_Subsurf_Data *sdata);
+
EINTERN Eina_Bool e_comp_wl_subsurface_add(struct wl_resource *resource, uint32_t id, struct wl_resource *surface_resource, struct wl_resource *parent_resource);
EINTERN Eina_Bool e_comp_wl_subsurface_order_commit(E_Client *ec);
EINTERN Eina_Bool e_comp_wl_subsurface_commit(E_Client *ec);
sub->parent_surface_destroy.notify = _e_subsurface_cb_parent_surface_destroy;
wl_signal_add(&sub->parent->events.destroy, &sub->parent_surface_destroy);
- e_comp_wl_client_subsurface_init(surface->ec, NULL, &sub->base, sub->parent->ec, NULL);
+ e_comp_wl_subsurface_data_init(&sub->base, surface->ec, sub->parent->ec, NULL);
_e_subsurface_view_init(&sub->view, sub);
ELOGF("SUBSURFACE", "Destroy internal subsurface", sub->surface->ec);
_e_subsurface_view_finish(&sub->view);
- e_comp_wl_client_subsurface_finish(sub->surface->ec);
+ e_comp_wl_subsurface_data_finish(&sub->base);
+ sub->surface->ec->comp_data->sub.data = NULL;
wl_list_remove(&sub->parent_surface_destroy.link);
free(sub);
}
sub->parent_surface_destroy.notify = _e_subsurface_cb_parent_surface_destroy;
wl_signal_add(&parent_surface->base.destroy_signal, &sub->parent_surface_destroy);
- e_comp_wl_client_subsurface_init(surface->ec,
- ds_subsurface->resource,
- &sub->base,
- epc,
- offscreen_parent);
+ e_comp_wl_subsurface_data_init(&sub->base, surface->ec, epc, offscreen_parent);
+ sub->base.resource = ds_subsurface->resource;
_e_subsurface_view_init(&sub->view, sub);
_e_subsurface_view_finish(&sub->view);
- e_comp_wl_client_subsurface_finish(sub->surface->ec);
+ e_comp_wl_subsurface_data_finish(&sub->base);
+ sub->surface->ec->comp_data->sub.data = NULL;
wl_list_remove(&sub->request_move.link);
wl_list_remove(&sub->parent_surface_destroy.link);
wl_list_remove(&sub->surface_destroy.link);
sub->parent = NULL;
- e_comp_wl_client_subsurface_parent_unset(sub->surface->ec);
+ e_comp_wl_subsurface_data_parent_unset(&sub->base);
}
static void