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);