e_devicemgr: add data struct for tizen_input_device_manager 77/283877/2
authorduna.oh <duna.oh@samsung.com>
Fri, 4 Nov 2022 10:15:47 +0000 (19:15 +0900)
committerJunSeok Kim <juns.kim@samsung.com>
Thu, 10 Nov 2022 08:34:08 +0000 (08:34 +0000)
E_Devicemgr_Input_Device_Mgr_Data is a data for tizen_input_device_manager.
This has a Eina_List of E_Device_Input_Device_User_Data and manager's resource.
When a client unbinds tizen_input_device_manager, mgr_data iterates a list
of device_user_data and cleans up device's resource.

Change-Id: I7fa0650a1cf25b177b2a1a88dc6e1b8f80ad4409

src/bin/e_devicemgr_private.h
src/bin/e_devicemgr_wl.c

index 4e70fd514436a34432fa42fe57085edbdc91d761..b13391e30a074bdb5c1485ed2bc8e0e40825bdd2 100644 (file)
@@ -41,6 +41,7 @@
 #define DETENT_DEVICE_NAME "tizen_detent"
 #define INPUTGEN_MAX_BTN 16
 
+typedef struct _E_Devicemgr_Input_Device_Mgr_Data E_Devicemgr_Input_Device_Mgr_Data;
 typedef struct _E_Devicemgr_Input_Device_User_Data E_Devicemgr_Input_Device_User_Data;
 typedef struct _E_Devicemgr_Coords E_Devicemgr_Coords;
 typedef struct _E_Devicemgr_Inputgen_Touch_Axis E_Devicemgr_Inputgen_Touch_Axis;
@@ -49,11 +50,19 @@ typedef struct _E_Devicemgr_Inputgen_Client_Global_Data E_Devicemgr_Inputgen_Cli
 typedef struct _E_Devicemgr_Inputgen_Device_Data E_Devicemgr_Inputgen_Device_Data;
 typedef struct _E_Devicemgr_Inputgen_Resource_Data E_Devicemgr_Inputgen_Resource_Data;
 
+struct _E_Devicemgr_Input_Device_Mgr_Data
+{
+    struct wl_resource *resource;
+    Eina_List *user_data_list;
+};
+
 struct _E_Devicemgr_Input_Device_User_Data
 {
    E_Devicemgr_Input_Device *dev;
+   struct wl_resource *dev_res;
    struct wl_resource *dev_mgr_res;
    struct wl_resource *seat_res;
+   E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
 };
 
 struct _E_Devicemgr_Coords
@@ -134,9 +143,7 @@ struct _E_Devicemgr_Config_Data
 struct _E_Devicemgr_Wl_Data
 {
    struct wl_global *global;
-   Eina_List *resources;
-
-   Eina_List *dev_resources;
+   Eina_List *mgr_data_list;
 
 #ifdef HAVE_CYNARA
    cynara *p_cynara;
index a04aa5d1c78265ad620964421b549c7f3e623ee0..42adf36cef4f374e32ca6a25e3d8893bd1e4c1cc 100644 (file)
@@ -87,17 +87,26 @@ _e_devicemgr_wl_device_cb_unbind(struct wl_resource *resource)
 {
    E_Devicemgr_Input_Device *dev;
    E_Devicemgr_Input_Device_User_Data *device_user_data;
+   E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
 
-   e_devicemgr->wl_data->dev_resources = eina_list_remove(e_devicemgr->wl_data->dev_resources, resource);
-
+   DMDBG("Unbind tizen_input_device: %u (client: %p)", wl_resource_get_id(resource), wl_resource_get_client(resource));
    if (!(device_user_data = wl_resource_get_user_data(resource))) return;
 
+   mgr_data = device_user_data->mgr_data;
+   if (mgr_data)
+     {
+        mgr_data->user_data_list = eina_list_remove(mgr_data->user_data_list, device_user_data);
+     }
+
    dev = device_user_data->dev;
 
    device_user_data->dev = NULL;
    device_user_data->dev_mgr_res = NULL;
    device_user_data->seat_res = NULL;
+   device_user_data->dev_res = NULL;
+   device_user_data->mgr_data = NULL;
    E_FREE(device_user_data);
+   wl_resource_set_user_data(resource, NULL);
 
    if (!dev) return;
    dev->resources = eina_list_remove(dev->resources, resource);
@@ -127,6 +136,7 @@ e_devicemgr_wl_device_add(E_Devicemgr_Input_Device *dev)
    struct wl_client *wc;
    E_Devicemgr_Input_Device_User_Data *device_user_data;
    struct wl_array axes;
+   E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
 
    /* TODO: find the seat corresponding to event */
    serial = wl_display_next_serial(e_comp_wl->wl.disp);
@@ -136,8 +146,9 @@ e_devicemgr_wl_device_add(E_Devicemgr_Input_Device *dev)
      {
         wc = wl_resource_get_client(seat_res);
 
-        EINA_LIST_FOREACH(e_devicemgr->wl_data->resources, ll, dev_mgr_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;
              res = wl_resource_create(wc, &tizen_input_device_interface, 1, 0);
              if (!res)
@@ -155,9 +166,12 @@ e_devicemgr_wl_device_add(E_Devicemgr_Input_Device *dev)
              device_user_data->dev = dev;
              device_user_data->dev_mgr_res = dev_mgr_res;
              device_user_data->seat_res = seat_res;
+             device_user_data->dev_res = res;
+             device_user_data->mgr_data = mgr_data;
 
              dev->resources = eina_list_append(dev->resources, res);
-             e_devicemgr->wl_data->dev_resources = eina_list_append(e_devicemgr->wl_data->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);
@@ -174,6 +188,7 @@ e_devicemgr_wl_device_del(E_Devicemgr_Input_Device *dev)
    struct wl_resource *res, *seat_res, *dev_mgr_res;
    uint32_t serial;
    E_Devicemgr_Input_Device_User_Data *device_user_data;
+   E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
 
    serial = wl_display_next_serial(e_comp_wl->wl.disp);
 
@@ -181,8 +196,9 @@ e_devicemgr_wl_device_del(E_Devicemgr_Input_Device *dev)
    EINA_LIST_FOREACH(e_comp_wl->seat.resources, l, seat_res)
      {
         wc = wl_resource_get_client(seat_res);
-        EINA_LIST_FOREACH(e_devicemgr->wl_data->resources, ll, dev_mgr_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;
              EINA_LIST_FOREACH(dev->resources, lll, res)
                {
@@ -194,24 +210,13 @@ e_devicemgr_wl_device_del(E_Devicemgr_Input_Device *dev)
                   if (device_user_data->seat_res != seat_res)
                     continue;
 
+                  device_user_data->dev = NULL;
                   tizen_input_device_manager_send_device_remove(dev_mgr_res, serial, dev->identifier, res, seat_res);
                }
           }
      }
 
-   EINA_LIST_FREE(dev->resources, res)
-     {
-        device_user_data = wl_resource_get_user_data(res);
-        if (device_user_data)
-          {
-             device_user_data->dev = NULL;
-             device_user_data->dev_mgr_res = NULL;
-             device_user_data->seat_res = NULL;
-             E_FREE(device_user_data);
-          }
-
-        wl_resource_set_user_data(res, NULL);
-     }
+   eina_list_free(dev->resources);
 }
 
 void
@@ -264,6 +269,7 @@ e_devicemgr_wl_touch_max_count_send(int slot, struct wl_resource *res, struct wl
    Eina_List *l, *ll;
    uint32_t serial;
    struct wl_client *wc;
+   E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
 
    serial = wl_display_next_serial(e_comp_wl->wl.disp);
 
@@ -278,8 +284,9 @@ e_devicemgr_wl_touch_max_count_send(int slot, struct wl_resource *res, struct wl
           {
              wc = wl_resource_get_client(seat_resource);
 
-             EINA_LIST_FOREACH(e_devicemgr->wl_data->resources, ll, dev_mgr_resource)
+             EINA_LIST_FOREACH(e_devicemgr->wl_data->mgr_data_list, ll, mgr_data)
                {
+                  dev_mgr_resource = mgr_data->resource;
                   if (wl_resource_get_client(dev_mgr_resource) != wc) continue;
                   if (wl_resource_get_version(dev_mgr_resource) < 4) continue;
                   tizen_input_device_manager_send_max_touch_count(dev_mgr_resource, serial, slot, seat_resource);
@@ -528,24 +535,25 @@ static const struct tizen_input_device_manager_interface _e_devicemgr_wl_impleme
 static void
 _e_devicemgr_wl_cb_unbind(struct wl_resource *resource)
 {
-   struct wl_resource *device_res;
-   Eina_List *l, *l_next;
-   struct wl_client* wc;
+   E_Devicemgr_Input_Device_Mgr_Data *mgr_data;
+   E_Devicemgr_Input_Device_User_Data *device_user_data;
 
    if(!e_comp_wl) return;
 
-   DMINF("Unbind tizen_input_device_manager: %u (client: %p)", wl_resource_get_id(resource), wl_resource_get_client(resource));
+   mgr_data = wl_resource_get_user_data(resource);
+   if (!mgr_data) return;
 
-   EINA_LIST_FOREACH_SAFE(e_devicemgr->wl_data->dev_resources, l, l_next, device_res)
-     {
-        wc = wl_resource_get_client(resource);
-        if (wl_resource_get_client(device_res) != wc) continue;
+   DMDBG("Unbind tizen_input_device_manager: %u (client: %p)", wl_resource_get_id(resource), wl_resource_get_client(resource));
 
-        DMINF("Destroy tizen_input_device:%u", wl_resource_get_id(device_res));
-        wl_resource_destroy(device_res);
+   EINA_LIST_FREE(mgr_data->user_data_list, device_user_data)
+     {
+        DMINF("Destroy dev_res:%u", wl_resource_get_id(device_user_data->dev_res));
+        device_user_data->mgr_data = NULL;
+        wl_resource_destroy(device_user_data->dev_res);
      }
+   e_devicemgr->wl_data->mgr_data_list = eina_list_remove(e_devicemgr->wl_data->mgr_data_list, mgr_data);
 
-   e_devicemgr->wl_data->resources = eina_list_remove(e_devicemgr->wl_data->resources, resource);
+   E_FREE(mgr_data);
 }
 
 static void
@@ -557,6 +565,14 @@ _e_devicemgr_wl_cb_bind(struct wl_client *client, void *data, uint32_t version,
    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;
+
+   mgr_data = E_NEW(E_Devicemgr_Input_Device_Mgr_Data, 1);
+   if (!mgr_data)
+   {
+      wl_client_post_no_memory(client);
+      return;
+   }
 
    if (!(res = wl_resource_create(client, &tizen_input_device_manager_interface, version, id)))
      {
@@ -565,9 +581,11 @@ _e_devicemgr_wl_cb_bind(struct wl_client *client, void *data, uint32_t version,
         return;
      }
 
-   e_devicemgr->wl_data->resources = eina_list_append(e_devicemgr->wl_data->resources, 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, NULL,
+   wl_resource_set_implementation(res, &_e_devicemgr_wl_implementation, mgr_data,
                                   _e_devicemgr_wl_cb_unbind);
 
    EINA_LIST_FOREACH(e_comp_wl->seat.resources, l, seat_res)
@@ -599,9 +617,11 @@ _e_devicemgr_wl_cb_bind(struct wl_client *client, void *data, uint32_t version,
              device_user_data->dev = dev;
              device_user_data->dev_mgr_res = res;
              device_user_data->seat_res = seat_res;
+             device_user_data->dev_res = device_res;
+             device_user_data->mgr_data = mgr_data;
 
              dev->resources = eina_list_append(dev->resources, device_res);
-             e_devicemgr->wl_data->dev_resources = eina_list_append(e_devicemgr->wl_data->dev_resources, device_res);
+             mgr_data->user_data_list = eina_list_append(mgr_data->user_data_list, device_user_data);
 
              wl_resource_set_implementation(device_res, &_e_devicemgr_wl_device_interface, device_user_data,
                                             _e_devicemgr_wl_device_cb_unbind);
@@ -632,8 +652,7 @@ e_devicemgr_wl_init(void)
         DMERR("Could not add tizen_input_device_manager to wayland globals");
         return EINA_FALSE;
      }
-   e_devicemgr->wl_data->resources = NULL;
-   e_devicemgr->wl_data->dev_resources = NULL;
+   e_devicemgr->wl_data->mgr_data_list = NULL;
 
    /* initialization of cynara for checking privilege */
 #ifdef HAVE_CYNARA
@@ -659,6 +678,7 @@ e_devicemgr_wl_shutdown(void)
    if (e_devicemgr->wl_data->global)
      wl_global_destroy(e_devicemgr->wl_data->global);
    e_devicemgr->wl_data->global = NULL;
+   eina_list_free(e_devicemgr->wl_data->mgr_data_list);
 
    /* deinitialization of cynara if it has been initialized */
 #ifdef HAVE_CYNARA