summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Dilly <bdilly@profusion.mobi>2016-12-13 03:28:50 -0200
committerBruno Dilly <bdilly@profusion.mobi>2016-12-13 03:28:50 -0200
commit5361cc9e4c75114c3f8618706baaadd359227339 (patch)
tree28ff1bc566cd26c54af6490becdb356352b5ca70
parentf5a2602189e6d0e35cbfa47a30d1adb8f4984436 (diff)
parentf153d4ce0f7a262f23d2ddefcdd031f2e8ff0e4d (diff)
downloadefl-5361cc9e4c75114c3f8618706baaadd359227339.tar.gz
Merge branch 'devs/iscaro/memory'
This series reduce the memory footprint caused by _evas_object_pointer_data_get() previous implementation. Patches by Guilherme Iscaro <iscaro@profusion.mobi> Reviewed By: bdilly, cedric, jpeg, raster Differential Revision: https://phab.enlightenment.org/D4474
-rw-r--r--src/lib/evas/canvas/evas_events.c77
-rw-r--r--src/lib/evas/canvas/evas_object_main.c62
-rw-r--r--src/lib/evas/include/evas_private.h7
3 files changed, 84 insertions, 62 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 07518b6901..b027998fff 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -81,57 +81,79 @@ _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);
}
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;
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;
- efl_event_callback_priority_add(pointer, EFL_EVENT_DEL,
+ obj->pointer_grabs = eina_inlist_append(obj->pointer_grabs,
+ EINA_INLIST_GET(pdata));
+ efl_event_callback_priority_add(evas_pdata->pointer, EFL_EVENT_DEL,
EFL_CALLBACK_PRIORITY_BEFORE,
_evas_device_del_cb, obj);
- eina_hash_add(obj->pointer_grabs, &pointer, pdata);
return 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;
- 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);
+ return _evas_object_pointer_data_add(evas_pdata, obj);
return pdata;
}
@@ -162,7 +184,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 +1014,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 +1027,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 +1694,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 +1704,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..c038e75ba5 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;
@@ -1599,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);