#include <tizen-extension-server-protocol.h>
-typedef struct _E_Tizen_Devicemgr_Mgr_Data E_Tizen_Devicemgr_Mgr_Data;
typedef struct _E_Tizen_Devicemgr_User_Data E_Tizen_Devicemgr_User_Data;
struct _E_Tizen_Devicemgr
{
struct wl_global *global;
- Eina_List *mgr_data_list;
-};
-
-struct _E_Tizen_Devicemgr_Mgr_Data
-{
- struct wl_resource *resource;
- Eina_List *user_data_list;
+ Eina_List *mgr_resources;
};
struct _E_Tizen_Devicemgr_User_Data
{
E_Devicemgr_Input_Device *dev;
- struct wl_resource *dev_res;
- struct wl_resource *dev_mgr_res;
+ struct wl_resource *resource; //resource of tizen_input_device
struct wl_resource *seat_res;
- E_Tizen_Devicemgr_Mgr_Data *mgr_data;
+ struct wl_resource *mgr_res;
+ struct wl_listener manager_destroy_listener; //listener for destroy of manager
+ struct wl_listener seat_destroy_listener; //listener for destroy of seat
};
static E_Tizen_Devicemgr *g_tizen_devicemgr = NULL;
{
if (!device_user_data) return;
- DMDBG("Destroy device user data. (res: %u)", device_user_data->dev_res ? wl_resource_get_id(device_user_data->dev_res) : 0x0);
-
- if (device_user_data->mgr_data)
- device_user_data->mgr_data->user_data_list = eina_list_remove(device_user_data->mgr_data->user_data_list, device_user_data);
+ DMDBG("Destroy device user data. (res: %u)", device_user_data->resource ? wl_resource_get_id(device_user_data->resource) : 0x0);
if (device_user_data->dev)
- device_user_data->dev->resources = eina_list_remove(device_user_data->dev->resources, device_user_data->dev_res);
+ device_user_data->dev->resources = eina_list_remove(device_user_data->dev->resources, device_user_data->resource);
- if (device_user_data->dev_res)
- wl_resource_set_user_data(device_user_data->dev_res, NULL);
+ if (device_user_data->resource)
+ wl_resource_set_user_data(device_user_data->resource, NULL);
+
+ if (device_user_data->manager_destroy_listener.notify)
+ {
+ wl_list_remove(&device_user_data->manager_destroy_listener.link);
+ device_user_data->manager_destroy_listener.notify = NULL;
+ }
+ if (device_user_data->seat_destroy_listener.notify)
+ {
+ wl_list_remove(&device_user_data->seat_destroy_listener.link);
+ device_user_data->seat_destroy_listener.notify = NULL;
+ }
E_FREE(device_user_data);
}
+static void
+_e_devicemgr_wl_device_cb_seat_destroy(struct wl_listener *l, void *data)
+{
+ struct wl_resource *seat_resource = (struct wl_resource *)data;
+ E_Tizen_Devicemgr_User_Data *device_user_data;
+
+ DMDBG("Listener(%p) called: seat_resource: %p destroyed", l, seat_resource);
+
+ device_user_data = container_of(l, E_Tizen_Devicemgr_User_Data,
+ seat_destroy_listener);
+ if (!device_user_data) return;
+
+ if (device_user_data->seat_destroy_listener.notify)
+ {
+ wl_list_remove(&device_user_data->seat_destroy_listener.link);
+ device_user_data->seat_destroy_listener.notify = NULL;
+ }
+ if (device_user_data->resource)
+ {
+ DMDBG("Destroy device resource. (res: %u)", wl_resource_get_id(device_user_data->resource));
+ wl_resource_destroy(device_user_data->resource);
+ device_user_data->resource = NULL;
+ }
+
+ device_user_data->seat_res = NULL;
+}
+
+static void
+_e_devicemgr_wl_device_cb_manager_destroy(struct wl_listener *l, void *data)
+{
+ struct wl_resource *mgr_resource = (struct wl_resource *)data;
+ E_Tizen_Devicemgr_User_Data *device_user_data;
+
+ DMDBG("Listener(%p) called: mgr_resource: %p destroyed", l, mgr_resource);
+
+ device_user_data = container_of(l, E_Tizen_Devicemgr_User_Data,
+ manager_destroy_listener);
+ if (!device_user_data) return;
+
+ if (device_user_data->manager_destroy_listener.notify)
+ {
+ wl_list_remove(&device_user_data->manager_destroy_listener.link);
+ device_user_data->manager_destroy_listener.notify = NULL;
+ }
+ if (device_user_data->resource)
+ {
+ DMDBG("Destroy device resource. (res: %u)", wl_resource_get_id(device_user_data->resource));
+ wl_resource_destroy(device_user_data->resource);
+ device_user_data->resource = NULL;
+ }
+
+ device_user_data->mgr_res = NULL;
+}
+
static void
_e_devicemgr_wl_device_cb_unbind(struct wl_resource *resource)
{
struct wl_client *wc;
E_Tizen_Devicemgr_User_Data *device_user_data;
struct wl_array axes;
- E_Tizen_Devicemgr_Mgr_Data *mgr_data;
E_Comp_Wl_Data *comp_wl;
/* TODO: find the seat corresponding to event */
{
wc = wl_resource_get_client(seat_res);
- EINA_LIST_FOREACH(g_tizen_devicemgr->mgr_data_list, ll, mgr_data)
+ EINA_LIST_FOREACH(g_tizen_devicemgr->mgr_resources, ll, dev_mgr_res)
{
- dev_mgr_res = mgr_data->resource;
- if (!dev_mgr_res) continue;
if (wl_resource_get_client(dev_mgr_res) != wc) continue;
res = wl_resource_create(wc, &tizen_input_device_interface, 1, 0);
wl_resource_destroy(res);
break;
}
+
+ wl_resource_set_implementation(res, &_e_devicemgr_wl_device_interface, device_user_data,
+ _e_devicemgr_wl_device_cb_unbind);
+
device_user_data->dev = dev;
- device_user_data->dev_mgr_res = dev_mgr_res;
+ device_user_data->resource = res;
+
device_user_data->seat_res = seat_res;
- device_user_data->dev_res = res;
- device_user_data->mgr_data = mgr_data;
+ device_user_data->seat_destroy_listener.notify =
+ _e_devicemgr_wl_device_cb_seat_destroy;
+ wl_resource_add_destroy_listener(seat_res, &device_user_data->seat_destroy_listener);
+
+ device_user_data->mgr_res = dev_mgr_res;
+ device_user_data->manager_destroy_listener.notify =
+ _e_devicemgr_wl_device_cb_manager_destroy;
+ wl_resource_add_destroy_listener(dev_mgr_res, &device_user_data->manager_destroy_listener);
dev->resources = eina_list_append(dev->resources, res);
- mgr_data->user_data_list = eina_list_append(mgr_data->user_data_list, device_user_data);
- wl_resource_set_implementation(res, &_e_devicemgr_wl_device_interface, device_user_data,
- _e_devicemgr_wl_device_cb_unbind);
tizen_input_device_manager_send_device_add(dev_mgr_res, serial, dev->identifier, res, seat_res);
tizen_input_device_send_device_info(res, dev->name, dev->clas, dev->subclas, &axes);
}
{
device_user_data = wl_resource_get_user_data(res);
if (!device_user_data) continue;
- if (!device_user_data->dev_mgr_res || !device_user_data->seat_res ||
- !device_user_data->dev_res)
+ if (!device_user_data->mgr_res || !device_user_data->seat_res || !device_user_data->resource)
continue;
device_user_data->dev = NULL;
tizen_input_device_manager_send_device_remove(
- device_user_data->dev_mgr_res,
+ device_user_data->mgr_res,
serial, dev->identifier,
- device_user_data->dev_res,
+ device_user_data->resource,
device_user_data->seat_res);
_e_devicemgr_wl_device_data_destroy(device_user_data); // Make inert
Eina_List *l, *ll;
uint32_t serial;
struct wl_client *wc;
- E_Tizen_Devicemgr_Mgr_Data *mgr_data;
E_Comp_Wl_Data *comp_wl;
comp_wl = e_comp_wl_get();
{
wc = wl_resource_get_client(seat_resource);
- EINA_LIST_FOREACH(g_tizen_devicemgr->mgr_data_list, ll, mgr_data)
+ EINA_LIST_FOREACH(g_tizen_devicemgr->mgr_resources, ll, dev_mgr_resource)
{
- dev_mgr_resource = mgr_data->resource;
if (!dev_mgr_resource) continue;
if (wl_resource_get_client(dev_mgr_resource) != wc) continue;
if (wl_resource_get_version(dev_mgr_resource) < 4) continue;
static void
_e_devicemgr_wl_cb_unbind(struct wl_resource *resource)
{
- E_Tizen_Devicemgr_Mgr_Data *mgr_data;
- E_Tizen_Devicemgr_User_Data *device_user_data;
-
if(!e_comp_wl_get()) return;
- mgr_data = wl_resource_get_user_data(resource);
- if (!mgr_data) return;
-
- DMDBG("Unbind tizen_input_device_manager: %u (client: %p)", wl_resource_get_id(resource), wl_resource_get_client(resource));
-
- EINA_LIST_FREE(mgr_data->user_data_list, device_user_data)
- {
- device_user_data->mgr_data = NULL;
- _e_devicemgr_wl_device_data_destroy(device_user_data);
- }
- g_tizen_devicemgr->mgr_data_list = eina_list_remove(g_tizen_devicemgr->mgr_data_list, mgr_data);
+ DMINF("Unbind tizen_input_device_manager: %u (client: %p)", wl_resource_get_id(resource), wl_resource_get_client(resource));
- E_FREE(mgr_data);
+ g_tizen_devicemgr->mgr_resources = eina_list_remove(g_tizen_devicemgr->mgr_resources, resource);
}
static void
E_Devicemgr_Input_Device *dev;
struct wl_array axes;
E_Tizen_Devicemgr_User_Data *device_user_data;
- E_Tizen_Devicemgr_Mgr_Data *mgr_data;
E_Comp_Wl_Data *comp_wl;
- mgr_data = E_NEW(E_Tizen_Devicemgr_Mgr_Data, 1);
- if (!mgr_data)
- {
- DMERR("Failed to allocate memory for input device mgr data\n");
- wl_client_post_no_memory(client);
- return;
- }
-
if (!(res = wl_resource_create(client, &tizen_input_device_manager_interface, version, id)))
{
DMERR("Could not create tizen_input_device_manager_interface resource: %m");
wl_client_post_no_memory(client);
- E_FREE(mgr_data);
return;
}
DMINF("Bind tizen_input_device_manager: %u (client: %p)", wl_resource_get_id(res), wl_resource_get_client(res));
- mgr_data->resource = res;
- mgr_data->user_data_list = NULL;
- g_tizen_devicemgr->mgr_data_list = eina_list_append(g_tizen_devicemgr->mgr_data_list, mgr_data);
-
- wl_resource_set_implementation(res, &_e_devicemgr_wl_implementation, mgr_data,
+ wl_resource_set_implementation(res, &_e_devicemgr_wl_implementation, NULL,
_e_devicemgr_wl_cb_unbind);
+ g_tizen_devicemgr->mgr_resources = eina_list_append(g_tizen_devicemgr->mgr_resources, res);
+
comp_wl = e_comp_wl_get();
EINA_LIST_FOREACH(comp_wl->seat.resources, l, seat_res)
{
g_rec_mutex_unlock(&e_devicemgr->device_list_mutex);
return;
}
+
device_user_data = E_NEW(E_Tizen_Devicemgr_User_Data, 1);
if (!device_user_data)
{
g_rec_mutex_unlock(&e_devicemgr->device_list_mutex);
return;
}
+
+ wl_resource_set_implementation(device_res, &_e_devicemgr_wl_device_interface, device_user_data,
+ _e_devicemgr_wl_device_cb_unbind);
+
device_user_data->dev = dev;
- device_user_data->dev_mgr_res = res;
+ device_user_data->resource = device_res;
+
device_user_data->seat_res = seat_res;
- device_user_data->dev_res = device_res;
- device_user_data->mgr_data = mgr_data;
+ device_user_data->seat_destroy_listener.notify =
+ _e_devicemgr_wl_device_cb_seat_destroy;
+ wl_resource_add_destroy_listener(seat_res, &device_user_data->seat_destroy_listener);
- dev->resources = eina_list_append(dev->resources, device_res);
- mgr_data->user_data_list = eina_list_append(mgr_data->user_data_list, device_user_data);
+ device_user_data->mgr_res = res;
+ device_user_data->manager_destroy_listener.notify =
+ _e_devicemgr_wl_device_cb_manager_destroy;
+ wl_resource_add_destroy_listener(res, &device_user_data->manager_destroy_listener);
- wl_resource_set_implementation(device_res, &_e_devicemgr_wl_device_interface, device_user_data,
- _e_devicemgr_wl_device_cb_unbind);
+ dev->resources = eina_list_append(dev->resources, device_res);
tizen_input_device_manager_send_device_add(res, serial, dev->identifier, device_res, seat_res);
tizen_input_device_send_device_info(device_res, dev->name, dev->clas, dev->subclas, &axes);
DMERR("Could not add tizen_input_device_manager to wayland globals");
return NULL;
}
- g_tizen_devicemgr->mgr_data_list = NULL;
+ g_tizen_devicemgr->mgr_resources = NULL;
return g_tizen_devicemgr;
}
{
if (!g_tizen_devicemgr) return;
- eina_list_free(g_tizen_devicemgr->mgr_data_list);
+ eina_list_free(g_tizen_devicemgr->mgr_resources);
/* destroy the global seat resource */
wl_global_destroy(g_tizen_devicemgr->global);