From b42a0ba5d2b6788417ef043e3e92d669212e6b75 Mon Sep 17 00:00:00 2001 From: Guilherme Iscaro Date: Mon, 5 Dec 2016 14:26:25 -0200 Subject: [PATCH 1/2] Efl.Canvas.Object: Reduce memory used to store Evas_Object_Pointer_Data. The hash implementation demonstrated that too much memory was being used to store the Evas_Object_Pointer_Data. In order to reduce the memory usage this patches now changes the Evas_Object_Pointer_Data storage to an Eina_Inlist and now Massif profiles shows that the memory usage was drastically reduced. --- src/lib/evas/canvas/evas_object_main.c | 52 +++++++++++++++++++------- src/lib/evas/include/evas_private.h | 5 ++- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 07518b6901..79922850c6 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -81,24 +81,47 @@ _init_cow(void) return EINA_TRUE; } +static Evas_Object_Pointer_Data * +_evas_object_pointer_data_find(Evas_Object_Protected_Data *obj, + Efl_Input_Device *pointer) +{ + Evas_Object_Pointer_Data *pdata; + + EINA_INLIST_FOREACH(obj->pointer_grabs, pdata) + { + if (pdata->evas_pdata->pointer == pointer) + return pdata; + } + return NULL; +} + +static void +_evas_object_pointer_grab_del(Evas_Object_Protected_Data *obj, Evas_Object_Pointer_Data *pdata); + static void _evas_device_del_cb(void *data, const Efl_Event *ev) { Evas_Object_Protected_Data *obj = data; + Evas_Object_Pointer_Data *pdata = _evas_object_pointer_data_find(obj, + ev->object); - eina_hash_del_by_key(obj->pointer_grabs, &ev->object); + if (!pdata) return; + _evas_object_pointer_grab_del(obj, pdata); } static void -_evas_object_pointer_grab_del(Evas_Object_Pointer_Data *pdata) +_evas_object_pointer_grab_del(Evas_Object_Protected_Data *obj, + Evas_Object_Pointer_Data *pdata) { - if ((pdata->mouse_grabbed > 0) && (pdata->obj->layer) && (pdata->obj->layer->evas)) + if ((pdata->mouse_grabbed > 0) && (obj->layer) && (obj->layer->evas)) pdata->evas_pdata->mouse_grabbed -= pdata->mouse_grabbed; if (((pdata->mouse_in) || (pdata->mouse_grabbed > 0)) && - (pdata->obj->layer) && (pdata->obj->layer->evas)) - pdata->evas_pdata->object.in = eina_list_remove(pdata->evas_pdata->object.in, pdata->obj->object); + (obj->layer) && (obj->layer->evas)) + pdata->evas_pdata->object.in = eina_list_remove(pdata->evas_pdata->object.in, obj->object); efl_event_callback_del(pdata->evas_pdata->pointer, EFL_EVENT_DEL, - _evas_device_del_cb, pdata->obj); + _evas_device_del_cb, obj); + obj->pointer_grabs = eina_inlist_remove(obj->pointer_grabs, + EINA_INLIST_GET(pdata)); free(pdata); } @@ -112,12 +135,12 @@ _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->obj = obj; pdata->evas_pdata = evas_pdata; + obj->pointer_grabs = eina_inlist_append(obj->pointer_grabs, + EINA_INLIST_GET(pdata)); efl_event_callback_priority_add(pointer, EFL_EVENT_DEL, EFL_CALLBACK_PRIORITY_BEFORE, _evas_device_del_cb, obj); - eina_hash_add(obj->pointer_grabs, &pointer, pdata); return pdata; } @@ -128,7 +151,8 @@ _evas_object_pointer_data_get(Evas_Pointer_Data *evas_pdata, { Evas_Object_Pointer_Data *pdata; - pdata = eina_hash_find(obj->pointer_grabs, &pointer); + pdata = _evas_object_pointer_data_find(obj, evas_pdata->pointer); + //The pointer does not exist yet - create one. if (!pdata) return _evas_object_pointer_data_add(evas_pdata, obj, pointer); @@ -162,7 +186,6 @@ _efl_canvas_object_efl_object_constructor(Eo *eo_obj, Evas_Object_Protected_Data obj->prev = eina_cow_alloc(evas_object_state_cow); obj->data_3d = eina_cow_alloc(evas_object_3d_cow); obj->mask = eina_cow_alloc(evas_object_mask_cow); - obj->pointer_grabs = eina_hash_pointer_new(EINA_FREE_CB(_evas_object_pointer_grab_del)); evas_object_inject(eo_obj, obj, evas); evas_object_callback_init(eo_obj, obj); @@ -993,6 +1016,7 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data Evas_Canvas3D_Texture *texture; Efl_Input_Device *dev; Evas_Public_Data *edata; + Evas_Object_Pointer_Data *pdata; edata = efl_data_scope_get(evas_object_evas_get(eo_obj), EVAS_CANVAS_CLASS); evas_object_hide(eo_obj); @@ -1005,7 +1029,8 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data if ((obj->layer) && (obj->layer->evas)) _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); } - eina_hash_free(obj->pointer_grabs); + EINA_INLIST_FREE(obj->pointer_grabs, pdata) + _evas_object_pointer_grab_del(obj, pdata); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_DEL, NULL, _evas_object_event_new(), NULL); if ((obj->layer) && (obj->layer->evas)) _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); @@ -1671,9 +1696,9 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) if ((!obj->is_smart) || ((obj->map->cur.map) && (obj->map->cur.map->count == 4) && (obj->map->cur.usemap))) { - Eina_Iterator *itr = eina_hash_iterator_data_new(obj->pointer_grabs); Evas_Object_Pointer_Data *obj_pdata; - EINA_ITERATOR_FOREACH(itr, obj_pdata) + + EINA_INLIST_FOREACH(obj->pointer_grabs, obj_pdata) { if (!obj_pdata->mouse_grabbed && evas_object_is_in_output_rect(eo_obj, obj, obj_pdata->evas_pdata->x, @@ -1681,7 +1706,6 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) 1, 1)) _evas_canvas_event_pointer_move_event_dispatch(obj->layer->evas, obj_pdata->evas_pdata, NULL); } - eina_iterator_free(itr); /* this is at odds to handling events when an obj is moved out of the mouse * ore resized out or clipped out. if mouse is grabbed - regardless of * visibility, mouse move events should keep happening and mouse up. diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 77e393dd30..a983b28650 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1093,7 +1093,8 @@ struct _Evas_Object_Protected_State }; struct _Evas_Object_Pointer_Data { - Evas_Object_Protected_Data *obj; + EINA_INLIST; + Evas_Pointer_Data *evas_pdata; Evas_Object_Pointer_Mode pointer_mode; int mouse_grabbed; @@ -1146,7 +1147,7 @@ struct _Evas_Object_Protected_Data const Evas_Object_3D_Data *data_3d; const Evas_Object_Mask_Data *mask; Eina_List *focused_by_seats; - Eina_Hash *pointer_grabs; + Eina_Inlist *pointer_grabs; // Pointer to the Evas_Object itself Evas_Object *object; From f153d4ce0f7a262f23d2ddefcdd031f2e8ff0e4d Mon Sep 17 00:00:00 2001 From: Guilherme Iscaro Date: Mon, 5 Dec 2016 14:48:58 -0200 Subject: [PATCH 2/2] Efl.Canvas.Object: Remove the extra parementer at _evas_object_pointer_data_get() The Evas_Pointer_Data struct already contains a Efl.Input.Device pointer. --- src/lib/evas/canvas/evas_events.c | 77 +++++++++++++------------- src/lib/evas/canvas/evas_object_main.c | 10 ++-- src/lib/evas/include/evas_private.h | 2 +- 3 files changed, 43 insertions(+), 46 deletions(-) diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index 2db8e88132..dbcf713f76 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -438,7 +438,7 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e, Evas_Object_Pointer_Data *obj_pdata; child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -467,7 +467,7 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e, child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); ev->cur = point; - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -527,7 +527,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, EINA_LIST_FOREACH(copy, l, eo_child) { child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -561,7 +561,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, { child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); if (child->delete_me) continue; - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -603,7 +603,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, { child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -647,7 +647,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, EINA_LIST_FOREACH(ins, l, eo_child) { child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -724,7 +724,7 @@ _evas_event_source_mouse_up_events(Evas_Object *eo_obj, Evas *eo_e, if (src->delete_me) break; child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -815,7 +815,7 @@ _evas_event_source_wheel_events(Evas_Object *eo_obj, Evas *eo_e, if (src->delete_me) return; child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -865,7 +865,7 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child) { child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -883,7 +883,7 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi EINA_LIST_FOREACH(copy, l, eo_child) { child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -933,7 +933,7 @@ _evas_event_source_multi_up_events(Evas_Object_Protected_Data *obj, Evas_Public_ child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -995,7 +995,7 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi EINA_LIST_FOREACH(copy, l, eo_child) { child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -1036,7 +1036,7 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi { child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); ev->cur = point; - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -1122,7 +1122,7 @@ _evas_event_source_mouse_in_events(Evas_Object *eo_obj, Evas *eo_e, Evas_Object_Pointer_Data *obj_pdata; child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -1186,7 +1186,7 @@ _evas_event_source_mouse_out_events(Evas_Object *eo_obj, Evas *eo_e, { Evas_Object_Pointer_Data *obj_pdata; child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, child); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -1428,7 +1428,7 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -1453,7 +1453,7 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Pointer_Mode pointer_mode; if (obj->delete_me) continue; - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -1514,7 +1514,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev, Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); if ((!eina_list_data_find(ins, eo_obj)) || (!pdata->inside)) { - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -1552,7 +1552,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev, Evas_Object_Protected_Data *obj_itr = efl_data_scope_get(eo_obj_itr, EFL_CANVAS_OBJECT_CLASS); if (!eina_list_data_find(pdata->object.in, eo_obj_itr)) { - obj_pdata = _evas_object_pointer_data_get(pdata, obj_itr, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj_itr); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -1659,7 +1659,7 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); if (obj->delete_me) continue; - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -1895,7 +1895,7 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe) Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); if (!evas_event_freezes_through(eo_obj, obj)) { - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2015,7 +2015,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da EINA_LIST_FOREACH(copy, l, eo_obj) { obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2065,7 +2065,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da EINA_LIST_FREE(outs, eo_obj) { obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2102,7 +2102,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da { obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); if (!obj) continue; - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2166,7 +2166,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da /* if its not in the old list of ins send an enter event */ if (!eina_list_data_find(pdata->object.in, eo_obj)) { - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2247,7 +2247,7 @@ nogrep: EINA_LIST_FOREACH(lst, l, eo_obj) { obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2310,7 +2310,7 @@ nogrep: /* if its not in the old list of ins send an enter event */ if (!eina_list_data_find(pdata->object.in, eo_obj)) { - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2430,7 +2430,7 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); if (!eina_list_data_find(pdata->object.in, eo_obj)) { - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2507,7 +2507,7 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) Evas_Object_Pointer_Data *obj_pdata; Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); if (obj->delete_me) continue; - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2626,7 +2626,7 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2642,7 +2642,7 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2715,7 +2715,7 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data { Evas_Object_Pointer_Data *obj_pdata; Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2892,7 +2892,7 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -2931,7 +2931,7 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) { ERR("Could not find the object pointer data for device %p", @@ -3598,7 +3598,7 @@ _efl_canvas_object_pointer_mode_by_device_set(Eo *eo_obj, Evas_Object_Protected_ pdata = _evas_pointer_data_by_device_get(obj->layer->evas, dev); if (!pdata) return; - obj_pdata = _evas_object_pointer_data_get(pdata, obj, pdata->pointer); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); EINA_SAFETY_ON_NULL_RETURN(obj_pdata); /* ignore no-ops */ @@ -3647,8 +3647,7 @@ _efl_canvas_object_pointer_mode_by_device_set(Eo *eo_obj, Evas_Object_Protected_ { Evas_Object_Pointer_Data *cobj_pdata; cobj_data = efl_data_scope_get(cobj, EFL_CANVAS_OBJECT_CLASS); - - cobj_pdata = _evas_object_pointer_data_get(pdata, cobj_data, dev); + cobj_pdata = _evas_object_pointer_data_get(pdata, cobj_data); if (!cobj_pdata) continue; if (!cobj_pdata->mouse_grabbed) continue; cobj_pdata->mouse_grabbed -= addgrab; @@ -3679,7 +3678,7 @@ _efl_canvas_object_pointer_mode_by_device_get(Eo *eo_obj EINA_UNUSED, pdata = _evas_pointer_data_by_device_get(obj->layer->evas, dev); EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, EVAS_OBJECT_POINTER_MODE_AUTOGRAB); - obj_pdata = _evas_object_pointer_data_get(pdata, obj, pdata->pointer); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); EINA_SAFETY_ON_NULL_RETURN_VAL(obj_pdata, EVAS_OBJECT_POINTER_MODE_AUTOGRAB); return obj_pdata->pointer_mode; } @@ -3718,7 +3717,7 @@ _efl_canvas_object_pointer_device_in_get(Eo *eo_obj, pdata = _evas_pointer_data_by_device_get(obj->layer->evas, pointer); if (!pdata) return EINA_FALSE; - obj_pdata = _evas_object_pointer_data_get(pdata, obj, pointer); + obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) return EINA_FALSE; if (!obj->is_smart) return obj_pdata->mouse_in; diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 79922850c6..b027998fff 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -127,8 +127,7 @@ _evas_object_pointer_grab_del(Evas_Object_Protected_Data *obj, static Evas_Object_Pointer_Data * _evas_object_pointer_data_add(Evas_Pointer_Data *evas_pdata, - Evas_Object_Protected_Data *obj, - Efl_Input_Device *pointer) + Evas_Object_Protected_Data *obj) { Evas_Object_Pointer_Data *pdata; @@ -138,7 +137,7 @@ _evas_object_pointer_data_add(Evas_Pointer_Data *evas_pdata, pdata->evas_pdata = evas_pdata; obj->pointer_grabs = eina_inlist_append(obj->pointer_grabs, EINA_INLIST_GET(pdata)); - efl_event_callback_priority_add(pointer, EFL_EVENT_DEL, + efl_event_callback_priority_add(evas_pdata->pointer, EFL_EVENT_DEL, EFL_CALLBACK_PRIORITY_BEFORE, _evas_device_del_cb, obj); return pdata; @@ -146,8 +145,7 @@ _evas_object_pointer_data_add(Evas_Pointer_Data *evas_pdata, Evas_Object_Pointer_Data * _evas_object_pointer_data_get(Evas_Pointer_Data *evas_pdata, - Evas_Object_Protected_Data *obj, - Efl_Input_Device *pointer) + Evas_Object_Protected_Data *obj) { Evas_Object_Pointer_Data *pdata; @@ -155,7 +153,7 @@ _evas_object_pointer_data_get(Evas_Pointer_Data *evas_pdata, //The pointer does not exist yet - create one. if (!pdata) - return _evas_object_pointer_data_add(evas_pdata, obj, pointer); + return _evas_object_pointer_data_add(evas_pdata, obj); return pdata; } diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index a983b28650..c038e75ba5 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1600,7 +1600,7 @@ void evas_object_render_pre_clipper_change(Eina_Array *rects, Evas_Object *obj); void evas_object_render_pre_prev_cur_add(Eina_Array *rects, Evas_Object *obj, Evas_Object_Protected_Data *pd); void evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v); void evas_rects_return_difference_rects(Eina_Array *rects, int x, int y, int w, int h, int xx, int yy, int ww, int hh); -Evas_Object_Pointer_Data *_evas_object_pointer_data_get(Evas_Pointer_Data *evas_pdata, Evas_Object_Protected_Data *obj, Efl_Input_Device *pointer); +Evas_Object_Pointer_Data *_evas_object_pointer_data_get(Evas_Pointer_Data *evas_pdata, Evas_Object_Protected_Data *obj); void evas_object_clip_dirty(Evas_Object *obj, Evas_Object_Protected_Data *pd); void evas_object_recalc_clippees(Evas_Object_Protected_Data *pd);