elm:[atspi]moved highlight when object is out of screen
authorJunsuChoi <jsuya.choi@samsung.com>
Tue, 12 Dec 2017 13:41:56 +0000 (19:11 +0530)
committerJiyoun Park <jy0703.park@samsung.com>
Thu, 21 Dec 2017 13:15:50 +0000 (22:15 +0900)
 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

src/lib/elementary/efl_access.eo
src/lib/elementary/efl_access.h
src/lib/elementary/efl_ui_win.c
src/lib/elementary/elm_atspi_bridge.c

index 39628fb..70ad50f 100644 (file)
@@ -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;
    }
 }
index 92d7b27..42dbe88 100644 (file)
@@ -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.
  */
index cd3480d..da00066 100644 (file)
@@ -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;
+         //
      }
 }
 //
index 5b4aa94..8dfd54f 100644 (file)
@@ -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)
 {