From 9cae74bc82dca4220fb09798fdc95c78c8198927 Mon Sep 17 00:00:00 2001 From: Hosang Kim Date: Wed, 22 Nov 2023 14:48:01 +0900 Subject: [PATCH] evas_main: add ref count for removing Evas Pointer Data Change-Id: If7b4165e44a2adb6c04e95707a260e15648caabd --- src/lib/evas/canvas/evas_main.c | 29 +++++++++++++++++++++++++++++ src/lib/evas/canvas/evas_object_main.c | 4 ++-- src/lib/evas/include/evas_private.h | 3 +++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 8531537..ecc6cd4 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -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, diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 4787783..5e90daa 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -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, diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index cff6f48..7f4532d 100755 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -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, -- 2.7.4