static void
_e_comp_wl_input_cb_unbind_seat(struct wl_resource *resource)
{
+ E_Comp_Wl_Seat *seat = wl_resource_get_user_data(resource);
+
+ DBG("Unbind seat: %u (client: %p)", wl_resource_get_id(resource), wl_resource_get_client(resource));
+
e_comp_wl->seat.resources =
eina_list_remove(e_comp_wl->seat.resources, resource);
+ E_FREE(seat);
}
static void
_e_comp_wl_input_cb_bind_seat(struct wl_client *client, void *data EINA_UNUSED, uint32_t version, uint32_t id)
{
struct wl_resource *res;
+ Eina_List *l;
+ struct wl_resource *tmp_res;
+ E_Comp_Wl_Seat *seat;
+
+ seat = E_NEW(E_Comp_Wl_Seat, 1);
+ if (!seat)
+ {
+ ERR("Failed to allocate memory for seat data\n");
+ wl_client_post_no_memory(client);
+ return;
+ }
+ seat->is_first_resource = 1;
+
+ EINA_LIST_FOREACH(e_comp_wl->seat.resources, l, tmp_res)
+ {
+ if (wl_resource_get_client(tmp_res) != client) continue;
+ DBG("wl_seat (res: %d) is already bound to client (%p)",
+ wl_resource_get_id(tmp_res), client);
+ seat->is_first_resource = 0;
+ }
res = wl_resource_create(client, &wl_seat_interface, version, id);
if (!res)
{
ERR("Could not create seat resource: %m");
+ E_FREE(seat);
return;
}
+ DBG("Bind seat: %u (client: %p)", wl_resource_get_id(res), client);
/* store version of seat interface for reuse in updating capabilities */
e_comp_wl->seat.version = version;
eina_list_append(e_comp_wl->seat.resources, res);
wl_resource_set_implementation(res, &_e_seat_interface,
- e_comp->wl_comp_data,
+ seat,
_e_comp_wl_input_cb_unbind_seat);
_e_comp_wl_input_update_seat_caps(client);
E_Devicemgr_Input_Device_User_Data *device_user_data;
struct wl_array axes;
E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
+ E_Comp_Wl_Seat *seat_data;
/* TODO: find the seat corresponding to event */
serial = wl_display_next_serial(e_comp_wl->wl.disp);
EINA_LIST_FOREACH(e_comp_wl->seat.resources, l, seat_res)
{
+ seat_data = wl_resource_get_user_data(seat_res);
+ if (!seat_data->is_first_resource)
+ {
+ DMDBG("The seat (res:%d) is not the first resource bound to client (%p)",
+ wl_resource_get_id(seat_res), wl_resource_get_client(seat_res));
+ continue;
+ }
+
wc = wl_resource_get_client(seat_res);
EINA_LIST_FOREACH(e_devicemgr->wl_data->mgr_data_list, ll, mgr_data)
{
dev_mgr_res = mgr_data->resource;
if (wl_resource_get_client(dev_mgr_res) != wc) continue;
+ if (!mgr_data->is_first_resource)
+ {
+ DMDBG("This device_manager (res:%d) not the first resource bound to client (%p)",
+ wl_resource_get_id(dev_mgr_res), wc);
+ continue;
+ }
res = wl_resource_create(wc, &tizen_input_device_interface, 1, 0);
if (!res)
{
E_Devicemgr_Input_Device *dev;
struct wl_array axes;
E_Devicemgr_Input_Device_User_Data *device_user_data;
- E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
+ E_Devicemgr_Input_Device_Mgr_Data *mgr_data, *tmp_data;
mgr_data = E_NEW(E_Devicemgr_Input_Device_Mgr_Data, 1);
if (!mgr_data)
wl_client_post_no_memory(client);
return;
}
+ mgr_data->is_first_resource = 1;
+
+ EINA_LIST_FOREACH(e_devicemgr->wl_data->mgr_data_list, l, tmp_data)
+ {
+ if (wl_resource_get_client(tmp_data->resource) != client) continue;
+ DMDBG("tizen_input_device_manager (res: %d) is already bound to client (%p)",
+ wl_resource_get_id(tmp_data->resource), client);
+ mgr_data->is_first_resource = 0;
+ }
if (!(res = wl_resource_create(client, &tizen_input_device_manager_interface, version, id)))
{
return;
}
+ DMDBG("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;
e_devicemgr->wl_data->mgr_data_list = eina_list_append(e_devicemgr->wl_data->mgr_data_list, mgr_data);
wl_resource_set_implementation(res, &_e_devicemgr_wl_implementation, mgr_data,
_e_devicemgr_wl_cb_unbind);
+ if (!mgr_data->is_first_resource)
+ {
+ DMDBG("This device_manager (res:%d) is not the first resource bound to client (%p)",
+ wl_resource_get_id(res), client);
+ return;
+ }
+
EINA_LIST_FOREACH(e_comp_wl->seat.resources, l, seat_res)
{
if (wl_resource_get_client(seat_res) != client) continue;