struct ds_surface_viewport *surface_viewport;
struct ds_tizen_exported_surface *exported_surface;
- E_Client_Hook *client_del_hook;
-
const char *role_name;
struct wl_list frames;
struct
{
struct wl_signal destroy;
+ struct wl_signal client_destroy;
struct wl_signal parent_destroy;
struct wl_signal precommit_to_cache;
struct wl_signal precommit_from_cache;
static E_Surface *_e_surface_create(struct ds_surface *ds_surface);
static E_Surface *_e_surface_from_ds_surface(struct ds_surface *ds_surface);
-static void _e_surface_destroy(E_Surface *surface);
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);
return wl_signal_get(&surface->events.destroy, notify);
}
+EINTERN void
+e_surface_client_destroy_listener_add(E_Surface *surface, struct wl_listener *listener)
+{
+ wl_signal_add(&surface->events.client_destroy, listener);
+}
+
EINTERN void
e_surface_parent_destroy_listener_add(E_Surface *surface, struct wl_listener *listener)
{
ec->comp_data = &surface->base;
surface->ec = ec;
- surface->client_del_hook = e_client_hook_add(E_CLIENT_HOOK_DEL, _e_surface_cb_client_del, surface);
}
EINTERN E_Subsurface *
_e_surface_ds_surface_set(surface, ds_surface);
wl_signal_init(&surface->events.destroy);
+ wl_signal_init(&surface->events.client_destroy);
wl_signal_init(&surface->events.parent_destroy);
wl_signal_init(&surface->events.precommit_to_cache);
wl_signal_init(&surface->events.precommit_from_cache);
return surface;
}
-static void
-_e_surface_destroy(E_Surface *surface)
+EINTERN void
+e_surface_destroy(E_Surface *surface)
{
E_Comp_Wl_Data *comp_wl;
struct wl_resource *resource, *tmp;
E_FREE_FUNC(surface->base.on_focus_timer, ecore_timer_del);
- e_client_hook_del(surface->client_del_hook);
-
g_mutex_unlock(&surface->base.surface_mutex);
g_mutex_clear(&surface->base.surface_mutex);
+ surface->ec->comp_data = NULL;
+
free(surface);
}
e_comp_wl_hook_call(E_COMP_WL_HOOK_CLIENT_SURFACE_COMMIT, surface->ec);
}
-static void
-_e_surface_cb_client_del(void *data, E_Client *ec)
-{
- E_Surface *surface = data;
-
- if (surface->ec != ec)
- return;
-
- TRACE_DS_BEGIN(COMP_WL:CLIENT DEL CB);
-
- e_comp_wl_hook_call(E_COMP_WL_HOOK_DEL, ec);
-
- e_comp_wl_client_evas_deinit(ec);
-
- _e_surface_destroy(surface);
-
- ec->comp_data = NULL;
-
- TRACE_DS_END();
-}
-
static void
_e_surface_cb_destroy(struct wl_listener *listener, void *data)
{
surface = wl_container_of(listener, surface, destroy);
+ wl_signal_emit(&surface->events.client_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->commit.link);
wl_list_remove(&surface->new_subsurface.link);
surface->ds_surface = NULL;
-
- e_comp_wl_client_surface_finish(surface->ec);
}
static void
E_Surface *surface;
E_Client *ec;
- struct wl_listener surface_destroy;
+ E_Client_Hook *client_del_hook;
+
+ struct wl_listener surface_client_destroy;
};
static E_Surface_View_Module *e_module;
-static void
-_surface_view_surface_unset(E_Surface_View *view)
-{
- wl_list_remove(&view->surface_destroy.link);
- view->surface = NULL;
-}
-
static void
_surface_view_destroy(E_Surface_View *view)
{
ESV_INF("Destroy E_Surface_View(%p)", view->ec, view);
- _surface_view_surface_unset(view);
+ e_comp_wl_hook_call(E_COMP_WL_HOOK_DEL, view->ec);
+
+ e_comp_wl_client_evas_deinit(view->ec);
+
+ wl_list_remove(&view->surface_client_destroy.link);
+ e_surface_destroy(view->surface);
+ e_client_hook_del(view->client_del_hook);
free(view);
}
static void
-_surface_view_cb_surface_destroy(struct wl_listener *listener, void *data)
+_surface_view_cb_surface_client_destroy(struct wl_listener *listener, void *data)
{
- E_Surface_View *view = wl_container_of(listener, view, surface_destroy);
+ E_Surface_View *view = wl_container_of(listener, view, surface_client_destroy);
- _surface_view_destroy(view);
+ e_comp_wl_client_surface_finish(view->ec);
}
static void
{
view->surface = surface;
- view->surface_destroy.notify = _surface_view_cb_surface_destroy;
- e_surface_destroy_listener_add(surface, &view->surface_destroy);
+ view->surface_client_destroy.notify = _surface_view_cb_surface_client_destroy;
+ e_surface_client_destroy_listener_add(surface, &view->surface_client_destroy);
}
static E_Client *
return launchscreen_ec;
}
+static void
+_surface_view_cb_client_del(void *data, E_Client *ec)
+{
+ E_Surface_View *view = data;
+
+ if (view->ec != ec)
+ return;
+
+ TRACE_DS_BEGIN(SURFACE_VIEW:CLIENT DEL CB);
+ _surface_view_destroy(view);
+ TRACE_DS_END();
+}
+
static void
_surface_view_ec_set(E_Surface_View *view, E_Client *ec)
{
- view->ec = ec;
e_surface_ec_set(view->surface, ec);
+ view->ec = ec;
+ view->client_del_hook = e_client_hook_add(E_CLIENT_HOOK_DEL, _surface_view_cb_client_del, view);
+
ec->argb = EINA_FALSE;
ec->redirected = ec->ignored = 1;
ec->border_size = 0;
if (!_surface_view_ec_add(view))
{
ESV_ERR("Failed to add E_Client to E_Surface_View: surface(%p)", surface);
- _surface_view_surface_unset(view);
+ wl_list_remove(&view->surface_client_destroy.link);
free(view);
return NULL;
}