evas optimization - fix the "start in list middle" case

i missed 1 rare case where we start in the middle of the list and have
to walk to the end. testing didnt show it up. fix. this fixes up that
case in b5ed76ba9f
This commit is contained in:
Carsten Haitzler 2019-06-15 09:38:06 +01:00
parent 297fa2bca0
commit 4c6f875c35
1 changed files with 17 additions and 12 deletions

View File

@ -369,7 +369,8 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
const Eina_Inlist *ilist, const Eina_Inlist *ilist,
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,
Eina_Bool must_walk_last)
{ {
Evas_Object_Protected_Data *obj = NULL; Evas_Object_Protected_Data *obj = NULL;
DDD_STATIC int spaces = 0; DDD_STATIC int spaces = 0;
@ -379,7 +380,11 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
spaces++; spaces++;
if (ilist) if (ilist)
{ {
for (obj = _EINA_INLIST_CONTAINER(obj, ilist->last); Eina_Inlist *last;
if (must_walk_last) last = eina_inlist_last(ilist);
else last = ilist->last;
for (obj = _EINA_INLIST_CONTAINER(obj, last);
obj; obj;
obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev)) obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev))
{ {
@ -500,14 +505,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, 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, EINA_FALSE);
} }
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, 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, EINA_FALSE);
} }
else else
proxy_write->src_event_in = eina_list_append(proxy_write->src_event_in, eo_src); proxy_write->src_event_in = eina_list_append(proxy_write->src_event_in, eo_src);
@ -699,14 +704,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, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
} }
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, ins = _evas_event_object_list_raw_in_get(eo_e, ins, NULL,
evas_object_event_grabber_members_list(eo_src), 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, EINA_FALSE);
} }
else else
ins = eina_list_append(ins, eo_src); ins = eina_list_append(ins, eo_src);
@ -1147,14 +1152,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, (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, EINA_FALSE);
} }
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, (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, EINA_FALSE);
} }
else else
ins = eina_list_append(ins, eo_src); ins = eina_list_append(ins, eo_src);
@ -1233,14 +1238,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, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
} }
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, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE); NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
} }
else else
@ -1358,7 +1363,7 @@ _evas_event_object_list_in_get(Evas *eo_e, Eina_List *in,
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, 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, EINA_FALSE);
} }
static Eina_List * static Eina_List *
@ -2397,7 +2402,7 @@ nogrep:
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_TRUE);
} }
EINA_LIST_FOREACH(copy, l, eo_obj) EINA_LIST_FOREACH(copy, l, eo_obj)