ecore_evas_tbm: fix a wrong seat device as parent of a evas_device 84/272484/1
authorduna.oh <duna.oh@samsung.com>
Thu, 17 Mar 2022 10:38:30 +0000 (19:38 +0900)
committerduna.oh <duna.oh@samsung.com>
Thu, 17 Mar 2022 10:46:24 +0000 (19:46 +0900)
It was a bug that all of evas_devices in tbm backend have a default seat,
though a device sits in different seat, other than 'Enlightenment seat'.
This is fixed by using seatname in Ecore_Event_Device_Info struct.
A device now has a right seat device as a parent of it.

Change-Id: Ica419b3c56eb18a376fe462346da70b234790466

src/modules/ecore_evas/engines/tbm/ecore_evas_tbm.c

index f441a0a9582651460809ea05f3547ea1dd8de86b..5e01199c6aeb19d61e5d140c72b3ddf08564b99c 100644 (file)
@@ -111,14 +111,16 @@ _ecore_evas_tbm_ecore_device_class_to_evas(Ecore_Device_Class cls)
 }
 
 static Eina_Bool
-_ecore_evas_tbm_evas_device_find(Evas *evas, const char *identifier, Ecore_Device_Class ecore_cls)
+_ecore_evas_tbm_evas_device_find(Evas *evas, const char *name, const char *identifier, Ecore_Device_Class ecore_cls)
 {
    Eina_List *list, *l;
    Evas_Device *device;
+   char *evas_device_name;
    char *evas_device_description;
    Evas_Device_Class evas_cls = EVAS_DEVICE_CLASS_NONE;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(evas, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(identifier, EINA_FALSE);
 
    evas_cls = _ecore_evas_tbm_ecore_device_class_to_evas(ecore_cls);
@@ -126,23 +128,24 @@ _ecore_evas_tbm_evas_device_find(Evas *evas, const char *identifier, Ecore_Devic
    list = (Eina_List *)evas_device_list(evas, NULL);
    EINA_LIST_FOREACH(list, l, device)
      {
+        evas_device_name = (char *)evas_device_name_get(device);
         evas_device_description = (char *)evas_device_description_get(device);
-        if (!evas_device_description) continue;
-
-        if (_ecore_evas_tbm_strcmp(evas_device_description, identifier) &&
+        if (!evas_device_name || !evas_device_description) continue;
+        if (_ecore_evas_tbm_strcmp(evas_device_name, name) &&
+            _ecore_evas_tbm_strcmp(evas_device_description, identifier) &&
             evas_device_class_get(device) == evas_cls)
           {
              return EINA_TRUE;
           }
      }
-   return EINA_FALSE;
 }
 
 static Evas_Device *
-_ecore_evas_tbm_default_seat_get(Evas *evas)
+_ecore_evas_tbm_seat_get(Evas *evas, const char *seatname)
 {
    Eina_List *list, *l;
    Evas_Device *device;
+   const char *evas_device_name;
    const char *evas_device_description;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(evas, EINA_FALSE);
@@ -155,7 +158,16 @@ _ecore_evas_tbm_default_seat_get(Evas *evas)
         if ((evas_device_class_get(device) == EVAS_DEVICE_CLASS_SEAT) &&
             !strncmp(evas_device_description, "Enlightenment seat", sizeof("Enlightenment seat")))
           {
-             return device;
+             evas_device_name = evas_device_name_get(device);
+             if (seatname && evas_device_name)
+               {
+                  if (!strncmp(evas_device_name, seatname, sizeof(seatname)))
+                    return device;
+                  else
+                    continue;
+               }
+             else
+               return device;
           }
      }
    return NULL;
@@ -172,9 +184,9 @@ _ecore_evas_tbm_cb_ecore_device_add(void *data, int type EINA_UNUSED, void *even
 
    if (ee->prop.window != ev->window) return ECORE_CALLBACK_PASS_ON;
    if (!ev->identifier) return ECORE_CALLBACK_PASS_ON;
-   if (_ecore_evas_tbm_evas_device_find(ee->evas, ev->identifier, ev->clas)) return ECORE_CALLBACK_PASS_ON;
+   if (_ecore_evas_tbm_evas_device_find(ee->evas, ev->name, ev->identifier, ev->clas)) return ECORE_CALLBACK_PASS_ON;
 
-   seat = _ecore_evas_tbm_default_seat_get(ee->evas);
+   seat = _ecore_evas_tbm_seat_get(ee->evas, ev->seatname);
 
    evas_device_add_full(ee->evas, ev->name,
                         ev->identifier,
@@ -193,6 +205,7 @@ _ecore_evas_tbm_cb_ecore_device_del(void *data, int type EINA_UNUSED, void *even
    Ecore_Evas *ee = (Ecore_Evas *)data;
    Eina_List *list, *l, *l_next;
    Evas_Device *device;
+   const char *evas_device_name;
    const char *evas_device_description;
    Evas_Device_Class evas_cls = EVAS_DEVICE_CLASS_NONE;
 
@@ -206,10 +219,12 @@ _ecore_evas_tbm_cb_ecore_device_del(void *data, int type EINA_UNUSED, void *even
    list = (Eina_List *)evas_device_list(ee->evas, NULL);
    EINA_LIST_FOREACH_SAFE(list, l, l_next, device)
      {
-        evas_device_description = evas_device_description_get(device);
-        if (!evas_device_description) continue;
+        evas_device_name = (char *)evas_device_name_get(device);
+        evas_device_description = (char *)evas_device_description_get(device);
+        if (!evas_device_name || !evas_device_description) continue;
 
-        if (_ecore_evas_tbm_strcmp(evas_device_description, ev->identifier) &&
+        if (_ecore_evas_tbm_strcmp(evas_device_name, ev->name) &&
+            _ecore_evas_tbm_strcmp(evas_device_description, ev->identifier) &&
             evas_device_class_get(device) == evas_cls)
           {
              evas_device_del(device);