From: JunsuChoi Date: Tue, 12 Dec 2017 13:41:56 +0000 (+0530) Subject: elm:[atspi]moved highlight when object is out of screen X-Git-Tag: submit/sandbox/upgrade/efl120/20180319.053334~729 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fdcb913f2e6ab5b75b838eab51724d5d4c1f4206;p=platform%2Fupstream%2Fefl.git elm:[atspi]moved highlight when object is out of screen when highlighted object is out of screen or scroll view , elementary send 'object:move-outed' signal to screen-reader need this commit: screen-reader - https://review.tizen.org/gerrit/#/c/135993/ at-spi2-core - https://review.tizen.org/gerrit/#/c/135994/ @tizen_feature orignal patch: 9cd6a35c8731fc59b736bd0721f9f3dba1cf26fb Change-Id: I0a657c9e4444d2eab78213a7e6c5b6e5668c5c1d --- diff --git a/src/lib/elementary/efl_access.eo b/src/lib/elementary/efl_access.eo index 39628fb..70ad50f 100644 --- a/src/lib/elementary/efl_access.eo +++ b/src/lib/elementary/efl_access.eo @@ -673,5 +673,6 @@ mixin Efl.Access (Efl.Interface, Efl.Object) active,descendant,changed; [[Called when active state of descendant has changed]] added; [[Called when item was added]] removed; [[Called when item was removed]] + move,outed; } } diff --git a/src/lib/elementary/efl_access.h b/src/lib/elementary/efl_access.h index 92d7b27..42dbe88 100644 --- a/src/lib/elementary/efl_access.h +++ b/src/lib/elementary/efl_access.h @@ -47,6 +47,17 @@ typedef Eina_Bool (*Efl_Access_Gesture_Cb)(void *data, Efl_Access_Gesture_Info g */ #define ACCESS_STATE(type) ((Efl_Access_State_Set)1 << (type)) +//TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen +enum _Efl_Access_Move_Outed_Type { + EFL_ACCESS_MOVE_OUTED_NULL, + EFL_ACCESS_MOVE_OUTED_TOP_LEFT, + EFL_ACCESS_MOVE_OUTED_BOTTOM_RIGHT, + EFL_ACCESS_MOVE_OUTED_LAST_DEFINDED +}; + +typedef enum _Efl_Access_Move_Outed_Type Efl_Access_Move_Outed_Type; +// + /** * Free Efl_Access_Attributes_List */ @@ -111,6 +122,17 @@ EAPI Efl_Access_Relation_Set efl_access_relation_set_clone(const Efl_Access_Rela efl_access_event_emit(EFL_ACCESS_MIXIN, obj, EFL_ACCESS_EVENT_BOUNDS_CHANGED, (void*)&evinfo); \ } while(0); +//TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen +/** + * Emits ATSPI 'MoveOuted' dbus signal. + */ +#define efl_access_move_outed_signal_emit(obj, type) \ + do { \ + Efl_Access_Move_Outed_Type evinfo = type; \ + efl_access_event_emit(EFL_ACCESS_MIXIN, obj, EFL_ACCESS_EVENT_MOVE_OUTED, (void*)&evinfo); \ + } while(0); +// + /** * Emits Accessible 'PropertyChanged' signal for 'Name' property. */ diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index cd3480d..da00066 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -182,6 +182,13 @@ struct _Efl_Ui_Win_Data struct { Evas_Object *target; + //TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen + int x; + int y; + int w; + int h; + Eina_Bool need_moved; + // } cur, prev; } accessibility_highlight; @@ -1179,12 +1186,50 @@ _elm_win_accessibility_highlight_simple_setup(Efl_Ui_Win_Data *sd, Evas_Object *clip, *target = sd->accessibility_highlight.cur.target; // Evas_Coord x, y, w, h; + //TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen + Evas_Coord ox, oy; + Efl_Access_Role role; + // evas_object_geometry_get(target, &x, &y, &w, &h); + //TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen + evas_object_geometry_get(target, &ox, &oy, NULL, NULL); + + if (((w < 0 && ox > sd->accessibility_highlight.cur.x) || (h < 0 && oy < sd->accessibility_highlight.cur.y)) + && sd->accessibility_highlight.cur.need_moved + && efl_isa(target, EFL_ACCESS_MIXIN)) + { + role = efl_access_role_get(target); + if (role && role != EFL_ACCESS_ROLE_MENU_ITEM && role != EFL_ACCESS_ROLE_LIST_ITEM) + { + efl_access_move_outed_signal_emit(target, EFL_ACCESS_MOVE_OUTED_TOP_LEFT); + sd->accessibility_highlight.cur.need_moved = EINA_FALSE; + return ; + } + } + else if (((w < 0 && ox < sd->accessibility_highlight.cur.x) || (h < 0 && oy > sd->accessibility_highlight.cur.y)) + && sd->accessibility_highlight.cur.need_moved + && efl_isa(target, EFL_ACCESS_MIXIN)) + { + role = efl_access_role_get(target); + if (role && role != EFL_ACCESS_ROLE_MENU_ITEM && role != EFL_ACCESS_ROLE_LIST_ITEM) + { + efl_access_move_outed_signal_emit(target, EFL_ACCESS_MOVE_OUTED_BOTTOM_RIGHT); + sd->accessibility_highlight.cur.need_moved = EINA_FALSE; + return ; + } + } + // + evas_object_move(obj, x, y); evas_object_resize(obj, w, h); + //TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen + sd->accessibility_highlight.cur.x = ox; + sd->accessibility_highlight.cur.y = oy; + // + // TIZEN_ONLY(20171117) Accessibility frame follows parent item on scroll event clip = evas_object_clip_get(target); if (clip) evas_object_clip_set(obj, clip); @@ -8746,6 +8791,9 @@ _elm_win_object_set_accessibility_highlight(Evas_Object *win, Evas_Object *obj, { _elm_win_accessibility_highlight_init(sd, obj); _elm_win_accessibility_highlight_show(win); + //TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen + sd->accessibility_highlight.cur.need_moved = EINA_TRUE; + // } } // diff --git a/src/lib/elementary/elm_atspi_bridge.c b/src/lib/elementary/elm_atspi_bridge.c index 5b4aa94..8dfd54f 100644 --- a/src/lib/elementary/elm_atspi_bridge.c +++ b/src/lib/elementary/elm_atspi_bridge.c @@ -170,6 +170,9 @@ static void _text_text_inserted_send(void *data, const Efl_Event *event); static void _text_text_removed_send(void *data, const Efl_Event *event); static void _text_caret_moved_send(void *data, const Efl_Event *event); static void _text_selection_changed_send(void *data, const Efl_Event *event); +//TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen +static void _move_outed_signal_send(void *data, const Efl_Event *event); +// // bridge private methods //TIZEN_ONLY(20171108): make atspi_proxy work @@ -223,7 +226,10 @@ static const Elm_Atspi_Bridge_Event_Handler event_handlers[] = { { EFL_ACCESS_TEXT_EVENT_ACCESS_TEXT_CARET_MOVED, _text_caret_moved_send }, { EFL_ACCESS_TEXT_EVENT_ACCESS_TEXT_INSERTED, _text_text_inserted_send }, { EFL_ACCESS_TEXT_EVENT_ACCESS_TEXT_REMOVED, _text_text_removed_send }, - { EFL_ACCESS_TEXT_EVENT_ACCESS_TEXT_SELECTION_CHANGED, _text_selection_changed_send } + { EFL_ACCESS_TEXT_EVENT_ACCESS_TEXT_SELECTION_CHANGED, _text_selection_changed_send }, + //TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen + { EFL_ACCESS_EVENT_MOVE_OUTED, _move_outed_signal_send} + // }; enum _Atspi_Object_Child_Event_Type @@ -264,6 +270,9 @@ enum _Atspi_Object_Signals { ATSPI_OBJECT_EVENT_TEXT_ATTRIBUTES_CHANGED, ATSPI_OBJECT_EVENT_TEXT_CARET_MOVED, ATSPI_OBJECT_EVENT_ATTRIBUTES_CHANGED, + //TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen + ATSPI_OBJECT_EVENT_MOVE_OUTED + // }; enum _Atspi_Window_Signals @@ -311,6 +320,9 @@ static const Eldbus_Signal _event_obj_signals[] = { [ATSPI_OBJECT_EVENT_TEXT_ATTRIBUTES_CHANGED] = {"TextAttributesChanged", ELDBUS_ARGS({"siiv(so)", NULL}), 0}, [ATSPI_OBJECT_EVENT_TEXT_CARET_MOVED] = {"TextCaretMoved", ELDBUS_ARGS({"siiv(so)", NULL}), 0}, [ATSPI_OBJECT_EVENT_ATTRIBUTES_CHANGED] = {"AttributesChanged", ELDBUS_ARGS({"siiv(so)", NULL}), 0}, + //TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen + [ATSPI_OBJECT_EVENT_MOVE_OUTED] = {"MoveOuted", ELDBUS_ARGS({"siiv(i)", NULL}), 0}, + // {NULL, ELDBUS_ARGS({NULL, NULL}), 0} }; @@ -5147,6 +5159,10 @@ _set_broadcast_flag(const char *event, Eo *bridge) STATE_TYPE_SET(pd->object_broadcast_mask, ATSPI_OBJECT_EVENT_SELECTION_CHANGED); else if (!strcmp(tokens[1], "BoundsChanged")) STATE_TYPE_SET(pd->object_broadcast_mask, ATSPI_OBJECT_EVENT_BOUNDS_CHANGED); + //TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen + else if (!strcmp(tokens[1], "MoveOuted")) + STATE_TYPE_SET(pd->object_broadcast_mask, ATSPI_OBJECT_EVENT_MOVE_OUTED); + // } else if (!strcmp(tokens[0], "Window")) { @@ -5479,6 +5495,24 @@ _children_changed_signal_send(void *data, const Efl_Event *event) idx, 0, "(so)", eldbus_connection_unique_name_get(pd->a11y_bus), ev_data->child); } +//TIZEN_ONLY(20160623): atspi: moved highlight when object is out of screen +static void +_move_outed_signal_send(void *data, const Efl_Event *event) +{ + const Efl_Access_Move_Outed_Type *type = event->info; + + ELM_ATSPI_BRIDGE_DATA_GET_OR_RETURN(data, pd); + + if (!STATE_TYPE_GET(pd->object_broadcast_mask, ATSPI_OBJECT_EVENT_MOVE_OUTED)) + { + efl_event_callback_stop(event->object); + return; + } + _bridge_signal_send(data, event->object, ATSPI_DBUS_INTERFACE_EVENT_OBJECT, + &_event_obj_signals[ATSPI_OBJECT_EVENT_MOVE_OUTED], "", *type, 0, NULL, NULL); +} +// + static void _window_signal_send(void *data, const Efl_Event *event) {