diff options
author | Lukasz Stanislawski <lukasz.stanislawski@gmail.com> | 2019-02-13 23:37:58 +0100 |
---|---|---|
committer | Lukasz Stanislawski <lukasz.stanislawski@gmail.com> | 2019-02-13 23:37:58 +0100 |
commit | b304292c8fdc07c61b2f179a6038e581279a94db (patch) | |
tree | f471dadde2b49d037d21838bb43eec1be97c7cf0 | |
parent | 05d432a3285f09c767e3cdb3a173ec0eb763de60 (diff) | |
download | efl-b304292c8fdc07c61b2f179a6038e581279a94db.tar.gz |
elementary: add Efl.Access.Widget and Efl.Access.Widget_Item classes
-rw-r--r-- | src/Makefile_Elementary.am | 6 | ||||
-rw-r--r-- | src/lib/elementary/Elementary.h | 4 | ||||
-rw-r--r-- | src/lib/elementary/efl_access_widget.c | 294 | ||||
-rw-r--r-- | src/lib/elementary/efl_access_widget.eo | 30 | ||||
-rw-r--r-- | src/lib/elementary/efl_access_widget.h | 9 | ||||
-rw-r--r-- | src/lib/elementary/efl_access_widget_item.c | 175 | ||||
-rw-r--r-- | src/lib/elementary/efl_access_widget_item.eo | 18 | ||||
-rw-r--r-- | src/lib/elementary/efl_access_widget_item.h | 10 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_widget.c | 284 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_widget.eo | 18 | ||||
-rw-r--r-- | src/lib/elementary/elm_widget.h | 1 | ||||
-rw-r--r-- | src/lib/elementary/elm_widget_item.eo | 7 |
12 files changed, 583 insertions, 273 deletions
diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index 6103a5ba31..595c71ad88 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -114,7 +114,9 @@ elm_public_eolian_files = \ lib/elementary/efl_access_selection.eo \ lib/elementary/efl_access_text.eo \ lib/elementary/efl_access_value.eo \ + lib/elementary/efl_access_widget.eo \ lib/elementary/efl_access_widget_action.eo \ + lib/elementary/efl_access_widget_item.eo \ lib/elementary/efl_access_window.eo \ lib/elementary/efl_ui_theme.eo \ lib/elementary/efl_config_global.eo \ @@ -341,7 +343,9 @@ includesunstable_HEADERS = \ lib/elementary/elm_atspi_bridge.h \ lib/elementary/efl_access_object.h \ lib/elementary/efl_access_text.h \ + lib/elementary/efl_access_widget.h \ lib/elementary/efl_access_widget_action.h \ + lib/elementary/efl_access_widget_item.h \ lib/elementary/efl_access_window.h \ lib/elementary/elm_interface_fileselector.h \ lib/elementary/elm_interface_scrollable.h \ @@ -759,7 +763,9 @@ lib_elementary_libelementary_la_SOURCES = \ lib/elementary/efl_access_selection.c \ lib/elementary/efl_access_text.c \ lib/elementary/efl_access_value.c \ + lib/elementary/efl_access_widget.c \ lib/elementary/efl_access_widget_action.c \ + lib/elementary/efl_access_widget_item.c \ lib/elementary/efl_access_window.c \ lib/elementary/elm_interface_fileselector.c \ lib/elementary/elm_interface_scrollable.c \ diff --git a/src/lib/elementary/Elementary.h b/src/lib/elementary/Elementary.h index 5bb8374e3a..2a6aba5531 100644 --- a/src/lib/elementary/Elementary.h +++ b/src/lib/elementary/Elementary.h @@ -189,6 +189,10 @@ EAPI void efl_ui_focus_relation_free(Efl_Ui_Focus_Relations *rel); /* Interfaces */ #include <elm_interfaces.h> +/* accessibility */ +#include <efl_access_widget.h> +#include <efl_access_widget_item.h> + /* other includes */ #include <elc_ctxpopup.h> #include <elc_combobox.h> diff --git a/src/lib/elementary/efl_access_widget.c b/src/lib/elementary/efl_access_widget.c new file mode 100644 index 0000000000..ea26afb117 --- /dev/null +++ b/src/lib/elementary/efl_access_widget.c @@ -0,0 +1,294 @@ +#ifdef HAVE_CONFIG_H + #include "elementary_config.h" +#endif + +#define EFL_ACCESS_OBJECT_PROTECTED +#define EFL_ACCESS_COMPONENT_PROTECTED +#define EFL_ACCESS_ACTION_PROTECTED +#define EFL_ACCESS_ACTION_BETA + +#include <Elementary.h> +#include "elm_widget.h" +#include "elm_priv.h" + +#include "efl_access_widget.eo.h" + +typedef struct +{ + Efl_Access_Object *forced_parent; + Efl_Ui_Widget *widget; +} Efl_Access_Widget_Data; + +EOLIAN static void +_efl_access_widget_efl_access_component_screen_position_get(const Eo *obj, Efl_Access_Widget_Data *_pd EINA_UNUSED, int *x, int *y) +{ + Eina_Rect r = efl_access_component_extents_get(obj, EINA_TRUE); + if (x) *x = r.x; + if (y) *y = r.y; +} + +EOLIAN static Eina_Bool +_efl_access_widget_efl_access_component_screen_position_set(Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *_pd EINA_UNUSED, int x, int y) +{ + Eina_Rect r = efl_access_component_extents_get(obj, EINA_TRUE); + r.x = x; + r.y = y; + return efl_access_component_extents_set(obj, EINA_TRUE, r); +} + +EOLIAN static Eina_Bool +_efl_access_widget_efl_access_component_contains(Eo *obj, Efl_Access_Widget_Data *_pd EINA_UNUSED, Eina_Bool type, int x, int y) +{ + Eina_Rect r = efl_access_component_extents_get(obj, type); + return eina_rectangle_coords_inside(&r.rect, x, y); +} + +EOLIAN static Eo * +_efl_access_widget_efl_access_component_accessible_at_point_get(Eo *obj, Efl_Access_Widget_Data *_pd EINA_UNUSED, Eina_Bool screen_coords, int x, int y) +{ + Eina_List *l, *children; + Eo *ret = NULL, *child; + + children = efl_access_object_access_children_get(obj); + + EINA_LIST_FOREACH(children, l, child) + { + Eina_Bool contains; + if (efl_isa(child, EFL_ACCESS_COMPONENT_MIXIN)) + { + contains = efl_access_component_contains(child, screen_coords, x, y); + if (contains) + { + ret = child; + break; + } + } + } + + eina_list_free(children); + return ret; +} + +EOLIAN static Eina_Rect +_efl_access_widget_efl_access_component_extents_get(const Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *_pd EINA_UNUSED, Eina_Bool screen_coords) +{ + Eina_Rect r = EINA_RECT(-1, -1, -1, -1); + + if (!_pd->widget) + return r; + + r = efl_gfx_entity_geometry_get(_pd->widget); + if (screen_coords) + { + Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(_pd->widget)); + if (ee) + { + int ee_x = 0, ee_y = 0; + ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL); + r.x += ee_x; + r.y += ee_y; + } + } + return r; +} + +EOLIAN static Eina_Bool +_efl_access_widget_efl_access_component_extents_set(Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *_pd EINA_UNUSED, Eina_Bool screen_coords, Eina_Rect r) +{ + int wx, wy; + + if ((r.x < 0) || (r.y < 0) || (r.w < 0) || (r.h < 0)) return EINA_FALSE; + + if (screen_coords) + { + Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(_pd->widget)); + if (!ee) return EINA_FALSE; + evas_object_geometry_get(_pd->widget, &wx, &wy, NULL, NULL); + ecore_evas_move(ee, r.x - wx, r.y - wy); + } + else + evas_object_move(_pd->widget, r.x, r.y); + + evas_object_resize(_pd->widget, r.w, r.h); + return EINA_TRUE; +} + +EOLIAN static int +_efl_access_widget_efl_access_component_z_order_get(const Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *_pd EINA_UNUSED) +{ + // Currently not used. + return 0; +} + +EOLIAN static Eina_Bool +_efl_access_widget_efl_access_component_focus_grab(Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *pd) +{ + if (!pd->widget) + return EINA_FALSE; + + if (elm_object_focus_allow_get(pd->widget)) + { + Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(pd->widget)); + if (!ee) return EINA_FALSE; + ecore_evas_activate(ee); + elm_object_focus_set(pd->widget, EINA_TRUE); + return EINA_TRUE; + } + return EINA_FALSE; +} + +const char* +_elm_access_widget_accessible_plain_name_get(const Evas_Object *obj, const char* name) +{ + char *accessible_plain_name; + + Elm_Widget_Smart_Data *sd = efl_data_scope_get(obj, EFL_UI_WIDGET_CLASS); + if (!sd) return NULL; + + accessible_plain_name = _elm_util_mkup_to_text(name); + eina_stringshare_del(sd->accessible_name); + sd->accessible_name = eina_stringshare_add(accessible_plain_name); + free(accessible_plain_name); + return sd->accessible_name; +} + +EOLIAN static const char* +_efl_access_widget_efl_access_object_i18n_name_get(const Eo *obj, Efl_Access_Widget_Data *_pd) +{ + const char *ret, *name; + name = efl_access_object_i18n_name_get(efl_super(obj, EFL_ACCESS_WIDGET_CLASS)); + + if (name) return name; + + ret = elm_object_text_get(_pd->widget); + if (!ret) return NULL; + + return _elm_access_widget_accessible_plain_name_get(_pd->widget, ret); +} + +EOLIAN static Efl_Access_State_Set +_efl_access_widget_efl_access_object_state_set_get(const Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *pd) +{ + Efl_Access_State_Set states = 0; + + if (!pd->widget) + { + STATE_TYPE_SET(states, EFL_ACCESS_STATE_DEFUNCT); + return states; + } + + if (evas_object_visible_get(pd->widget)) + { + STATE_TYPE_SET(states, EFL_ACCESS_STATE_VISIBLE); + if (_elm_widget_onscreen_is(pd->widget)) + STATE_TYPE_SET(states, EFL_ACCESS_STATE_SHOWING); + } + if (!elm_widget_child_can_focus_get(pd->widget)) + { + if (elm_object_focus_allow_get(pd->widget)) + STATE_TYPE_SET(states, EFL_ACCESS_STATE_FOCUSABLE); + if (efl_ui_focus_object_focus_get(pd->widget)) + STATE_TYPE_SET(states, EFL_ACCESS_STATE_FOCUSED); + } + if (!elm_object_disabled_get(pd->widget)) + { + STATE_TYPE_SET(states, EFL_ACCESS_STATE_ENABLED); + STATE_TYPE_SET(states, EFL_ACCESS_STATE_SENSITIVE); + } + + return states; +} + +EOLIAN static Eina_List* +_efl_access_widget_efl_access_object_attributes_get(const Eo *obj, Efl_Access_Widget_Data *pd) +{ + const char *type = NULL; + const char *style = NULL; + Eina_List *attr_list = NULL; + Efl_Access_Attribute *attr = NULL; + + attr_list = efl_access_object_attributes_get(efl_super(obj, EFL_ACCESS_WIDGET_CLASS)); + + //Add type and style information in addition. + type = elm_widget_type_get(pd->widget); + if (type) + { + attr = calloc(1, sizeof(Efl_Access_Attribute)); + if (attr) + { + attr->key = eina_stringshare_add("type"); + attr->value = eina_stringshare_add(type); + attr_list = eina_list_append(attr_list, attr); + } + } + + style = elm_widget_style_get(pd->widget); + if (style) + { + attr = calloc(1, sizeof(Efl_Access_Attribute)); + if (attr) + { + attr->key = eina_stringshare_add("style"); + attr->value = eina_stringshare_add(style); + attr_list = eina_list_append(attr_list, attr); + } + } + + return attr_list; +} + +EOLIAN static Efl_Access_Object* +_efl_access_widget_efl_access_object_access_parent_get(const Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *pd) +{ + if (pd->forced_parent) + return pd->forced_parent; + + Elm_Widget_Smart_Data *sd = efl_data_scope_get(pd->widget, EFL_UI_WIDGET_CLASS); + if (!sd) return NULL; + + return sd->parent_obj ? efl_access_object_query(EFL_ACCESS_OBJECT_MIXIN, sd->parent_obj) : NULL; +} + +EOLIAN static Eina_List* +_efl_access_widget_efl_access_object_access_children_get(const Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *pd) +{ + Eina_List *l, *accs = NULL; + Evas_Object *subobj = NULL; + + Elm_Widget_Smart_Data *sd = efl_data_scope_get(pd->widget, EFL_UI_WIDGET_CLASS); + if (!sd) return NULL; + + EINA_LIST_FOREACH(sd->subobjs, l, subobj) + { + Efl_Access_Object *acc = efl_access_object_query(EFL_ACCESS_OBJECT_MIXIN, subobj); + if (acc) accs = eina_list_append(accs, acc); + } + return accs; +} + +EOLIAN static Efl_Ui_Widget* +_efl_access_widget_real_widget_get(const Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *pd) +{ + return pd->widget; +} + +EOLIAN static void +_efl_access_widget_real_widget_set(Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *pd, Efl_Ui_Widget *widget) +{ + pd->widget = widget; +} + +EOLIAN static Efl_Access_Object* +_efl_access_widget_forced_parent_get(const Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *pd) +{ + return pd->forced_parent; +} + +EOLIAN static void +_efl_access_widget_forced_parent_set(Eo *obj EINA_UNUSED, Efl_Access_Widget_Data *pd, Efl_Access_Object *parent) +{ + pd->forced_parent = parent; +} + +#include "efl_access_widget.eo.c" + diff --git a/src/lib/elementary/efl_access_widget.eo b/src/lib/elementary/efl_access_widget.eo new file mode 100644 index 0000000000..dd0468196d --- /dev/null +++ b/src/lib/elementary/efl_access_widget.eo @@ -0,0 +1,30 @@ +class Efl.Access.Widget extends Efl.Object implements Efl.Access.Object, + Efl.Access.Component +{ + methods { + @property forced_parent { + values { + parent: Efl.Access.Object; + } + } + @property real_widget { + values { + widget: Efl.Ui.Widget; + } + } + } + implements { + Efl.Access.Object.access_parent { get; } + Efl.Access.Object.access_children { get; } + Efl.Access.Object.i18n_name { get; } + Efl.Access.Object.state_set { get; } + Efl.Access.Object.attributes { get; } + Efl.Access.Component.focus_grab; + Efl.Access.Component.screen_position { get; set; } + Efl.Access.Component.contains; + Efl.Access.Component.accessible_at_point_get; + Efl.Access.Component.extents { get; set; } + Efl.Access.Component.z_order { get; } + } +} + diff --git a/src/lib/elementary/efl_access_widget.h b/src/lib/elementary/efl_access_widget.h new file mode 100644 index 0000000000..215c6266c2 --- /dev/null +++ b/src/lib/elementary/efl_access_widget.h @@ -0,0 +1,9 @@ +#ifndef EFL_ACCESS_WIDGET_H +#define EFL_ACCESS_WIDGET_H + +#ifdef EFL_EO_API_SUPPORT +typedef Eo Efl_Ui_Widget; +#include "efl_access_widget.eo.h" +#endif + +#endif diff --git a/src/lib/elementary/efl_access_widget_item.c b/src/lib/elementary/efl_access_widget_item.c new file mode 100644 index 0000000000..11fc14fc24 --- /dev/null +++ b/src/lib/elementary/efl_access_widget_item.c @@ -0,0 +1,175 @@ +#ifdef HAVE_CONFIG_H + #include "elementary_config.h" +#endif + +#define EFL_ACCESS_OBJECT_PROTECTED +#define EFL_ACCESS_COMPONENT_PROTECTED +#define EFL_ACCESS_ACTION_PROTECTED +#define EFL_ACCESS_ACTION_BETA + +#include <Elementary.h> +#include "elm_widget.h" +#include "elm_priv.h" + +#include "efl_access_widget_item.eo.h" + +EOLIAN static Eina_List * +_efl_access_widget_item_efl_access_object_attributes_get(const Eo *eo_item, void *pd EINA_UNUSED) +{ + const char *style = NULL; + Eina_List *attr_list = NULL; + Efl_Access_Attribute *attr = NULL; + + attr_list = efl_access_object_attributes_get(efl_super(eo_item, EFL_ACCESS_WIDGET_ITEM_CLASS)); + + style = elm_object_item_style_get(eo_item); + if (style) + { + attr = calloc(1, sizeof(Efl_Access_Attribute)); + if (attr) + { + attr->key = eina_stringshare_add("style"); + attr->value = eina_stringshare_add(style); + attr_list = eina_list_append(attr_list, attr); + } + } + return attr_list; +} + +EAPI Eina_Bool +_elm_widget_item_onscreen_is(const Elm_Object_Item *item) +{ + Eina_Rectangle r1, r2; + Elm_Widget_Item_Data *id = efl_data_scope_get(item, ELM_WIDGET_ITEM_CLASS); + if (!id || !id->view) return EINA_FALSE; + + if (!evas_object_visible_get(id->view)) + return EINA_FALSE; + + if (!_elm_widget_onscreen_is(id->widget)) + return EINA_FALSE; + + evas_object_geometry_get(id->view, &r1.x, &r1.y, &r1.w, &r1.h); + if (eina_rectangle_is_empty(&r1)) + return EINA_FALSE; + + evas_object_geometry_get(id->widget, &r2.x, &r2.y, &r2.w, &r2.h); + if (!eina_rectangles_intersect(&r1, &r2)) + return EINA_FALSE; + + return EINA_TRUE; +} + +EOLIAN static Efl_Access_State_Set +_efl_access_widget_item_efl_access_object_state_set_get(const Eo *eo_item, + void *item EINA_UNUSED) +{ + Efl_Access_State_Set states = 0; + + STATE_TYPE_SET(states, EFL_ACCESS_STATE_FOCUSABLE); + + if (elm_object_item_focus_get(eo_item)) + STATE_TYPE_SET(states, EFL_ACCESS_STATE_FOCUSED); + if (!elm_object_item_disabled_get(eo_item)) + { + STATE_TYPE_SET(states, EFL_ACCESS_STATE_ENABLED); + STATE_TYPE_SET(states, EFL_ACCESS_STATE_SENSITIVE); + STATE_TYPE_SET(states, EFL_ACCESS_STATE_VISIBLE); + } + if (_elm_widget_item_onscreen_is(eo_item)) + STATE_TYPE_SET(states, EFL_ACCESS_STATE_SHOWING); + + return states; +} + +EOLIAN static void +_efl_access_widget_item_efl_access_component_screen_position_get(const Eo *obj, void *_pd EINA_UNUSED, int *x, int *y) +{ + Eina_Rect r = efl_access_component_extents_get(obj, EINA_TRUE); + if (x) *x = r.x; + if (y) *y = r.y; +} + +EOLIAN static Eina_Bool +_efl_access_widget_item_efl_access_component_screen_position_set(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, int x, int y) +{ + Eina_Rect r = efl_access_component_extents_get(obj, EINA_TRUE); + r.x = x; + r.y = y; + return efl_access_component_extents_set(obj, EINA_TRUE, r); +} + +EOLIAN static Eina_Bool +_efl_access_widget_item_efl_access_component_contains(Eo *obj, void *_pd EINA_UNUSED, Eina_Bool type, int x, int y) +{ + Eina_Rect r = efl_access_component_extents_get(obj, type); + return eina_rectangle_coords_inside(&r.rect, x, y); +} + +EOLIAN static Eo * +_efl_access_widget_item_efl_access_component_accessible_at_point_get(Eo *obj, void *_pd EINA_UNUSED, Eina_Bool screen_coords, int x, int y) +{ + Eina_List *l, *children; + Eo *ret = NULL, *child; + + children = efl_access_object_access_children_get(obj); + + EINA_LIST_FOREACH(children, l, child) + { + Eina_Bool contains; + if (efl_isa(child, EFL_ACCESS_COMPONENT_MIXIN)) + { + contains = efl_access_component_contains(child, screen_coords, x, y); + if (contains) + { + ret = child; + break; + } + } + } + + eina_list_free(children); + return ret; +} + +EOLIAN static Eina_Rect +_efl_access_widget_item_efl_access_component_extents_get(const Eo *obj EINA_UNUSED, void *sd EINA_UNUSED, Eina_Bool screen_coords) +{ + Eina_Rect r = EINA_RECT(-1, -1, -1, -1); + int ee_x, ee_y; + + r = efl_gfx_entity_geometry_get(obj); + if (screen_coords) + { + Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj)); + if (ee) + { + ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL); + r.x += ee_x; + r.y += ee_y; + } + } + return r; +} + +EOLIAN static Eina_Bool +_efl_access_widget_item_efl_access_component_extents_set(Eo *obj EINA_UNUSED, void *sd EINA_UNUSED, Eina_Bool screen_coords EINA_UNUSED, Eina_Rect r EINA_UNUSED) +{ + return EINA_FALSE; +} + +EOLIAN static int +_efl_access_widget_item_efl_access_component_z_order_get(const Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED) +{ + // Currently not used. + return 0; +} + +EOLIAN static Eina_Bool +_efl_access_widget_item_efl_access_component_focus_grab(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED) +{ + elm_object_item_focus_set(obj, EINA_TRUE); + return elm_object_item_focus_get(obj); +} + +#include "efl_access_widget_item.eo.c" diff --git a/src/lib/elementary/efl_access_widget_item.eo b/src/lib/elementary/efl_access_widget_item.eo new file mode 100644 index 0000000000..3ef95157fc --- /dev/null +++ b/src/lib/elementary/efl_access_widget_item.eo @@ -0,0 +1,18 @@ +class Efl.Access.Widget_Item extends Efl.Object implements Efl.Access.Object, + Efl.Access.Component +{ + data: null; + methods { + } + implements { + Efl.Access.Object.state_set { get; } + Efl.Access.Object.attributes { get; } + Efl.Access.Component.focus_grab; + Efl.Access.Component.screen_position { get; set; } + Efl.Access.Component.contains; + Efl.Access.Component.accessible_at_point_get; + Efl.Access.Component.extents { get; set; } + Efl.Access.Component.z_order { get; } + } +} + diff --git a/src/lib/elementary/efl_access_widget_item.h b/src/lib/elementary/efl_access_widget_item.h new file mode 100644 index 0000000000..8c6dd1dc4d --- /dev/null +++ b/src/lib/elementary/efl_access_widget_item.h @@ -0,0 +1,10 @@ +#ifndef EFL_ACCESS_WIDGET_H +#define EFL_ACCESS_WIDGET_H + +#ifdef EFL_EO_API_SUPPORT +typedef Eo Elm_Widget_Item; +#include "efl_access_widget_item.eo.h" +#endif + +#endif + diff --git a/src/lib/elementary/efl_ui_widget.c b/src/lib/elementary/efl_ui_widget.c index b3e10a35be..cda93675d3 100644 --- a/src/lib/elementary/efl_ui_widget.c +++ b/src/lib/elementary/efl_ui_widget.c @@ -2,8 +2,6 @@ # include "elementary_config.h" #endif -#define EFL_ACCESS_OBJECT_PROTECTED -#define EFL_ACCESS_COMPONENT_PROTECTED #define ELM_WIDGET_PROTECTED #define ELM_WIDGET_ITEM_PROTECTED #define EFL_CANVAS_OBJECT_BETA @@ -947,20 +945,6 @@ _efl_ui_widget_efl_gfx_entity_visible_set(Eo *obj, Elm_Widget_Smart_Data *pd, Ei efl_gfx_entity_visible_set(o, vis); } eina_iterator_free(it); - - if (!_elm_config->atspi_mode || pd->on_destroy) - return; - - if (vis) - { - efl_access_added(obj); - if (_elm_widget_onscreen_is(obj)) - efl_access_state_changed_signal_emit(obj, EFL_ACCESS_STATE_SHOWING, EINA_TRUE); - } - else - { - efl_access_state_changed_signal_emit(obj, EFL_ACCESS_STATE_SHOWING, EINA_FALSE); - } } EOLIAN static void @@ -1573,14 +1557,6 @@ _efl_ui_widget_widget_sub_object_add(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Ob elm_widget_display_mode_set(sobj, evas_object_size_hint_display_mode_get(obj)); - if (_elm_config->atspi_mode && !sd->on_create) - { - Efl_Access_Object *aparent; - aparent = efl_access_object_access_parent_get(sobj); - if (aparent) - efl_access_children_changed_added_signal_emit(aparent, sobj); - } - } end: @@ -1652,13 +1628,6 @@ _efl_ui_widget_widget_sub_object_del(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Ob parent = sdp->parent_obj; } } - if (_elm_config->atspi_mode && !sd->on_destroy) - { - Efl_Access_Object *aparent; - aparent = efl_access_object_access_parent_get(sobj); - if (aparent) - efl_access_children_changed_del_signal_emit(aparent, sobj); - } ELM_WIDGET_DATA_GET(sobj, sdc); sdc->parent_obj = NULL; @@ -4059,8 +4028,6 @@ _elm_widget_item_efl_object_destructor(Eo *eo_item, Elm_Widget_Item_Data *item) } eina_hash_free(item->labels); - efl_access_removed(eo_item); - EINA_MAGIC_SET(item, EINA_MAGIC_NONE); efl_destructor(efl_super(eo_item, ELM_WIDGET_ITEM_CLASS)); @@ -4222,30 +4189,6 @@ _elm_widget_onscreen_is(const Evas_Object *widget) return EINA_TRUE; } -EAPI Eina_Bool -_elm_widget_item_onscreen_is(const Elm_Object_Item *item) -{ - Eina_Rectangle r1, r2; - Elm_Widget_Item_Data *id = efl_data_scope_get(item, ELM_WIDGET_ITEM_CLASS); - if (!id || !id->view) return EINA_FALSE; - - if (!evas_object_visible_get(id->view)) - return EINA_FALSE; - - if (!_elm_widget_onscreen_is(id->widget)) - return EINA_FALSE; - - evas_object_geometry_get(id->view, &r1.x, &r1.y, &r1.w, &r1.h); - if (eina_rectangle_is_empty(&r1)) - return EINA_FALSE; - - evas_object_geometry_get(id->widget, &r2.x, &r2.y, &r2.w, &r2.h); - if (!eina_rectangles_intersect(&r1, &r2)) - return EINA_FALSE; - - return EINA_TRUE; -} - const char* _elm_widget_accessible_plain_name_get(const Evas_Object *obj, const char* name) { @@ -4275,28 +4218,6 @@ _elm_widget_item_accessible_plain_name_get(const Elm_Object_Item *item, const ch return id->accessible_name; } -EOLIAN static Efl_Access_State_Set -_elm_widget_item_efl_access_object_state_set_get(const Eo *eo_item, - Elm_Widget_Item_Data *item EINA_UNUSED) -{ - Efl_Access_State_Set states = 0; - - STATE_TYPE_SET(states, EFL_ACCESS_STATE_FOCUSABLE); - - if (elm_object_item_focus_get(eo_item)) - STATE_TYPE_SET(states, EFL_ACCESS_STATE_FOCUSED); - if (!elm_object_item_disabled_get(eo_item)) - { - STATE_TYPE_SET(states, EFL_ACCESS_STATE_ENABLED); - STATE_TYPE_SET(states, EFL_ACCESS_STATE_SENSITIVE); - STATE_TYPE_SET(states, EFL_ACCESS_STATE_VISIBLE); - } - if (_elm_widget_item_onscreen_is(eo_item)) - STATE_TYPE_SET(states, EFL_ACCESS_STATE_SHOWING); - - return states; -} - EAPI void elm_object_item_data_set(Elm_Object_Item *it, void *data) { @@ -5342,8 +5263,6 @@ _efl_ui_widget_efl_object_constructor(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UN efl_ui_widget_parent_set(obj, parent); sd->on_create = EINA_FALSE; - efl_access_object_role_set(obj, EFL_ACCESS_ROLE_UNKNOWN); - return obj; } @@ -5368,7 +5287,6 @@ _efl_ui_widget_efl_object_destructor(Eo *obj, Elm_Widget_Smart_Data *sd) efl_event_callback_del(sd->manager.provider, EFL_UI_FOCUS_OBJECT_EVENT_MANAGER_CHANGED, _manager_changed_cb, obj); sd->manager.provider = NULL; } - efl_access_removed(obj); if (sd->logical.parent) { efl_weak_unref(&sd->logical.parent); @@ -5405,9 +5323,6 @@ _efl_ui_widget_efl_ui_focus_object_on_focus_update(Eo *obj, Elm_Widget_Smart_Dat if (!sd->resize_obj) evas_object_focus_set(obj, focused); - if (_elm_config->atspi_mode && !elm_widget_child_can_focus_get(obj)) - efl_access_state_changed_signal_emit(obj, EFL_ACCESS_STATE_FOCUSED, focused); - return EINA_TRUE; } @@ -5437,180 +5352,6 @@ _efl_ui_widget_class_constructor(Efl_Class *klass) evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass); } -EOLIAN static Eina_Bool -_efl_ui_widget_efl_access_component_focus_grab(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED) -{ - if (elm_object_focus_allow_get(obj)) - { - Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj)); - if (!ee) return EINA_FALSE; - ecore_evas_activate(ee); - elm_object_focus_set(obj, EINA_TRUE); - return EINA_TRUE; - } - return EINA_FALSE; -} - -EOLIAN static const char* -_efl_ui_widget_efl_access_object_i18n_name_get(const Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED) -{ - const char *ret, *name; - name = efl_access_object_i18n_name_get(efl_super(obj, EFL_UI_WIDGET_CLASS)); - - if (name) return name; - - ret = elm_object_text_get(obj); - if (!ret) return NULL; - - return _elm_widget_accessible_plain_name_get(obj, ret); -} - -EOLIAN static Eina_List* -_efl_ui_widget_efl_access_object_access_children_get(const Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd) -{ - Eina_List *l, *accs = NULL; - Evas_Object *widget; - - EINA_LIST_FOREACH(pd->subobjs, l, widget) - { - if (!elm_object_widget_check(widget)) continue; - if (!efl_isa(widget, EFL_ACCESS_OBJECT_MIXIN)) continue; - accs = eina_list_append(accs, widget); - } - return accs; -} - -EOLIAN static Efl_Access_Object* -_efl_ui_widget_efl_access_object_access_parent_get(const Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd) -{ - return pd->parent_obj; -} - -EOLIAN static Efl_Access_State_Set -_efl_ui_widget_efl_access_object_state_set_get(const Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED) -{ - Efl_Access_State_Set states = 0; - - states = efl_access_object_state_set_get(efl_super(obj, EFL_UI_WIDGET_CLASS)); - - if (evas_object_visible_get(obj)) - { - STATE_TYPE_SET(states, EFL_ACCESS_STATE_VISIBLE); - if (_elm_widget_onscreen_is(obj)) - STATE_TYPE_SET(states, EFL_ACCESS_STATE_SHOWING); - } - if (!elm_widget_child_can_focus_get(obj)) - { - if (elm_object_focus_allow_get(obj)) - STATE_TYPE_SET(states, EFL_ACCESS_STATE_FOCUSABLE); - if (elm_object_focus_get(obj)) - STATE_TYPE_SET(states, EFL_ACCESS_STATE_FOCUSED); - } - if (!elm_object_disabled_get(obj)) - { - STATE_TYPE_SET(states, EFL_ACCESS_STATE_ENABLED); - STATE_TYPE_SET(states, EFL_ACCESS_STATE_SENSITIVE); - } - - return states; -} - -EOLIAN static Eina_List* -_efl_ui_widget_efl_access_object_attributes_get(const Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED) -{ - const char *type = NULL; - const char *style = NULL; - Eina_List *attr_list = NULL; - Efl_Access_Attribute *attr = NULL; - - attr_list = efl_access_object_attributes_get(efl_super(obj, EFL_UI_WIDGET_CLASS)); - - //Add type and style information in addition. - type = elm_widget_type_get(obj); - if (type) - { - attr = calloc(1, sizeof(Efl_Access_Attribute)); - if (attr) - { - attr->key = eina_stringshare_add("type"); - attr->value = eina_stringshare_add(type); - attr_list = eina_list_append(attr_list, attr); - } - } - - style = elm_widget_style_get(obj); - if (style) - { - attr = calloc(1, sizeof(Efl_Access_Attribute)); - if (attr) - { - attr->key = eina_stringshare_add("style"); - attr->value = eina_stringshare_add(style); - attr_list = eina_list_append(attr_list, attr); - } - } - - return attr_list; -} - -EOLIAN static Eina_List * -_elm_widget_item_efl_access_object_attributes_get(const Eo *eo_item, Elm_Widget_Item_Data *pd EINA_UNUSED) -{ - const char *style = NULL; - Eina_List *attr_list = NULL; - Efl_Access_Attribute *attr = NULL; - - attr_list = efl_access_object_attributes_get(efl_super(eo_item, ELM_WIDGET_ITEM_CLASS)); - - style = elm_object_item_style_get(eo_item); - if (style) - { - attr = calloc(1, sizeof(Efl_Access_Attribute)); - if (attr) - { - attr->key = eina_stringshare_add("style"); - attr->value = eina_stringshare_add(style); - attr_list = eina_list_append(attr_list, attr); - } - } - return attr_list; -} - -EOLIAN static Eina_Rect -_elm_widget_item_efl_access_component_extents_get(const Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd EINA_UNUSED, Eina_Bool screen_coords) -{ - Eina_Rect r = EINA_RECT(-1, -1, -1, -1); - int ee_x, ee_y; - - if (!sd->view) return r; - - r = efl_gfx_entity_geometry_get(sd->view); - if (screen_coords) - { - Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(sd->view)); - if (ee) - { - ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL); - r.x += ee_x; - r.y += ee_y; - } - } - return r; -} - -EOLIAN static Eina_Bool -_elm_widget_item_efl_access_component_extents_set(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd EINA_UNUSED, Eina_Bool screen_coords EINA_UNUSED, Eina_Rect r EINA_UNUSED) -{ - return EINA_FALSE; -} - -EOLIAN static Eina_Bool -_elm_widget_item_efl_access_component_focus_grab(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *_pd EINA_UNUSED) -{ - elm_object_item_focus_set(obj, EINA_TRUE); - return elm_object_item_focus_get(obj); -} - EOLIAN static Efl_Object * _efl_ui_widget_efl_object_provider_find(const Eo *obj, Elm_Widget_Smart_Data *pd, const Efl_Object *klass) { @@ -5619,8 +5360,10 @@ _efl_ui_widget_efl_object_provider_find(const Eo *obj, Elm_Widget_Smart_Data *pd if ((klass == EFL_CONFIG_INTERFACE) || (klass == EFL_CONFIG_GLOBAL_CLASS)) return _efl_config_obj; - if (klass == EFL_ACCESS_OBJECT_MIXIN) - return (Eo*)obj; + if ((klass == EFL_ACCESS_OBJECT_MIXIN) || (klass == EFL_ACCESS_WIDGET_CLASS)) + { + return efl_ui_widget_access_object_get(obj); + } if (pd->provider_lookup) return NULL; pd->provider_lookup = EINA_TRUE; @@ -6127,6 +5870,25 @@ _efl_ui_widget_part_bg_efl_gfx_image_scale_type_get(const Eo *obj, void *pd EINA return efl_gfx_image_scale_type_get(bg_obj); } +EOLIAN static Efl_Access_Widget* +_efl_ui_widget_access_object_create(Eo *obj, Efl_Ui_Widget_Data *sd EINA_UNUSED) +{ + Efl_Access_Widget *access = efl_add(EFL_ACCESS_WIDGET_CLASS, obj); + efl_access_widget_real_widget_set(access, obj); + return access; +} + +EOLIAN static Efl_Access_Widget* +_efl_ui_widget_access_object_get(const Eo *obj, Efl_Ui_Widget_Data *sd) +{ + if (!sd->access_obj) + { + sd->access_obj = efl_ui_widget_access_object_create((Eo*)obj); + efl_parent_set(sd->access_obj, (Eo*)obj); + } + return sd->access_obj; +} + #include "efl_ui_widget_part_bg.eo.c" /* Efl.Part Bg end */ diff --git a/src/lib/elementary/efl_ui_widget.eo b/src/lib/elementary/efl_ui_widget.eo index eb45b2e0ea..36cef91367 100644 --- a/src/lib/elementary/efl_ui_widget.eo +++ b/src/lib/elementary/efl_ui_widget.eo @@ -553,6 +553,18 @@ abstract Efl.Ui.Widget extends Efl.Canvas.Group implements Efl.Access.Object, } return: bool; [[Returns whether the widget is registered or not.]] } + access_object_create @protected { + [[ Accessibility object constructor ]] + return: Efl.Access.Widget; + } + @property access_object { + [[ Object providing accessibility features for this widget ]] + get { + } + values { + access: Efl.Access.Widget; + } + } } parts { shadow: Efl.Ui.Widget_Part_Shadow; @@ -576,12 +588,6 @@ abstract Efl.Ui.Widget extends Efl.Canvas.Group implements Efl.Access.Object, Efl.Canvas.Group.group_calculate; Efl.Canvas.Group.group_member_del; Efl.Canvas.Group.group_member_add; - Efl.Access.Object.i18n_name { get; } - Efl.Access.Object.state_set { get; } - Efl.Access.Object.access_children { get; } - Efl.Access.Object.access_parent { get; } - Efl.Access.Object.attributes { get; } - Efl.Access.Component.focus_grab; Efl.Ui.Focus.Object.focus_manager { get; } Efl.Ui.Focus.Object.focus_parent { get; } Efl.Ui.Focus.Object.focus_geometry { get; } diff --git a/src/lib/elementary/elm_widget.h b/src/lib/elementary/elm_widget.h index 99229851f8..133d45cce9 100644 --- a/src/lib/elementary/elm_widget.h +++ b/src/lib/elementary/elm_widget.h @@ -382,6 +382,7 @@ typedef struct _Elm_Widget_Smart_Data Evas_Object *prev, *next, *up, *down, *right, *left; Elm_Object_Item *item_prev, *item_next, *item_up, *item_down, *item_right, *item_left; } legacy_focus; + Efl_Access_Object *access_obj; Eina_Bool scroll_x_locked : 1; Eina_Bool scroll_y_locked : 1; diff --git a/src/lib/elementary/elm_widget_item.eo b/src/lib/elementary/elm_widget_item.eo index 7f221e26d5..3cef90e2bc 100644 --- a/src/lib/elementary/elm_widget_item.eo +++ b/src/lib/elementary/elm_widget_item.eo @@ -4,8 +4,7 @@ import efl_ui; type Elm_Tooltip_Item_Content_Cb: __undefined_type; [[Elementary tooltip item content callback type]] type Elm_Object_Item_Signal_Cb: __undefined_type; [[Elementary object item signal callback type]] -class Elm.Widget.Item extends Efl.Object implements Efl.Access.Object, - Efl.Access.Component +class Elm.Widget.Item extends Efl.Object implements Efl.Access.Object { [[Elementary widget item class]] eo_prefix: elm_wdg_item; @@ -539,9 +538,5 @@ class Elm.Widget.Item extends Efl.Object implements Efl.Access.Object, Efl.Object.constructor; Efl.Object.destructor; Efl.Object.invalidate; - Efl.Access.Object.state_set { get; } - Efl.Access.Object.attributes { get; } - Efl.Access.Component.extents { get; set; } - Efl.Access.Component.focus_grab; } } |