Suppress build warning message
[platform/upstream/elementary.git] / src / lib / elm_widget.c
index 3c529c0..ab47a74 100644 (file)
@@ -5052,12 +5052,31 @@ _elm_widget_item_accessible_plain_name_get(Elm_Object_Item *item, const char* na
    return id->accessible_name;
 }
 
+//TIZEN_ONLY(20160929) : atspi: Improves how to find the can_highlight of the widget
+static Eina_Bool
+_elm_widget_can_highlight_get_by_class(Eo *obj)
+{
+   if (eo_isa(obj, ELM_WIDGET_ITEM_CLASS))
+     {
+        Elm_Widget_Item_Data *id = eo_data_scope_get(obj, ELM_WIDGET_ITEM_CLASS);
+        if (!id) return EINA_FALSE;
+        if (!id->can_highlight) return EINA_FALSE;
+     }
+   else
+     {
+        Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
+        if (!wd) return EINA_FALSE;
+        if (!wd->can_highlight) return EINA_FALSE;
+     }
+   return EINA_TRUE;
+}
+//
+
 //TIZEN_ONLY(20161107): enhance elm_atspi_accessible_can_highlight_set to set can_hihglight property to its children
 EAPI Eina_Bool
 _elm_widget_item_highlightable(Elm_Object_Item *item)
 {
    Eo *parent;
-   Eina_Bool can_highlight;
 
    Elm_Widget_Item_Data *id = eo_data_scope_get(item, ELM_WIDGET_ITEM_CLASS);
    if (!id) return EINA_FALSE;
@@ -5066,8 +5085,9 @@ _elm_widget_item_highlightable(Elm_Object_Item *item)
    eo_do(item, parent = elm_interface_atspi_accessible_parent_get());
    while (parent && !eo_isa(parent, ELM_ATSPI_APP_OBJECT_CLASS))
      {
-        eo_do(parent, can_highlight = elm_interface_atspi_accessible_can_highlight_get());
-        if (!can_highlight) return EINA_FALSE;
+        //TIZEN_ONLY(20160929) : atspi: Improves how to find the can_highlight of the widget
+        if (!_elm_widget_can_highlight_get_by_class(parent)) return EINA_FALSE;
+        //
         eo_do(parent, parent = elm_interface_atspi_accessible_parent_get());
      }
    return EINA_TRUE;
@@ -6548,6 +6568,22 @@ _accessible_highlight_region_show(Eo* obj)
 }
 //
 
+//TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+Eina_Bool
+_elm_widget_accessibility_highlight_grabbing_get(Eo *obj)
+{
+   ELM_WIDGET_DATA_GET(obj, wd);
+   return wd->highlight_grabbing;
+}
+
+void
+_elm_widget_accessibility_highlight_grabbing_set(Eo *obj, Eina_Bool grabbing)
+{
+   ELM_WIDGET_DATA_GET(obj, wd);
+   wd->highlight_grabbing = grabbing;
+}
+//
+
 //TIZEN_ONLY(20160329): atspi: implement HighlightGrab and HighlightClear methods (29e253e2f7ef3c632ac3a64c489bf569df407f30)
 EOLIAN static Eina_Bool
 _elm_widget_elm_interface_atspi_component_highlight_grab(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED)
@@ -6555,6 +6591,14 @@ _elm_widget_elm_interface_atspi_component_highlight_grab(Eo *obj, Elm_Widget_Sma
    if(!obj) return EINA_FALSE;
    if(!_elm_atspi_enabled())
       return EINA_FALSE;
+   // TIZEN_ONLY(20171020) : atspi : Do not send signal, if current object and highlight object are same
+   if (_elm_object_accessibility_currently_highlighted_get() == obj)
+      return EINA_FALSE;
+   //
+
+   //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+   _elm_widget_accessibility_highlight_grabbing_set(obj, EINA_TRUE);
+   //
 
    //TIZEN_ONLY(20170119): Show the object highlighted by highlight_grab when the object is completely out of the scroll
    _accessible_highlight_region_show(obj);
@@ -6566,6 +6610,9 @@ _elm_widget_elm_interface_atspi_component_highlight_grab(Eo *obj, Elm_Widget_Sma
    // TIZEN_ONLY(20161018): add highlighted/unhighlighted signal for atspi
    evas_object_smart_callback_call(obj, SIG_WIDGET_ATSPI_HIGHLIGHTED, NULL);
    //
+   //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+   _elm_widget_accessibility_highlight_grabbing_set(obj, EINA_FALSE);
+   //
    return EINA_TRUE;
 }
 
@@ -6948,7 +6995,6 @@ EAPI Eina_Bool
 _elm_widget_highlightable(Evas_Object *obj)
 {
    Eo *parent;
-   Eina_Bool can_highlight;
 
    Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
    if (!wd) return EINA_FALSE;
@@ -6957,8 +7003,9 @@ _elm_widget_highlightable(Evas_Object *obj)
    eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
    while (parent && !eo_isa(parent, ELM_ATSPI_APP_OBJECT_CLASS))
      {
-        eo_do(parent, can_highlight = elm_interface_atspi_accessible_can_highlight_get());
-        if (!can_highlight) return EINA_FALSE;
+        //TIZEN_ONLY(20160929) : atspi: Improves how to find the can_highlight of the widget
+        if (!_elm_widget_can_highlight_get_by_class(parent)) return EINA_FALSE;
+        //
         eo_do(parent, parent = elm_interface_atspi_accessible_parent_get());
      }
    return EINA_TRUE;
@@ -7115,6 +7162,14 @@ _elm_widget_item_elm_interface_atspi_component_highlight_grab(Eo *obj, Elm_Widge
 {
    if (!sd) return EINA_FALSE;
    if (!sd->view) return EINA_FALSE;
+   // TIZEN_ONLY(20171020) : atspi : Do not send signal, if current object and highlight object are same
+   if (_elm_object_accessibility_currently_highlighted_get() == obj)
+      return EINA_FALSE;
+   //
+
+   //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+   _elm_widget_accessibility_highlight_grabbing_set(sd->view, EINA_TRUE);
+   //
 
    //TIZEN_ONLY(20170119): Show the object highlighted by highlight_grab when the object is completely out of the scroll
    _accessible_highlight_region_show(sd->view);
@@ -7129,6 +7184,9 @@ _elm_widget_item_elm_interface_atspi_component_highlight_grab(Eo *obj, Elm_Widge
    //TIZEN_ONLY(20170412) Make atspi,(un)highlighted work on widget item
    evas_object_smart_callback_call(sd->widget, SIG_WIDGET_ATSPI_HIGHLIGHTED, obj);
    //
+   //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+   _elm_widget_accessibility_highlight_grabbing_set(sd->view, EINA_FALSE);
+   //
    return EINA_TRUE;
 }
 
@@ -7283,6 +7341,7 @@ _elm_widget_atspi_role_acceptable_check(Eo *obj)
        case ELM_ATSPI_ROLE_EMBEDDED:
        case ELM_ATSPI_ROLE_INVALID:
        case ELM_ATSPI_ROLE_NOTIFICATION:
+       case ELM_ATSPI_ROLE_DATE_EDITOR:
          return EINA_FALSE;
        default:
          break;
@@ -7329,6 +7388,36 @@ _child_object_at_point_get(Eo *obj, int x, int y)
    return obj;
 }
 
+static Eina_Bool
+_acceptable_child_is(Eo *obj)
+{
+   Elm_Atspi_Role role;
+   Eina_List *children;
+   Elm_Atspi_State_Set ss;
+
+   eo_do(obj, role = elm_interface_atspi_accessible_role_get());
+   switch (role)
+     {
+       case ELM_ATSPI_ROLE_IMAGE:
+       case ELM_ATSPI_ROLE_ICON:
+         /* remove unacceptable leaf node */
+         eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+         if (!children) return EINA_FALSE;
+         break;
+
+       case ELM_ATSPI_ROLE_PANEL:
+         /* remove closed panel fron children list */
+         eo_do(obj, ss = elm_interface_atspi_accessible_state_set_get());
+         if (!STATE_TYPE_GET(ss, ELM_ATSPI_STATE_SHOWING)) return EINA_FALSE;
+         break;
+
+       default:
+         break;
+     }
+
+   return EINA_TRUE;
+}
+
 static Eo *
 _accessible_at_point_top_down_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool screen_coords, int x, int y)
 {
@@ -7347,9 +7436,20 @@ _accessible_at_point_top_down_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSE
 
    EINA_LIST_FOREACH(children, l2, child)
      {
-        if (_is_inside(child, x, y))
+        if (_is_inside(child, x, y) && _acceptable_child_is(child))
           valid_children = eina_list_append(valid_children, child);
      }
+
+   /* If there is only one valid child at point, then return it.
+      The evas_tree_objects_at_xy_get could not find proper object,
+      if application does not have well aligned objects. */
+   if (eina_list_count(valid_children) == 1)
+     {
+        eina_list_free(children);
+        child = eina_list_nth(valid_children, 0);
+        return child;
+     }
+
    /* Get evas_object stacked at given x,y coordinates starting from top */
    Eina_List *stack = evas_tree_objects_at_xy_get(evas_object_evas_get(obj), NULL, x, y);
    /* Foreach stacked object starting from top */
@@ -7358,13 +7458,6 @@ _accessible_at_point_top_down_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSE
         /* Foreach at-spi valid children traverse stack_item evas_objects hierarchy */
         EINA_LIST_FOREACH(valid_children, l2, child)
           {
-             Elm_Atspi_Role role;
-             eo_do(child, role = elm_interface_atspi_accessible_role_get());
-             if (role == ELM_ATSPI_ROLE_REDUNDANT_OBJECT)
-               {
-                  /* The redundant object ignores */
-                  continue;
-               }
              /* Compare object used to compare with stacked evas objects */
              compare_obj = child;
              /* In case of widget_items compare should be different then elm_widget_ item  object */
@@ -7489,7 +7582,9 @@ _elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_W
    Eina_List *l;
    Evas_Object *stack_item;
 
-   if(strcmp("Elm_Win", eo_class_name_get(eo_class_get(obj))))
+   if(strcmp("Elm_Win", eo_class_name_get(eo_class_get(obj))) &&
+      strcmp("Elm_Popup", eo_class_name_get(eo_class_get(obj))) &&
+      strcmp("Elm_Panel", eo_class_name_get(eo_class_get(obj))))
      return _accessible_at_point_top_down_get(obj, _pd, screen_coords, x, y);
 
    _coordinate_system_based_point_translate(obj, screen_coords, &x, &y);
@@ -7502,6 +7597,11 @@ _elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_W
         Evas_Object *smart_parent = stack_item;
         while (smart_parent)
           {
+             /* If parent equals to obj, it is not necessary to go upper.
+                So the top down logic would be better than NULL return. */
+             if (smart_parent == obj)
+               return _accessible_at_point_top_down_get(obj, _pd, screen_coords, x, y);
+
              Evas_Object *ao = elm_access_object_get(smart_parent);
              if (ao) return ao;