evas_events: fix condition for creating list of clickable objects. 93/290693/2
authorHosang Kim <hosang12.kim@samsung.com>
Fri, 31 Mar 2023 01:21:58 +0000 (10:21 +0900)
committerkim hosang <hosang12.kim@samsung.com>
Mon, 10 Apr 2023 09:24:21 +0000 (09:24 +0000)
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

index 024ef3f..88a094a 100644 (file)
@@ -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)