elm: atspi: expose highlight information on atspi
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Tue, 14 Nov 2017 16:39:49 +0000 (17:39 +0100)
committerJiyoun Park <jy0703.park@samsung.com>
Thu, 21 Dec 2017 07:40:38 +0000 (16:40 +0900)
@tizen_feature

Change-Id: I6a79016c1fbd8c1228eb974cfb842ab0eb0d0d3f

12 files changed:
src/lib/elementary/efl_access.h
src/lib/elementary/elm_access.c
src/lib/elementary/elm_access.eo
src/lib/elementary/elm_color_item.eo
src/lib/elementary/elm_conform.c
src/lib/elementary/elm_gengrid.c
src/lib/elementary/elm_genlist.c
src/lib/elementary/elm_list.c
src/lib/elementary/elm_toolbar.c
src/lib/elementary/elm_toolbar_item.eo
src/lib/elementary/elm_widget.c
src/lib/elementary/elm_widget.h

index 5e12ada..5e48652 100644 (file)
 #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
index 5cf518f..111cf47 100644 (file)
@@ -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 <Elementary.h>
 #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 \
index 10cb87d..3a8e73e 100644 (file)
@@ -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;
+      //
    }
 }
index a979f76..ec9d20c 100644 (file)
@@ -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;
+      //
    }
 }
index f91f9f4..7d1990f 100644 (file)
@@ -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);
index e65cf19..0b5aa8b 100644 (file)
@@ -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;
 }
 //
index 1b3f4c8..778c3a7 100644 (file)
@@ -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));
index 4062a8b..3bbe2e8 100644 (file)
@@ -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;
 }
index 29b7c97..4850d76 100644 (file)
@@ -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;
 }
 //
index c080613..500d1e3 100644 (file)
@@ -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;
-//
+           //
       }
 }
index 7953df5..233171b 100644 (file)
@@ -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;
 }
 
index 884e68c..19e2367 100644 (file)
@@ -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))