#include <tbm_drm_helper.h>
#include <gbm.h>
+#include "e_client_intern.h"
+
#define PATH "/org/enlightenment/wm"
#define IFACE "org.enlightenment.wm.screen_rotation"
{
struct wl_resource *resource; /* tizen_screen_rotation */
E_Client *ec;
+ struct wl_listener ec_destroy;
} E_Comp_Screen_Tzsr;
static Eina_List *tzsr_list;
static E_Client_Hook *tzsr_client_hook_del;
+static void _tz_screen_rotation_cb_ec_destroy(struct wl_listener *listener, void *data);
+
static E_Comp_Screen_Tzsr*
_tz_surface_rotation_find(E_Client *ec)
{
- E_Comp_Screen_Tzsr *tzsr;
- Eina_List *l;
+ E_Comp_Screen_Tzsr *tzsr = NULL;
+ struct wl_listener *listener;
- EINA_LIST_FOREACH(tzsr_list, l, tzsr)
- {
- if (tzsr->ec == ec)
- return tzsr;
- }
+ listener = e_client_destroy_listener_get(ec, _tz_screen_rotation_cb_ec_destroy);
+ if (listener)
+ return wl_container_of(listener, tzsr, ec_destroy);
- return NULL;
+ return tzsr;
}
static void
{
ELOGF("TRANSFORM", "|tzsr(%p) freed", tzsr->ec, tzsr);
tzsr_list = eina_list_remove(tzsr_list, tzsr);
+ wl_list_remove(&tzsr->ec_destroy.link);
free(tzsr);
}
static void
-_tz_screen_rotation_cb_client_del(void *data, E_Client *ec)
+_tz_screen_rotation_cb_ec_destroy(struct wl_listener *listener, void *data)
{
- E_Comp_Screen_Tzsr *tzsr = _tz_surface_rotation_find(ec);
- if (!tzsr) return;
+ E_Comp_Screen_Tzsr *tzsr;
+
+ tzsr = wl_container_of(listener, tzsr, ec_destroy);
_tz_surface_rotation_free(tzsr);
}
tzsr->resource = resource;
tzsr->ec = ec;
+ tzsr->ec_destroy.notify = _tz_screen_rotation_cb_ec_destroy;
+ e_client_destroy_listener_add(ec, &tzsr->ec_destroy);
+
tzsr_list = eina_list_append(tzsr_list, tzsr);
zone = e_comp_zone_find_by_ec(ec);
}
e_main_ts_end("\tDBUS Init Done");
- tzsr_client_hook_del = e_client_hook_add(E_CLIENT_HOOK_DEL, _tz_screen_rotation_cb_client_del, NULL);
-
E_LIST_HANDLER_APPEND(event_handlers, ECORE_EVENT_DEVICE_ADD, _e_comp_screen_cb_input_device_add, comp);
E_LIST_HANDLER_PREPEND(event_handlers, ECORE_EVENT_DEVICE_DEL, _e_comp_screen_cb_input_device_del, comp);