e_devicemgr: create tizen_input_devices only for first bound seat & manager
[platform/upstream/enlightenment.git] / src / bin / e_comp_wl_input.c
index c5354a3..4653983 100644 (file)
@@ -352,21 +352,48 @@ static const struct wl_seat_interface _e_seat_interface =
 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;
@@ -374,7 +401,7 @@ _e_comp_wl_input_cb_bind_seat(struct wl_client *client, void *data EINA_UNUSED,
      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);