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;
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;
}
//
+//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)
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);
// 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;
}
_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;
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;
{
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);
//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;
}
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;
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)
{
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 */
/* 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 */
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);
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;