evas event handling - fix incorrect object reporting

this fixes event reporting for mouse in/out/move/down/up due to evas
just totally getting tese objects wrong.

this fixes T3718

@fix
This commit is contained in:
Carsten Haitzler 2016-07-05 15:40:12 +09:00
parent f955a20c02
commit 9f0fd66ab8
2 changed files with 39 additions and 31 deletions

View File

@ -144,7 +144,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
int inside; int inside;
if (!list) return in; if (!list) return in;
for (obj = _EINA_INLIST_CONTAINER(obj, list); for (obj = _EINA_INLIST_CONTAINER(obj, eina_inlist_last(list));
obj; obj;
obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev)) obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev))
{ {
@ -154,6 +154,15 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
*no_rep = 1; *no_rep = 1;
return in; return in;
} }
evas_object_clip_recalc(obj);
if ((!RECTS_INTERSECT(x, y, 1, 1,
obj->cur->cache.clip.x,
obj->cur->cache.clip.y,
obj->cur->cache.clip.w,
obj->cur->cache.clip.h)))
continue;
if (!source) if (!source)
{ {
if (evas_event_passes_through(eo_obj, obj)) continue; if (evas_event_passes_through(eo_obj, obj)) continue;
@ -989,7 +998,6 @@ _evas_event_object_list_in_get(Evas *eo_e, Eina_List *in,
const Eina_Inlist *list, Evas_Object *stop, const Eina_Inlist *list, Evas_Object *stop,
int x, int y, int *no_rep, Eina_Bool source) int x, int y, int *no_rep, Eina_Bool source)
{ {
if (!list) return NULL;
return _evas_event_object_list_raw_in_get(eo_e, in, list->last, stop, x, y, return _evas_event_object_list_raw_in_get(eo_e, in, list->last, stop, x, y,
no_rep, source); no_rep, source);
} }

View File

@ -1188,7 +1188,6 @@ evas_object_update_bounding_box(Evas_Object *eo_obj, Evas_Object_Protected_Data
if (noclip && x + w > smart_parent->cur.bounding_box.x + smart_parent->cur.bounding_box.w) if (noclip && x + w > smart_parent->cur.bounding_box.x + smart_parent->cur.bounding_box.w)
{ {
smart_parent->cur.bounding_box.w = x + w - smart_parent->cur.bounding_box.x; smart_parent->cur.bounding_box.w = x + w - smart_parent->cur.bounding_box.x;
propagate = EINA_TRUE; propagate = EINA_TRUE;
} }
else if ((px + pw == smart_parent->prev.bounding_box.x + smart_parent->prev.bounding_box.w && else if ((px + pw == smart_parent->prev.bounding_box.x + smart_parent->prev.bounding_box.w &&
@ -1413,6 +1412,7 @@ evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected
if (o == obj) continue ; if (o == obj) continue ;
if (o->clip.clipees || o->is_static_clip) continue ; if (o->clip.clipees || o->is_static_clip) continue ;
if (!o->cur->visible) continue;
if (o->is_smart) if (o->is_smart)
{ {
@ -1422,15 +1422,15 @@ evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected
tx = s->cur.bounding_box.x; tx = s->cur.bounding_box.x;
ty = s->cur.bounding_box.y; ty = s->cur.bounding_box.y;
tw = s->cur.bounding_box.x + s->cur.bounding_box.w; tw = tx + s->cur.bounding_box.w;
th = s->cur.bounding_box.y + s->cur.bounding_box.h; th = ty + s->cur.bounding_box.h;
} }
else else
{ {
tx = o->cur->geometry.x; tx = o->cur->geometry.x;
ty = o->cur->geometry.y; ty = o->cur->geometry.y;
tw = o->cur->geometry.x + o->cur->geometry.w; tw = tx + o->cur->geometry.w;
th = o->cur->geometry.y + o->cur->geometry.h; th = ty + o->cur->geometry.h;
} }
if (tx < minx) minx = tx; if (tx < minx) minx = tx;