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
This commit is contained in:
Bruno Dilly 2016-12-13 03:28:50 -02:00
commit 5361cc9e4c
3 changed files with 84 additions and 62 deletions

View File

@ -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;

View File

@ -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.

View File

@ -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);