From: Lukasz Stanislawski Date: Tue, 14 Nov 2017 16:39:49 +0000 (+0100) Subject: elm: atspi: expose highlight information on atspi X-Git-Tag: submit/sandbox/upgrade/efl120/20180319.053334~928 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=61a11f52450b0a7702f6d4dc83f5d37981e42c0d;p=platform%2Fupstream%2Fefl.git elm: atspi: expose highlight information on atspi @tizen_feature Change-Id: I6a79016c1fbd8c1228eb974cfb842ab0eb0d0d3f --- diff --git a/src/lib/elementary/efl_access.h b/src/lib/elementary/efl_access.h index 5e12ada..5e48652 100644 --- a/src/lib/elementary/efl_access.h +++ b/src/lib/elementary/efl_access.h @@ -12,20 +12,22 @@ #include "efl_access.eo.legacy.h" #endif +// TIZEN_ONLY(20171114): atspi: expose highlight information on atspi /* * Sets a particilar state type for given state set. */ -#define STATE_TYPE_SET(state_set, type) (state_set|= (1ULL << type)) +#define STATE_TYPE_SET(state_set, type) (state_set |= ((Efl_Access_State_Set)1 << type)) /** * Unsets a particilar state type for given state set. */ -#define STATE_TYPE_UNSET(state_set, type) (state_set &= ~(1ULL << type)) +#define STATE_TYPE_UNSET(state_set, type) (state_set &= ~((Efl_Access_State_Set)1 << type)) /** * Gets value of a particilar state type for given state set. */ -#define STATE_TYPE_GET(state_set, type) (state_set & (1ULL << type)) +#define STATE_TYPE_GET(state_set, type) (state_set & ((Efl_Access_State_Set)1 << type)) +// /** * Free Efl_Access_Attributes_List diff --git a/src/lib/elementary/elm_access.c b/src/lib/elementary/elm_access.c index 5cf518f..111cf47 100644 --- a/src/lib/elementary/elm_access.c +++ b/src/lib/elementary/elm_access.c @@ -5,6 +5,10 @@ #define EFL_ACCESS_PROTECTED #define EFL_ACCESS_WIDGET_ACTION_PROTECTED +// TIZEN_ONLY(20171114): atspi: expose highlight information on atspi +#define EFL_ACCESS_COMPONENT_PROTECTED +// + #include #include "elm_priv.h" @@ -1537,6 +1541,28 @@ _elm_access_efl_access_state_set_get(Eo *obj, void *pd EINA_UNUSED) return ret; } +// TIZEN_ONLY(20171114): atspi: expose highlight information on atspi +EOLIAN static Eina_Bool +_elm_access_efl_access_component_highlight_grab(Eo *obj, void *pd EINA_UNUSED) +{ + if (!_access_action_callback_call(obj, ELM_ACCESS_ACTION_HIGHLIGHT, NULL)) + efl_access_component_highlight_grab(efl_super(obj, ELM_ACCESS_CLASS)); + + efl_access_state_changed_signal_emit(obj, EFL_ACCESS_STATE_HIGHLIGHTED, EINA_TRUE); + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_access_efl_access_component_highlight_clear(Eo *obj, void *pd EINA_UNUSED) +{ + if (!_access_action_callback_call(obj, ELM_ACCESS_ACTION_UNHIGHLIGHT, NULL)) + efl_access_component_highlight_clear(efl_super(obj, ELM_ACCESS_CLASS)); + + efl_access_state_changed_signal_emit(obj, EFL_ACCESS_STATE_HIGHLIGHTED, EINA_FALSE); + return EINA_TRUE; +} +// + /* Internal EO APIs and hidden overrides */ #define ELM_ACCESS_EXTRA_OPS \ diff --git a/src/lib/elementary/elm_access.eo b/src/lib/elementary/elm_access.eo index 10cb87d..3a8e73e 100644 --- a/src/lib/elementary/elm_access.eo +++ b/src/lib/elementary/elm_access.eo @@ -11,5 +11,9 @@ class Elm.Access (Elm.Widget, Efl.Access.Widget.Action) Elm.Widget.on_focus_update; Efl.Access.Widget.Action.elm_actions { get; } Efl.Access.state_set { get; } + // TIZEN_ONLY(20171114): atspi: expose highlight information on atspi + Efl.Access.Component.highlight_grab; + Efl.Access.Component.highlight_clear; + // } } diff --git a/src/lib/elementary/elm_color_item.eo b/src/lib/elementary/elm_color_item.eo index a979f76..ec9d20c 100644 --- a/src/lib/elementary/elm_color_item.eo +++ b/src/lib/elementary/elm_color_item.eo @@ -47,5 +47,9 @@ class Elm.Color.Item(Elm.Widget.Item, Efl.Ui.Focus.Object, Efl.Access.Widget.Act Efl.Access.state_set { get; } Efl.Access.name { get; } Efl.Access.Widget.Action.elm_actions { get; } + // TIZEN_ONLY(20171114): atspi: expose highlight information on atspi + Efl.Access.Component.highlight_grab; + Efl.Access.Component.highlight_clear; + // } } diff --git a/src/lib/elementary/elm_conform.c b/src/lib/elementary/elm_conform.c index f91f9f4..7d1990f 100644 --- a/src/lib/elementary/elm_conform.c +++ b/src/lib/elementary/elm_conform.c @@ -135,7 +135,7 @@ _conformant_part_sizing_eval(Evas_Object *obj, Ecore_Wl2_Window *wlwin; #endif // - Evas_Object *top; + Evas_Object *top = NULL; int sx = -1, sy = -1, sw = -1, sh = -1; ELM_CONFORMANT_DATA_GET(obj, sd); diff --git a/src/lib/elementary/elm_gengrid.c b/src/lib/elementary/elm_gengrid.c index e65cf19..0b5aa8b 100644 --- a/src/lib/elementary/elm_gengrid.c +++ b/src/lib/elementary/elm_gengrid.c @@ -5439,7 +5439,9 @@ _elm_gengrid_item_efl_access_component_highlight_grab(Eo *eo_it, Elm_Gen_Item *i elm_gengrid_item_show(eo_it, ELM_GENGRID_ITEM_SCROLLTO_IN); elm_object_accessibility_highlight_set(VIEW(it), EINA_TRUE); - + //TIZEN_ONLY(20170717) : expose highlight information on atspi + efl_event_callback_call(WIDGET(it), EFL_ACCESS_EVENT_ACTIVE_DESCENDANT_CHANGED, eo_it); + // return EINA_TRUE; } @@ -5447,7 +5449,9 @@ EOLIAN static Eina_Bool _elm_gengrid_item_efl_access_component_highlight_clear(Eo *eo_it EINA_UNUSED, Elm_Gen_Item *it) { elm_object_accessibility_highlight_set(VIEW(it), EINA_FALSE); - + //TIZEN_ONLY(20170717) : expose highlight information on atspi + efl_event_callback_call(WIDGET(it), EFL_ACCESS_EVENT_ACTIVE_DESCENDANT_CHANGED, eo_it); + // return EINA_TRUE; } // diff --git a/src/lib/elementary/elm_genlist.c b/src/lib/elementary/elm_genlist.c index 1b3f4c8..778c3a7 100644 --- a/src/lib/elementary/elm_genlist.c +++ b/src/lib/elementary/elm_genlist.c @@ -1043,18 +1043,40 @@ _item_tree_effect_before(Elm_Gen_Item *it) } static void -_item_position(Elm_Gen_Item *it, +_item_position(Elm_Gen_Item *eo_it, Evas_Object *view, Evas_Coord it_x, Evas_Coord it_y) { - if (!it) return; + if (!eo_it) return; if (!view) return; - ELM_GENLIST_DATA_GET_FROM_ITEM(it, sd); + ELM_GENLIST_DATA_GET_FROM_ITEM(eo_it, sd); + + //TIZEN_ONLY(20160419) : expose highlight information on atspi + if ((void*)view == _elm_object_accessibility_currently_highlighted_get()) + { + Elm_Genlist_Data * sd = eo_it->item->wsd; + int x,y,w,h; + evas_object_geometry_get(sd->obj, &x, &y, &w, &h); + + Elm_Gen_Item * next_previous_item = NULL; + if ((it_y + eo_it->item->h/2) < y) + { + next_previous_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(eo_it)->next); + } + else if ((it_y + eo_it->item->h/2) > y + h) + { + next_previous_item = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(eo_it)->prev); + } + + if (next_previous_item) + efl_access_component_highlight_grab(EO_OBJ(next_previous_item)); + } + // evas_event_freeze (evas_object_evas_get(sd->obj)); - evas_object_resize(view, it->item->w, it->item->h); + evas_object_resize(view, eo_it->item->w, eo_it->item->h); evas_object_move(view, it_x, it_y); evas_object_show(view); evas_event_thaw(evas_object_evas_get(sd->obj)); diff --git a/src/lib/elementary/elm_list.c b/src/lib/elementary/elm_list.c index 4062a8b..3bbe2e8 100644 --- a/src/lib/elementary/elm_list.c +++ b/src/lib/elementary/elm_list.c @@ -2140,12 +2140,16 @@ _elm_list_item_efl_access_name_get(Eo *eo_it, Elm_List_Item_Data *data) return _elm_widget_item_accessible_plain_name_get(eo_it, data->label); } + + //TIZEN_ONLY(20171114): Region show on item elements fixed EOLIAN static Eina_Bool _elm_list_item_efl_access_component_highlight_clear(Eo *eo_it EINA_UNUSED, Elm_List_Item_Data *it) { elm_object_accessibility_highlight_set(VIEW(it), EINA_FALSE); - + // TIZEN_ONLY(20171114): atspi: expose highlight information on atspi + efl_access_state_changed_signal_emit(eo_it, EFL_ACCESS_STATE_HIGHLIGHTED, EINA_FALSE); + // return EINA_TRUE; } // @@ -3254,6 +3258,7 @@ _elm_list_efl_access_selection_child_deselect(Eo *obj EINA_UNUSED, Elm_List_Data return EINA_FALSE; } + /* Standard widget overrides */ ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(elm_list, Elm_List_Data) @@ -3391,6 +3396,9 @@ _elm_list_item_efl_access_component_highlight_grab(Eo *eo_it, Elm_List_Item_Data else elm_list_item_show(eo_it); + // TIZEN_ONLY(20171114): atspi: expose highlight information on atspi + efl_access_state_changed_signal_emit(eo_it, EFL_ACCESS_STATE_HIGHLIGHTED, EINA_TRUE); + // ret = efl_access_component_highlight_grab(efl_super(eo_it, ELM_LIST_ITEM_CLASS)); return ret; } diff --git a/src/lib/elementary/elm_toolbar.c b/src/lib/elementary/elm_toolbar.c index 29b7c97..4850d76 100644 --- a/src/lib/elementary/elm_toolbar.c +++ b/src/lib/elementary/elm_toolbar.c @@ -3950,6 +3950,9 @@ _elm_toolbar_item_efl_access_component_highlight_grab(Eo *eo_it, Elm_Toolbar_Ite { elm_toolbar_item_show(eo_it, ELM_TOOLBAR_ITEM_SCROLLTO_IN); elm_object_accessibility_highlight_set(VIEW(it), EINA_TRUE); + // TIZEN_ONLY(20171114): atspi: expose highlight information on atspi + efl_event_callback_call(WIDGET(it), EFL_ACCESS_EVENT_ACTIVE_DESCENDANT_CHANGED, eo_it); + // return EINA_TRUE; } @@ -3957,6 +3960,9 @@ EOLIAN static Eina_Bool _elm_toolbar_item_efl_access_component_highlight_clear(Eo *eo_it EINA_UNUSED, Elm_Toolbar_Item_Data *it) { elm_object_accessibility_highlight_set(VIEW(it), EINA_FALSE); + // TIZEN_ONLY(20171114): atspi: expose highlight information on atspi + efl_event_callback_call(WIDGET(it), EFL_ACCESS_EVENT_ACTIVE_DESCENDANT_CHANGED, eo_it); + // return EINA_TRUE; } // diff --git a/src/lib/elementary/elm_toolbar_item.eo b/src/lib/elementary/elm_toolbar_item.eo index c080613..500d1e3 100644 --- a/src/lib/elementary/elm_toolbar_item.eo +++ b/src/lib/elementary/elm_toolbar_item.eo @@ -279,9 +279,9 @@ class Elm.Toolbar.Item(Elm.Widget.Item, Efl.Ui.Item, Efl.Ui.Focus.Object) Efl.Ui.Item.selected { get; set; } Efl.Ui.Item.prev { get; } Efl.Ui.Item.next { get; } -// TIZEN_ONLY(20171114): Add accessibility highlight for toolbar items f919df709e670600fcea71c3001a5ce5221b61e0 + // TIZEN_ONLY(20171114): atspi: expose highlight information on atspi Efl.Access.Component.highlight_grab; Efl.Access.Component.highlight_clear; -// + // } } diff --git a/src/lib/elementary/elm_widget.c b/src/lib/elementary/elm_widget.c index 7953df5..233171b 100644 --- a/src/lib/elementary/elm_widget.c +++ b/src/lib/elementary/elm_widget.c @@ -4099,8 +4099,7 @@ _elm_widget_item_accessible_plain_name_get(Elm_Object_Item *item, const char* na } EOLIAN static Efl_Access_State_Set -_elm_widget_item_efl_access_state_set_get(Eo *eo_item, - Elm_Widget_Item_Data *item EINA_UNUSED) +_elm_widget_item_efl_access_state_set_get(Eo *eo_item, Elm_Widget_Item_Data *item) { Efl_Access_State_Set states = 0; @@ -4129,6 +4128,13 @@ _elm_widget_item_efl_access_state_set_get(Eo *eo_item, if (_elm_widget_item_onscreen_is(eo_item)) STATE_TYPE_SET(states, EFL_ACCESS_STATE_SHOWING); + //TIZEN_ONLY(20170717) : expose highlight information on atspi + if (item->can_highlight) + STATE_TYPE_SET(states, EFL_ACCESS_STATE_HIGHLIGHTABLE); + + if (_elm_object_accessibility_currently_highlighted_get() == (void*)item->view) + STATE_TYPE_SET(states, EFL_ACCESS_STATE_HIGHLIGHTED); + // return states; } @@ -5173,7 +5179,7 @@ _focus_event_changed(void *data EINA_UNUSED, const Efl_Event *event) } EOLIAN static Eo * -_elm_widget_efl_object_constructor(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED) +_elm_widget_efl_object_constructor(Eo *obj, Elm_Widget_Smart_Data *sd) { Eo *parent = NULL; @@ -5192,6 +5198,9 @@ _elm_widget_efl_object_constructor(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSE sd->on_create = EINA_FALSE; efl_access_role_set(obj, EFL_ACCESS_ROLE_UNKNOWN); + //TIZEN_ONLY(20170717) : expose highlight information on atspi + sd->can_highlight = EINA_TRUE; + // efl_event_callback_add(obj, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, _focus_event_changed, NULL); @@ -5484,8 +5493,9 @@ _elm_widget_efl_access_parent_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED return efl_isa(parent, EFL_ACCESS_MIXIN) ? parent : NULL; } + EOLIAN static Efl_Access_State_Set -_elm_widget_efl_access_state_set_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED) +_elm_widget_efl_access_state_set_get(Eo *obj, Elm_Widget_Smart_Data *pd) { Efl_Access_State_Set states = 0; @@ -5522,6 +5532,14 @@ _elm_widget_efl_access_state_set_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNU STATE_TYPE_SET(states, EFL_ACCESS_STATE_SENSITIVE); } + //TIZEN_ONLY(20170717) : expose highlight information on atspi + if (pd->can_highlight) + STATE_TYPE_SET(states, EFL_ACCESS_STATE_HIGHLIGHTABLE); + + if (_elm_object_accessibility_currently_highlighted_get() == (void*)pd->obj) + STATE_TYPE_SET(states, EFL_ACCESS_STATE_HIGHLIGHTED); + // + return states; } diff --git a/src/lib/elementary/elm_widget.h b/src/lib/elementary/elm_widget.h index 884e68c..19e2367 100644 --- a/src/lib/elementary/elm_widget.h +++ b/src/lib/elementary/elm_widget.h @@ -466,6 +466,9 @@ typedef struct _Elm_Widget_Smart_Data Eina_Bool provider_lookup : 1; /**< This is true when efl_provider_find is currently walking the tree */ Eina_Bool legacy : 1; /**< Widget was created with a legacy API, not efl_add() */ Eina_Bool has_shadow : 1; + ///TIZEN_ONLY(20170717) : expose highlight information on atspi + Eina_Bool can_highlight : 1; /**< true if widget have at-spi HIGHLIGHTABLE state */ + /// } Elm_Widget_Smart_Data; typedef Elm_Widget_Smart_Data Efl_Ui_Widget_Data; @@ -555,6 +558,9 @@ void _elm_win_focus_auto_hide(Evas_Object *obj); // Evas_Object *_elm_win_accessibility_highlight_get(Evas_Object *win); // // void _elm_win_object_set_accessibility_highlight(Evas_Object *win, Evas_Object *obj); +// TIZEN_ONLY(20171114): atspi: expose highlight information on atspi +void *_elm_object_accessibility_currently_highlighted_get(); +// EAPI void _elm_access_clear(Elm_Access_Info *ac); EAPI void _elm_access_text_set(Elm_Access_Info *ac, int type, const char *text); @@ -639,6 +645,9 @@ struct _Elm_Widget_Item_Data Eina_Bool on_deletion : 1; Eina_Bool on_translate : 1; Eina_Bool still_in : 1; + ///TIZEN_ONLY(20170717) : expose highlight information on atspi + Eina_Bool can_highlight : 1; /**< true if widget have at-spi HIGHLIGHTABLE state */ + /// }; #define ELM_NEW(t) calloc(1, sizeof(t))