elc_hoversel: override accessible_at_point getter 96/287096/5
authorLukasz Oleksak <l.oleksak@samsung.com>
Thu, 19 Jan 2023 14:05:37 +0000 (15:05 +0100)
committerLukasz Oleksak <l.oleksak@samsung.com>
Fri, 20 Jan 2023 10:46:29 +0000 (11:46 +0100)
Dedicated implementation is needed because general purpose implementation
provided in efl_ui_widget does not work for widgets having children objects
located ouside the geometry of their parent.

See: _is_inside(), a local function in efl_ui_widget.c

@tizen_only

Change-Id: I52137fd6b3898944481a5b4d6c1fa5fab5403d37

src/lib/elementary/elc_hoversel.c
src/lib/elementary/elm_hoversel_eo.c

index b8f1fff..40bd3e6 100644 (file)
@@ -7,6 +7,7 @@
 #define ELM_WIDGET_PROTECTED
 #define ELM_WIDGET_ITEM_PROTECTED
 #define EFL_UI_L10N_PROTECTED
+#define EFL_ACCESS_COMPONENT_PROTECTED
 
 #include <Elementary.h>
 #include "elm_priv.h"
@@ -1125,6 +1126,38 @@ _elm_hoversel_efl_access_widget_action_elm_actions_get(const Eo *obj EINA_UNUSED
    return &atspi_actions[0];
 }
 
+//TIZEN_ONLY(20230119) : fix accessible_at_point getter
+EOLIAN static Eo *
+_elm_hoversel_efl_access_component_accessible_at_point_get(const Eo *obj, Elm_Hoversel_Data *sd, Eina_Bool screen_coords, int x, int y)
+{
+   Evas_Coord wx, wy, ww, wh;
+   int ee_x, ee_y;
+
+   if (screen_coords)
+     {
+        Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
+        if (!ee) return NULL;
+        ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL);
+        x -= ee_x;
+        y -= ee_y;
+     }
+
+   Elm_Object_Item *eo_item;
+   Eina_List *l;
+   EINA_LIST_FOREACH(sd->items, l, eo_item)
+     {
+        ELM_HOVERSEL_ITEM_DATA_GET(eo_item, it);
+        evas_object_geometry_get(VIEW(it), &wx, &wy, &ww, &wh);
+        Efl_Access_State_Set ss = efl_access_object_state_set_get(VIEW(it));
+        Eina_Bool is_item_showing = !!STATE_TYPE_GET(ss, EFL_ACCESS_STATE_TYPE_SHOWING);
+        if (is_item_showing && !((x > wx + ww) || (y > wy + wh) || (x < wx - ww) || (y < wy - wh)))
+          return VIEW(it);
+     }
+
+   return NULL;
+}
+//
+
 EOLIAN void
 _elm_hoversel_auto_update_set(Eo *obj EINA_UNUSED, Elm_Hoversel_Data *sd, Eina_Bool auto_update)
 {
index 0b6108a..1350820 100644 (file)
@@ -126,6 +126,8 @@ Eina_Bool _elm_hoversel_efl_ui_autorepeat_autorepeat_supported_get(const Eo *obj
 
 const Efl_Access_Action_Data *_elm_hoversel_efl_access_widget_action_elm_actions_get(const Eo *obj, Elm_Hoversel_Data *pd);
 
+Efl_Object *_elm_hoversel_efl_access_component_accessible_at_point_get(const Eo *obj, Elm_Hoversel_Data *pd, Eina_Bool screen_coords, int x, int y);
+
 
 static Eina_Bool
 _elm_hoversel_class_initializer(Efl_Class *klass)
@@ -159,6 +161,7 @@ _elm_hoversel_class_initializer(Efl_Class *klass)
       EFL_OBJECT_OP_FUNC(efl_ui_widget_input_event_handler, _elm_hoversel_efl_ui_widget_widget_input_event_handler),
       EFL_OBJECT_OP_FUNC(efl_ui_autorepeat_enabled_set, _elm_hoversel_efl_ui_autorepeat_autorepeat_enabled_set),
       EFL_OBJECT_OP_FUNC(efl_access_widget_action_elm_actions_get, _elm_hoversel_efl_access_widget_action_elm_actions_get),
+      EFL_OBJECT_OP_FUNC(efl_access_component_accessible_at_point_get, _elm_hoversel_efl_access_component_accessible_at_point_get),
       ELM_HOVERSEL_EXTRA_OPS
    );
    opsp = &ops;