evas_object_smart: Set child_has_map flag to parent when parent is set 22/271622/1
authorJaehyun Cho <jae_hyun.cho@samsung.com>
Wed, 23 Feb 2022 12:16:35 +0000 (21:16 +0900)
committerJaehyun Cho <jae_hyun.cho@samsung.com>
Wed, 23 Feb 2022 12:16:35 +0000 (21:16 +0900)
Previously, parent's child_has_map flag was set only when
evas_object_map_enable_set was called for its child.

This causes an issue that mouse touch may not be caught by the parent.
Because the parent's child_has_map is supposed to be true but it is
actually false.
So the bounding_box of the parent may not be updated properly but mouse
touch is checked by the intersection of the bounding_box since
child_has_map flag is false.

Now, parent's child_has_map flag is set when parent is set.
So child_has_map flag is set to parent and mouse touch is caught
correctly.

Change-Id: I2ed8e57e3a929a6d37f65c319e4306d58f4d88e0

src/lib/evas/canvas/evas_map.c
src/lib/evas/canvas/evas_object_smart.c
src/lib/evas/include/evas_private.h

index e7423ac..61d85e4 100644 (file)
@@ -450,6 +450,22 @@ _evas_object_map_parent_check(Evas_Object *eo_parent)
 }
 #endif
 
+// TIZEN_ONLY(20220223): Set child_has_map flag to parent when parent is set
+void
+_evas_object_parent_child_has_map_set(Evas_Object_Protected_Data *obj)
+{
+   Evas_Object *eo_parents;
+   Evas_Object_Protected_Data *parents = NULL;
+
+   for (eo_parents = obj->smart.parent; eo_parents; eo_parents = parents->smart.parent)
+     {
+        parents = efl_data_scope_get(eo_parents, EFL_CANVAS_OBJECT_CLASS);
+        if (!parents) break;
+        parents->child_has_map = EINA_TRUE;
+     }
+}
+//
+
 void
 _evas_object_map_enable_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
                             Eina_Bool enabled)
@@ -502,14 +518,10 @@ _evas_object_map_enable_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
 
    if (enabled)
      {
-        Evas_Object *eo_parents;
-        Evas_Object_Protected_Data *parents = NULL;
-        for (eo_parents = obj->smart.parent; eo_parents; eo_parents = parents->smart.parent)
-          {
-             parents = efl_data_scope_get(eo_parents, EFL_CANVAS_OBJECT_CLASS);
-             if (!parents) break;
-             parents->child_has_map = EINA_TRUE;
-          }
+        // TIZEN_ONLY(20220223): Set child_has_map flag to parent when parent is set
+        // Update parent's child_has_map flag
+        _evas_object_parent_child_has_map_set(obj);
+        //
         evas_object_update_bounding_box(eo_obj, obj, NULL);
      }
    else
index 406f5ed..43ac159 100644 (file)
@@ -342,6 +342,12 @@ _efl_canvas_group_group_member_add(Eo *smart_obj, Evas_Smart_Data *o, Evas_Objec
    evas_object_update_bounding_box(eo_obj, obj, member_o);
    if (o->cb_member_added)
      efl_event_callback_call(smart_obj, EFL_CANVAS_GROUP_EVENT_MEMBER_ADDED, eo_obj);
+
+   // TIZEN_ONLY(20220223): Set child_has_map flag to parent when parent is set
+   // Update parent's child_has_map flag if it is necessary
+   if (obj->child_has_map || (obj->map && obj->map->cur.usemap))
+     _evas_object_parent_child_has_map_set(obj);
+   //
 }
 
 EAPI void
index a824517..e26e3f2 100755 (executable)
@@ -1424,6 +1424,9 @@ void evas_render_proxy_subrender(Evas *eo_e, void *output, Evas_Object *eo_sourc
 
 Eina_Bool evas_map_inside_get(const Evas_Map *m, Evas_Coord x, Evas_Coord y);
 Eina_Bool evas_map_coords_get(const Evas_Map *m, double x, double y, double *mx, double *my, int grab);
+// TIZEN_ONLY(20220223): Set child_has_map flag to parent when parent is set
+void _evas_object_parent_child_has_map_set(Evas_Object_Protected_Data *obj);
+//
 Eina_Bool evas_object_map_update(Evas_Object *obj, int x, int y, int imagew, int imageh, int uvw, int uvh);
 void evas_map_object_move_diff_set(Evas_Map *m, Evas_Coord diff_x, Evas_Coord diff_y);