evas_main: add ref count for removing Evas Pointer Data 22/301722/3
authorHosang Kim <hosang12.kim@samsung.com>
Wed, 22 Nov 2023 05:48:01 +0000 (14:48 +0900)
committerHosang Kim <hosang12.kim@samsung.com>
Wed, 22 Nov 2023 06:01:46 +0000 (15:01 +0900)
Change-Id: If7b4165e44a2adb6c04e95707a260e15648caabd

src/lib/evas/canvas/evas_main.c
src/lib/evas/canvas/evas_object_main.c
src/lib/evas/include/evas_private.h

index 8531537..ecc6cd4 100644 (file)
@@ -1506,6 +1506,7 @@ _evas_pointer_data_add(Evas_Public_Data *edata, Evas_Device *pointer)
    pdata->pointer = pointer;
    pdata->seat = pseat;
    pseat->pointers = eina_inlist_append(pseat->pointers, EINA_INLIST_GET(pdata));
+   pdata->ref_count = 0;
    return pdata;
 }
 
@@ -1540,6 +1541,34 @@ _evas_pointer_data_remove(Evas_Public_Data *edata, Evas_Device *pointer, Eina_Bo
      }
 }
 
+Evas_Pointer_Data *
+_evas_pointer_data_ref(Evas_Pointer_Data *pdata)
+{
+  if (!pdata) return NULL;
+  pdata->ref_count++;
+  return pdata;
+}
+
+void
+_evas_pointer_data_unref(Evas_Pointer_Data *pdata)
+{
+   if (!pdata) return;
+
+   if (pdata->ref_count == 0)
+     {
+        ERR("Pointer data ref count is already zero.");
+        return;
+     }
+
+   pdata->ref_count--;
+
+   if (pdata->ref_count == 0)
+     {
+       Evas_Public_Data *edata = efl_data_scope_safe_get(efl_input_device_evas_get(pdata->pointer), EVAS_CANVAS_CLASS);
+      _evas_pointer_data_remove(edata, pdata->pointer, EINA_FALSE);
+     }
+}
+
 Eina_List *
 _evas_pointer_list_in_rect_get(Evas_Public_Data *edata, Evas_Object *obj,
                                Evas_Object_Protected_Data *obj_data,
index 4787783..5e90daa 100644 (file)
@@ -153,7 +153,7 @@ evas_object_pointer_grab_del(Evas_Object_Protected_Data *obj,
           events->pointer_grabs = eina_inlist_remove(events->pointer_grabs, EINA_INLIST_GET(pdata));
         EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events);
      }
-
+   _evas_pointer_data_unref(pdata->evas_pdata);
    free(pdata);
    return;
 
@@ -171,7 +171,7 @@ _evas_object_pointer_data_add(Evas_Pointer_Data *evas_pdata,
    pdata = calloc(1, sizeof(Evas_Object_Pointer_Data));
    EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, NULL);
    pdata->pointer_mode = EVAS_OBJECT_POINTER_MODE_AUTOGRAB;
-   pdata->evas_pdata = evas_pdata;
+   pdata->evas_pdata = _evas_pointer_data_ref(evas_pdata);
    pdata->obj = obj;
    EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events)
      events->pointer_grabs = eina_inlist_append(events->pointer_grabs,
index cff6f48..7f4532d 100755 (executable)
@@ -385,6 +385,7 @@ struct _Evas_Pointer_Data
    Evas_Device    *pointer;
    DATA32         button;
    Evas_Pointer_Seat *seat;
+   int            ref_count;
 };
 
 typedef struct _Evas_Post_Render_Job
@@ -1466,6 +1467,8 @@ void _evas_focus_dispatch_event(Evas_Object_Protected_Data *obj,
 Evas_Pointer_Data *_evas_pointer_data_by_device_get(Evas_Public_Data *edata, Efl_Input_Device *pointer);
 Evas_Pointer_Data *_evas_pointer_data_add(Evas_Public_Data *edata, Efl_Input_Device *pointer);
 void _evas_pointer_data_remove(Evas_Public_Data *edata, Efl_Input_Device *pointer, Eina_Bool nofree);
+Evas_Pointer_Data *_evas_pointer_data_ref(Evas_Pointer_Data *pdata);
+void _evas_pointer_data_unref(Evas_Pointer_Data *pdata);
 Eina_List *_evas_pointer_list_in_rect_get(Evas_Public_Data *edata,
                                          Evas_Object *obj,
                                          Evas_Object_Protected_Data *obj_data,