From 15f3a0ad25f7e93ef10fc743bbe89cb857870046 Mon Sep 17 00:00:00 2001 From: Hosang Kim Date: Fri, 31 Mar 2023 10:21:58 +0900 Subject: [PATCH] evas_events: fix condition for creating list of clickable objects. When object is mapped, it can be clicked even if it is outside the screen. Change-Id: I3391b6a018638ec2bb8fa3c926659f8f49c924da --- src/lib/evas/canvas/evas_events.c | 52 ++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index 024ef3f..88a094a 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -10,7 +10,7 @@ _evas_event_object_list_in_get(Evas *eo_e, Eina_List *in, const Eina_Inlist *ilist, const Eina_List *list, 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 usemap); /* FIXME: use eina_list_clone */ static Eina_List * @@ -141,7 +141,7 @@ clip_calc(Evas_Object_Protected_Data *obj, Eina_Rectangle *c) static Eina_List * _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data *obj, Eina_List *in, Evas_Object *stop, - int x, int y, int *no_rep, Eina_Bool source, int spaces EINA_UNUSED) + int x, int y, int *no_rep, Eina_Bool source, int spaces EINA_UNUSED, Eina_Bool usemap) { Eina_Rectangle c; int inside; @@ -162,9 +162,11 @@ _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data int fw = 0, fh = 0; evas_output_viewport_get(eo_e, &vx, &vy, &vw, &vh); evas_output_framespace_get(eo_e, NULL, NULL, &fw, &fh); - - if ((!RECTS_INTERSECT(x, y, 1, 1, vx, vy, vw - fw, vh - fh)) && (!obj->is_frame)) return in; - // + if (!usemap) + { + if ((!RECTS_INTERSECT(x, y, 1, 1, vx, vy, vw - fw, vh - fh)) && (!obj->is_frame)) return in; + } + // if ((!obj->cur->visible) && (!obj->is_event_parent)) return in; // XXX: this below DYNAMICALLY calculates the current clip rect @@ -309,7 +311,7 @@ _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data stop, obj->cur->geometry.x + obj->map->cur.map->mx, obj->cur->geometry.y + obj->map->cur.map->my, - &norep, source); + &norep, source, EINA_TRUE); } } } @@ -333,7 +335,7 @@ _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data obj->cur->geometry.y + obj->cur->geometry.h >= y)) in = _evas_event_object_list_in_get (eo_e, in, evas_object_smart_members_get_direct(eo_obj), NULL, - stop, x, y, &norep, source); + stop, x, y, &norep, source, usemap); } if (norep) { @@ -350,7 +352,7 @@ _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data int norep = 0; in = _evas_event_object_list_in_get(eo_e, in, NULL, evas_object_event_grabber_members_list(eo_obj), - stop, x, y, &norep, source); + stop, x, y, &norep, source, usemap); if (norep) { if (!obj->repeat_events) @@ -407,7 +409,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in, const Eina_List *list, Evas_Object *stop, int x, int y, int *no_rep, Eina_Bool source, - Eina_Bool must_walk_last) + Eina_Bool must_walk_last, Eina_Bool usemap) { Evas_Object_Protected_Data *obj = NULL; DDD_STATIC int spaces = 0; @@ -426,7 +428,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in, obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev)) { if (obj->events->parent) continue; - in = _evas_event_object_list_raw_in_get_single(eo_e, obj, in, stop, x, y, no_rep, source, spaces); + in = _evas_event_object_list_raw_in_get_single(eo_e, obj, in, stop, x, y, no_rep, source, spaces, usemap); if (*no_rep) goto end; } } @@ -436,7 +438,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in, EINA_LIST_REVERSE_FOREACH(list, l, obj) { - in = _evas_event_object_list_raw_in_get_single(eo_e, obj, in, stop, x, y, no_rep, source, spaces); + in = _evas_event_object_list_raw_in_get_single(eo_e, obj, in, stop, x, y, no_rep, source, spaces, usemap); if (*no_rep) goto end; } } @@ -602,14 +604,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 (eo_e, proxy_write->src_event_in, evas_object_smart_members_get_direct(eo_src), NULL, - NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE); + NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } else if (src->is_event_parent) { proxy_write->src_event_in = _evas_event_object_list_raw_in_get (eo_e, proxy_write->src_event_in, NULL, evas_object_event_grabber_members_list(eo_src), - NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE); + NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } else proxy_write->src_event_in = eina_list_append(proxy_write->src_event_in, eo_src); @@ -818,14 +820,14 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, { int no_rep = 0; 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, EINA_FALSE); + NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } else if (src->is_event_parent) { int no_rep = 0; 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, EINA_FALSE); + NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } else ins = eina_list_append(ins, eo_src); @@ -1140,14 +1142,14 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi int no_rep = 0; ins = _evas_event_object_list_raw_in_get (e->evas, ins, evas_object_smart_members_get_direct(eo_src), NULL, NULL, - ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE); + ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } if (src->is_event_parent) { int no_rep = 0; ins = _evas_event_object_list_raw_in_get (e->evas, ins, NULL, evas_object_event_grabber_members_list(eo_src), NULL, - ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE); + ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } else ins = eina_list_append(ins, eo_src); @@ -1332,14 +1334,14 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi int no_rep = 0; 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, EINA_FALSE); + ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } if (src->is_event_parent) { int no_rep = 0; 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, EINA_FALSE); + ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } else ins = eina_list_append(ins, eo_src); @@ -1430,14 +1432,14 @@ _evas_event_source_mouse_in_events(Evas_Object *eo_obj, Evas *eo_e, { int no_rep = 0; 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, EINA_FALSE); + NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } else if (src->is_event_parent) { int no_rep = 0; 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, EINA_FALSE); + NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE, EINA_FALSE); } else @@ -1571,10 +1573,10 @@ _evas_event_object_list_in_get(Evas *eo_e, Eina_List *in, const Eina_Inlist *ilist, const Eina_List *list, 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 usemap) { return _evas_event_object_list_raw_in_get(eo_e, in, ilist, list, stop, x, y, - no_rep, source, EINA_FALSE); + no_rep, source, EINA_FALSE, usemap); } static Eina_List * @@ -1593,7 +1595,7 @@ _evas_event_objects_event_list_no_frozen_check(Evas *eo_e, Evas_Object *stop, in D("############################# check layer %i\n", lay->layer); in = _evas_event_object_list_in_get(eo_e, in, EINA_INLIST_GET(lay->objects), NULL, - stop, x, y, &no_rep, EINA_FALSE); + stop, x, y, &no_rep, EINA_FALSE, EINA_FALSE); if (no_rep) return in; } return in; @@ -2790,7 +2792,7 @@ nogrep: ins = _evas_event_object_list_raw_in_get(eo_e, NULL, EINA_INLIST_GET(below_obj), NULL, NULL, pdata->seat->x, pdata->seat->y, - &norep, EINA_FALSE, EINA_TRUE); + &norep, EINA_FALSE, EINA_TRUE, EINA_FALSE); } EINA_LIST_FOREACH(copy, l, eo_obj) -- 2.7.4