evas: use Eina_List instead of Eina_CList for event grabber.

Eina_Clist can actually change the pointer in the cell next bypassing
the CoW infrastructure leading to trouble. Considering the case here,
using the optimization of Eina_Clist is not necessary and if performance
issue arise, can be fixed by using a dichotomic search when removing
data. I don't think it is necessary to add this complexity without
a real life case.
This commit is contained in:
Cedric BAIL 2017-06-14 12:42:25 -07:00
parent b312729109
commit 0516cdc0f9
4 changed files with 90 additions and 133 deletions

View File

@ -10,7 +10,8 @@
struct _Efl_Object_Event_Grabber_Data struct _Efl_Object_Event_Grabber_Data
{ {
Eo *rect; Eo *rect;
Eina_Clist contained; Eina_List *contained;
Eina_Bool vis : 1; Eina_Bool vis : 1;
}; };
@ -18,35 +19,25 @@ typedef struct Efl_Object_Event_Grabber_Iterator
{ {
Eina_Iterator iterator; Eina_Iterator iterator;
Eina_Clist *head; Eina_Iterator *itl;
Eina_Clist *current;
Eo *parent; Eo *parent;
} Efl_Object_Event_Grabber_Iterator; } Efl_Object_Event_Grabber_Iterator;
static Eina_Bool static Eina_Bool
_efl_canvas_object_event_grabber_efl_canvas_group_group_iterator_next(Efl_Object_Event_Grabber_Iterator *it, void **data) _efl_canvas_group_group_iterator_next(Efl_Object_Event_Grabber_Iterator *it, void **data)
{ {
Evas_Object_Protected_Data *obj; return eina_iterator_next(it->itl, data);
if (!eina_clist_next(it->head, it->current)) return EINA_FALSE;
obj = EINA_CLIST_ENTRY(eina_clist_head(it->current), Evas_Object_Protected_Data, events->event.member);
if (data) *data = obj->object;
it->current = eina_clist_next(it->head, it->current);
return EINA_TRUE;
} }
static Evas_Object * static Evas_Object *
_efl_canvas_object_event_grabber_efl_canvas_group_group_iterator_get_container(Efl_Object_Event_Grabber_Iterator *it) _efl_canvas_group_group_iterator_get_container(Efl_Object_Event_Grabber_Iterator *it)
{ {
return it->parent; return it->parent;
} }
static void static void
_efl_canvas_object_event_grabber_efl_canvas_group_group_iterator_free(Efl_Object_Event_Grabber_Iterator *it) _efl_canvas_group_group_iterator_free(Efl_Object_Event_Grabber_Iterator *it)
{ {
efl_unref(it->parent); efl_unref(it->parent);
free(it); free(it);
@ -57,18 +48,18 @@ _efl_canvas_object_event_grabber_efl_canvas_group_group_children_iterate(const E
{ {
Efl_Object_Event_Grabber_Iterator *it; Efl_Object_Event_Grabber_Iterator *it;
if (eina_clist_empty(&pd->contained)) return NULL; if (!pd->contained) return NULL;
it = calloc(1, sizeof(Efl_Object_Event_Grabber_Iterator)); it = calloc(1, sizeof(Efl_Object_Event_Grabber_Iterator));
if (!it) return NULL; if (!it) return NULL;
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR); EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
it->parent = efl_ref(eo_obj); it->parent = efl_ref(eo_obj);
it->head = it->current = &pd->contained; it->itl = eina_list_iterator_new(pd->contained);
it->iterator.next = FUNC_ITERATOR_NEXT(_efl_canvas_object_event_grabber_efl_canvas_group_group_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(_efl_canvas_group_group_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_efl_canvas_object_event_grabber_efl_canvas_group_group_iterator_get_container); it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_efl_canvas_group_group_iterator_get_container);
it->iterator.free = FUNC_ITERATOR_FREE(_efl_canvas_object_event_grabber_efl_canvas_group_group_iterator_free); it->iterator.free = FUNC_ITERATOR_FREE(_efl_canvas_group_group_iterator_free);
return &it->iterator; return &it->iterator;
} }
@ -99,60 +90,42 @@ _stacking_verify(Efl_Object_Event_Grabber_Data *pd, Evas_Object_Protected_Data *
} }
} }
static void
_child_add_after(Evas_Object_Protected_Data *a, Evas_Object_Events_Data *events)
{
EINA_COW_WRITE_BEGIN(evas_object_events_cow, a->events, Evas_Object_Events_Data, evs)
eina_clist_add_after(&evs->event.member, &events->event.member);
EINA_COW_WRITE_END(evas_object_events_cow, a->events, evs);
}
static void static void
_child_insert(Efl_Object_Event_Grabber_Data *pd, Evas_Object_Protected_Data *obj) _child_insert(Efl_Object_Event_Grabber_Data *pd, Evas_Object_Protected_Data *obj)
{ {
Evas_Object_Protected_Data *a, *i; Evas_Object_Protected_Data *a, *i;
Eina_List *l;
if (eina_clist_empty(&pd->contained)) Eina_Bool found = EINA_FALSE;
{
/* pd->rect case */
EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events)
eina_clist_add_head(&pd->contained, &events->event.member);
EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events);
return;
}
if (pd->vis) _stacking_verify(pd, obj); if (pd->vis) _stacking_verify(pd, obj);
EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events)
EINA_LIST_REVERSE_FOREACH(pd->contained, l, a)
{ {
EINA_CLIST_FOR_EACH_ENTRY_REV(a, &pd->contained, Evas_Object_Protected_Data, events->event.member) if (a->object == pd->rect)
{ {
if (a->object == pd->rect) found = EINA_TRUE;
break;
}
if (a->layer->layer > obj->layer->layer) continue;
if (a->layer->layer < obj->layer->layer)
{
found = EINA_TRUE;
break;
}
EINA_INLIST_FOREACH(EINA_INLIST_GET(a->layer->objects), i)
{
if (a == i || obj == i)
{ {
_child_add_after(a, events); found = EINA_TRUE;
return; break;
}
if (a->layer->layer > obj->layer->layer) continue;
if (a->layer->layer < obj->layer->layer)
{
_child_add_after(a, events);
return;
}
EINA_INLIST_FOREACH(EINA_INLIST_GET(a->layer->objects), i)
{
if (a == i)
{
_child_add_after(a, events);
return;
}
if (obj == i)
{
_child_add_after(a, events);
return;
}
} }
} }
} }
EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events);
if (found)
pd->contained = eina_list_append_relative(pd->contained, obj, a);
else
pd->contained = eina_list_prepend(pd->contained, obj);
} }
static void static void
@ -161,10 +134,7 @@ _efl_canvas_object_event_grabber_child_restack(void *data, const Efl_Event *even
Efl_Object_Event_Grabber_Data *pd = data; Efl_Object_Event_Grabber_Data *pd = data;
Evas_Object_Protected_Data *obj = efl_data_scope_get(event->object, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(event->object, EFL_CANVAS_OBJECT_CLASS);
EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events) pd->contained = eina_list_remove(pd->contained, obj);
eina_clist_remove(&events->event.member);
EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events);
_child_insert(pd, obj); _child_insert(pd, obj);
} }
@ -214,11 +184,11 @@ _efl_canvas_object_event_grabber_efl_canvas_group_group_member_add(Eo *eo_obj, E
return; return;
} }
} }
if (obj->events->event.parent == eo_obj) return; if (obj->events->parent == eo_obj) return;
if (obj->smart.parent || obj->events->event.parent) evas_object_smart_member_del(member); if (obj->smart.parent || obj->events->parent) evas_object_smart_member_del(member);
EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events) EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events)
events->event.parent = eo_obj; events->parent = eo_obj;
EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events);
_child_insert(pd, obj); _child_insert(pd, obj);
efl_event_callback_add(member, EFL_EVENT_DEL, _efl_canvas_object_event_grabber_child_del, pd); efl_event_callback_add(member, EFL_EVENT_DEL, _efl_canvas_object_event_grabber_child_del, pd);
@ -227,17 +197,16 @@ _efl_canvas_object_event_grabber_efl_canvas_group_group_member_add(Eo *eo_obj, E
} }
EOLIAN static void EOLIAN static void
_efl_canvas_object_event_grabber_efl_canvas_group_group_member_del(Eo *eo_obj EINA_UNUSED, Efl_Object_Event_Grabber_Data *pd EINA_UNUSED, Eo *member) _efl_canvas_object_event_grabber_efl_canvas_group_group_member_del(Eo *eo_obj EINA_UNUSED, Efl_Object_Event_Grabber_Data *pd, Eo *member)
{ {
Evas_Object_Protected_Data *obj = efl_data_scope_get(member, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(member, EFL_CANVAS_OBJECT_CLASS);
efl_event_callback_del(member, EFL_EVENT_DEL, _efl_canvas_object_event_grabber_child_del, pd); efl_event_callback_del(member, EFL_EVENT_DEL, _efl_canvas_object_event_grabber_child_del, pd);
efl_event_callback_del(member, EFL_GFX_EVENT_RESTACK, _efl_canvas_object_event_grabber_child_restack, pd); efl_event_callback_del(member, EFL_GFX_EVENT_RESTACK, _efl_canvas_object_event_grabber_child_restack, pd);
pd->contained = eina_list_remove(pd->contained, obj);
EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events) EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events)
{ events->parent = NULL;
eina_clist_remove(&events->event.member);
events->event.parent = NULL;
}
EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events);
} }
@ -285,8 +254,9 @@ _efl_canvas_object_event_grabber_efl_gfx_visible_set(Eo *eo_obj EINA_UNUSED, Efl
if (set) if (set)
{ {
Evas_Object_Protected_Data *obj; Evas_Object_Protected_Data *obj;
Eina_List *l;
EINA_CLIST_FOR_EACH_ENTRY(obj, &pd->contained, Evas_Object_Protected_Data, events->event.member) EINA_LIST_FOREACH(pd->contained, l, obj)
if (obj->object != pd->rect) _stacking_verify(pd, obj); if (obj->object != pd->rect) _stacking_verify(pd, obj);
} }
pd->vis = !!set; pd->vis = !!set;
@ -303,21 +273,25 @@ _efl_canvas_object_event_grabber_efl_gfx_stack_layer_set(Eo *eo_obj, Efl_Object_
static void static void
_efl_canvas_object_event_grabber_restack(void *data, const Efl_Event *event) _efl_canvas_object_event_grabber_restack(void *data, const Efl_Event *event)
{ {
Evas_Object_Protected_Data *obj;
Efl_Object_Event_Grabber_Data *pd = data; Efl_Object_Event_Grabber_Data *pd = data;
Evas_Object_Protected_Data *root = NULL;
Eina_List *list = NULL; Eina_List *list = NULL;
Evas_Object_Protected_Data *obj, *nobj;
evas_object_layer_set(pd->rect, evas_object_layer_get(event->object)); evas_object_layer_set(pd->rect, evas_object_layer_get(event->object));
evas_object_stack_below(pd->rect, event->object); evas_object_stack_below(pd->rect, event->object);
EINA_CLIST_FOR_EACH_ENTRY_SAFE(obj, nobj, &pd->contained, Evas_Object_Protected_Data, events->event.member) EINA_LIST_FREE(pd->contained, obj)
{ {
if (obj->object == pd->rect) continue; if (obj->object == pd->rect)
{
root = obj;
continue;
}
list = eina_list_append(list, obj); list = eina_list_append(list, obj);
EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events)
eina_clist_remove(&events->event.member);
EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events);
} }
pd->contained = eina_list_append(pd->contained, root);
EINA_LIST_FREE(list, obj) EINA_LIST_FREE(list, obj)
_child_insert(pd, obj); _child_insert(pd, obj);
} }
@ -332,7 +306,7 @@ _efl_canvas_object_event_grabber_efl_object_constructor(Eo *eo_obj, Efl_Object_E
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
obj->is_event_parent = 1; obj->is_event_parent = 1;
obj->is_smart = 0; obj->is_smart = 0;
eina_clist_init(&pd->contained);
efl_event_callback_add(eo_obj, EFL_GFX_EVENT_RESTACK, _efl_canvas_object_event_grabber_restack, pd); efl_event_callback_add(eo_obj, EFL_GFX_EVENT_RESTACK, _efl_canvas_object_event_grabber_restack, pd);
pd->rect = evas_object_rectangle_add(efl_parent_get(eo_obj)); pd->rect = evas_object_rectangle_add(efl_parent_get(eo_obj));
evas_object_pointer_mode_set(pd->rect, EVAS_OBJECT_POINTER_MODE_NOGRAB); evas_object_pointer_mode_set(pd->rect, EVAS_OBJECT_POINTER_MODE_NOGRAB);
@ -345,8 +319,10 @@ _efl_canvas_object_event_grabber_efl_object_constructor(Eo *eo_obj, Efl_Object_E
EOLIAN static void EOLIAN static void
_efl_canvas_object_event_grabber_efl_object_destructor(Eo *eo_obj, Efl_Object_Event_Grabber_Data *pd) _efl_canvas_object_event_grabber_efl_object_destructor(Eo *eo_obj, Efl_Object_Event_Grabber_Data *pd)
{ {
Evas_Object_Protected_Data *obj, *nobj; Evas_Object_Protected_Data *obj;
EINA_CLIST_FOR_EACH_ENTRY_SAFE(obj, nobj, &pd->contained, Evas_Object_Protected_Data, events->event.member) Eina_List *l, *ln;
EINA_LIST_FOREACH_SAFE(pd->contained, l, ln, obj)
efl_canvas_group_member_del(eo_obj, obj->object); efl_canvas_group_member_del(eo_obj, obj->object);
efl_canvas_group_del(eo_obj); efl_canvas_group_del(eo_obj);
efl_destructor(efl_super(eo_obj, MY_CLASS)); efl_destructor(efl_super(eo_obj, MY_CLASS));
@ -358,11 +334,11 @@ _efl_canvas_object_event_grabber_class_constructor(Efl_Class *klass)
evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass); evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
} }
const Eina_Clist * const Eina_List *
evas_object_event_grabber_members_list(const Eo *eo_obj) evas_object_event_grabber_members_list(const Eo *eo_obj)
{ {
Efl_Object_Event_Grabber_Data *pd = efl_data_scope_get(eo_obj, MY_CLASS); Efl_Object_Event_Grabber_Data *pd = efl_data_scope_get(eo_obj, MY_CLASS);
return &pd->contained; return pd->contained;
} }
EAPI Evas_Object * EAPI Evas_Object *

View File

@ -436,13 +436,13 @@ evas_object_event_callback_call(Evas_Object *eo_obj, Evas_Object_Protected_Data
nothing_here: nothing_here:
if (!obj->no_propagate) if (!obj->no_propagate)
{ {
if ((obj->smart.parent || obj->events->event.parent) && (type != EVAS_CALLBACK_FREE) && if ((obj->smart.parent || obj->events->parent) && (type != EVAS_CALLBACK_FREE) &&
(type <= EVAS_CALLBACK_KEY_UP)) (type <= EVAS_CALLBACK_KEY_UP))
{ {
Evas_Object_Protected_Data *parent_obj; Evas_Object_Protected_Data *parent_obj;
Eo *parent; Eo *parent;
parent = obj->events->event.parent ?: obj->smart.parent; parent = obj->events->parent ?: obj->smart.parent;
parent_obj = efl_data_scope_get(parent, EFL_CANVAS_OBJECT_CLASS); parent_obj = efl_data_scope_get(parent, EFL_CANVAS_OBJECT_CLASS);
evas_object_event_callback_call(parent, parent_obj, type, event_info, event_id, efl_event_desc); evas_object_event_callback_call(parent, parent_obj, type, event_info, event_id, efl_event_desc);
} }

View File

@ -10,8 +10,7 @@ int _evas_event_counter = 0;
static Eina_List * static Eina_List *
_evas_event_object_list_in_get(Evas *eo_e, Eina_List *in, _evas_event_object_list_in_get(Evas *eo_e, Eina_List *in,
const Eina_Inlist *list, const Eina_Inlist *ilist,
const Eina_Clist *clist,
const Eina_List *list, const Eina_List *list,
Evas_Object *stop, Evas_Object *stop,
int x, int y, int *no_rep, Eina_Bool source); int x, int y, int *no_rep, Eina_Bool source);
@ -263,7 +262,6 @@ _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data
(eo_e, in, (eo_e, in,
evas_object_smart_members_get_direct(eo_obj), evas_object_smart_members_get_direct(eo_obj),
NULL, NULL,
NULL,
stop, stop,
obj->cur->geometry.x + obj->map->cur.map->mx, obj->cur->geometry.x + obj->map->cur.map->mx,
obj->cur->geometry.y + obj->map->cur.map->my, obj->cur->geometry.y + obj->map->cur.map->my,
@ -290,7 +288,7 @@ _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data
obj->cur->geometry.y <= y && obj->cur->geometry.y <= y &&
obj->cur->geometry.y + obj->cur->geometry.h >= y)) obj->cur->geometry.y + obj->cur->geometry.h >= y))
in = _evas_event_object_list_in_get in = _evas_event_object_list_in_get
(eo_e, in, evas_object_smart_members_get_direct(eo_obj), NULL, NULL, (eo_e, in, evas_object_smart_members_get_direct(eo_obj), NULL,
stop, x, y, &norep, source); stop, x, y, &norep, source);
} }
if (norep) if (norep)
@ -310,7 +308,7 @@ _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data
{ {
int norep = 0; int norep = 0;
in = _evas_event_object_list_in_get(eo_e, in, in = _evas_event_object_list_in_get(eo_e, in,
NULL, evas_object_event_grabber_members_list(eo_obj), NULL, NULL, evas_object_event_grabber_members_list(eo_obj),
stop, x, y, &norep, source); stop, x, y, &norep, source);
if (norep) if (norep)
{ {
@ -372,19 +370,17 @@ _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data
static Eina_List * static Eina_List *
_evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in, _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
const Eina_Inlist *ilist, const Eina_Inlist *ilist,
const Eina_Clist *clist,
const Eina_List *list, const Eina_List *list,
Evas_Object *stop, Evas_Object *stop,
int x, int y, int *no_rep, Eina_Bool source) int x, int y, int *no_rep, Eina_Bool source)
{ {
Evas_Object_Protected_Data *obj = NULL; Evas_Object_Protected_Data *obj = NULL;
Evas_Object_Protected_Data *nobj;
#ifdef DDD_DO #ifdef DDD_DO
static int spaces = 0; static int spaces = 0;
#endif #endif
if ((!ilist) && (!clist) && (!list)) return in; if ((!ilist) && (!list)) return in;
#ifdef DDD_DO #ifdef DDD_DO
spaces++; spaces++;
#endif #endif
@ -394,19 +390,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
obj; obj;
obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev)) obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev))
{ {
if (obj->events->event.parent) continue; if (obj->events->parent) continue;
in = _evas_event_object_list_raw_in_get_single(eo_e, obj, in, stop, x, y, no_rep, source
#ifdef DDD_DO
,&spaces
#endif
);
if (*no_rep) return in;
}
}
else if (clist)
{
EINA_CLIST_FOR_EACH_ENTRY_SAFE_REV(obj, nobj, clist, Evas_Object_Protected_Data, events->event.member)
{
in = _evas_event_object_list_raw_in_get_single(eo_e, obj, in, stop, x, y, no_rep, source in = _evas_event_object_list_raw_in_get_single(eo_e, obj, in, stop, x, y, no_rep, source
#ifdef DDD_DO #ifdef DDD_DO
,&spaces ,&spaces
@ -512,14 +496,14 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e,
{ {
proxy_write->src_event_in = _evas_event_object_list_raw_in_get proxy_write->src_event_in = _evas_event_object_list_raw_in_get
(eo_e, proxy_write->src_event_in, (eo_e, proxy_write->src_event_in,
evas_object_smart_members_get_direct(eo_src), NULL, NULL, evas_object_smart_members_get_direct(eo_src), NULL,
NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
} }
else if (src->is_event_parent) else if (src->is_event_parent)
{ {
proxy_write->src_event_in = _evas_event_object_list_raw_in_get proxy_write->src_event_in = _evas_event_object_list_raw_in_get
(eo_e, proxy_write->src_event_in, (eo_e, proxy_write->src_event_in,
NULL, evas_object_event_grabber_members_list(eo_src), NULL, NULL, evas_object_event_grabber_members_list(eo_src),
NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
} }
else else
@ -696,13 +680,14 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
{ {
int no_rep = 0; int no_rep = 0;
ins = _evas_event_object_list_raw_in_get(eo_e, ins, evas_object_smart_members_get_direct(eo_src), ins = _evas_event_object_list_raw_in_get(eo_e, ins, evas_object_smart_members_get_direct(eo_src),
NULL, NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
} }
else if (src->is_event_parent) else if (src->is_event_parent)
{ {
int no_rep = 0; int no_rep = 0;
ins = _evas_event_object_list_raw_in_get(eo_e, ins, NULL, evas_object_event_grabber_members_list(eo_src), ins = _evas_event_object_list_raw_in_get(eo_e, ins, NULL,
NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); evas_object_event_grabber_members_list(eo_src),
NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
} }
else else
ins = eina_list_append(ins, eo_src); ins = eina_list_append(ins, eo_src);
@ -1143,14 +1128,14 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi
{ {
int no_rep = 0; int no_rep = 0;
ins = _evas_event_object_list_raw_in_get ins = _evas_event_object_list_raw_in_get
(eo_e, ins, evas_object_smart_members_get_direct(eo_src), NULL, NULL, NULL, (eo_e, ins, evas_object_smart_members_get_direct(eo_src), NULL, NULL,
ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
} }
if (src->is_event_parent) if (src->is_event_parent)
{ {
int no_rep = 0; int no_rep = 0;
ins = _evas_event_object_list_raw_in_get ins = _evas_event_object_list_raw_in_get
(eo_e, ins, NULL, evas_object_event_grabber_members_list(eo_src), NULL, NULL, (eo_e, ins, NULL, evas_object_event_grabber_members_list(eo_src), NULL,
ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
} }
else else
@ -1236,14 +1221,14 @@ _evas_event_source_mouse_in_events(Evas_Object *eo_obj, Evas *eo_e,
{ {
int no_rep = 0; int no_rep = 0;
ins = _evas_event_object_list_raw_in_get(eo_e, ins, evas_object_smart_members_get_direct(eo_src), ins = _evas_event_object_list_raw_in_get(eo_e, ins, evas_object_smart_members_get_direct(eo_src),
NULL, NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
} }
else if (src->is_event_parent) else if (src->is_event_parent)
{ {
int no_rep = 0; int no_rep = 0;
ins = _evas_event_object_list_raw_in_get(eo_e, ins, NULL, evas_object_event_grabber_members_list(eo_src), ins = _evas_event_object_list_raw_in_get(eo_e, ins, NULL, evas_object_event_grabber_members_list(eo_src),
NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
} }
else else
@ -1348,12 +1333,11 @@ _evas_event_source_mouse_out_events(Evas_Object *eo_obj, Evas *eo_e,
static Eina_List * static Eina_List *
_evas_event_object_list_in_get(Evas *eo_e, Eina_List *in, _evas_event_object_list_in_get(Evas *eo_e, Eina_List *in,
const Eina_Inlist *ilist, const Eina_Inlist *ilist,
const Eina_Clist *clist,
const Eina_List *list, const Eina_List *list,
Evas_Object *stop, Evas_Object *stop,
int x, int y, int *no_rep, Eina_Bool source) int x, int y, int *no_rep, Eina_Bool source)
{ {
return _evas_event_object_list_raw_in_get(eo_e, in, ilist, clist, list, stop, x, y, return _evas_event_object_list_raw_in_get(eo_e, in, ilist, list, stop, x, y,
no_rep, source); no_rep, source);
} }
@ -1372,7 +1356,7 @@ _evas_event_objects_event_list_no_frozen_check(Evas *eo_e, Evas_Object *stop, in
int no_rep = 0; int no_rep = 0;
D("############################# check layer %i\n", lay->layer); D("############################# check layer %i\n", lay->layer);
in = _evas_event_object_list_in_get(eo_e, in, in = _evas_event_object_list_in_get(eo_e, in,
EINA_INLIST_GET(lay->objects), NULL, NULL, EINA_INLIST_GET(lay->objects), NULL,
stop, x, y, &no_rep, EINA_FALSE); stop, x, y, &no_rep, EINA_FALSE);
if (no_rep) return in; if (no_rep) return in;
} }
@ -2367,9 +2351,9 @@ nogrep:
Evas_Object_Protected_Data *below_obj = efl_data_scope_get(eo_below_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *below_obj = efl_data_scope_get(eo_below_obj, EFL_CANVAS_OBJECT_CLASS);
int norep = 0; int norep = 0;
ins = _evas_event_object_list_raw_in_get(eo_e, NULL, ins = _evas_event_object_list_raw_in_get(eo_e, NULL,
EINA_INLIST_GET(below_obj), NULL, NULL, EINA_INLIST_GET(below_obj), NULL, NULL,
pdata->seat->x, pdata->seat->y, pdata->seat->x, pdata->seat->y,
&norep, EINA_FALSE); &norep, EINA_FALSE);
} }
EINA_LIST_FOREACH(copy, l, eo_obj) EINA_LIST_FOREACH(copy, l, eo_obj)

View File

@ -1099,15 +1099,12 @@ struct _Evas_Object_Events_Data
The list below contain the seats (Efl.Input.Devices) which this The list below contain the seats (Efl.Input.Devices) which this
object allows events to be reported (Mouse, Keybord and focus events). object allows events to be reported (Mouse, Keybord and focus events).
*/ */
Eina_List *events_whitelist; Eina_List *events_whitelist;
Eina_List *focused_by_seats; Eina_List *focused_by_seats;
Eina_Inlist *pointer_grabs; Eina_Inlist *pointer_grabs;
struct { Evas_Object *parent;
Evas_Object *parent;
Eina_Clist member;
} event;
}; };
struct _Evas_Object_Protected_State struct _Evas_Object_Protected_State
@ -1703,7 +1700,7 @@ void evas_object_smart_render_cache_clear(Evas_Object *eo_obj);
void *evas_object_smart_render_cache_get(const Evas_Object *eo_obj); void *evas_object_smart_render_cache_get(const Evas_Object *eo_obj);
void evas_object_smart_render_cache_set(Evas_Object *eo_obj, void *data); void evas_object_smart_render_cache_set(Evas_Object *eo_obj, void *data);
const Eina_Clist *evas_object_event_grabber_members_list(const Eo *eo_obj); const Eina_List *evas_object_event_grabber_members_list(const Eo *eo_obj);
const Eina_Inlist *evas_object_smart_members_get_direct(const Evas_Object *obj); const Eina_Inlist *evas_object_smart_members_get_direct(const Evas_Object *obj);
void _efl_canvas_group_group_members_all_del(Evas_Object *eo_obj); void _efl_canvas_group_group_members_all_del(Evas_Object *eo_obj);