summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukasz Stanislawski <lukasz.stanislawski@gmail.com>2019-02-13 23:37:58 +0100
committerLukasz Stanislawski <lukasz.stanislawski@gmail.com>2019-02-13 23:37:58 +0100
commitb304292c8fdc07c61b2f179a6038e581279a94db (patch)
treef471dadde2b49d037d21838bb43eec1be97c7cf0
parent05d432a3285f09c767e3cdb3a173ec0eb763de60 (diff)
downloadefl-b304292c8fdc07c61b2f179a6038e581279a94db.tar.gz
elementary: add Efl.Access.Widget and Efl.Access.Widget_Item classes
-rw-r--r--src/Makefile_Elementary.am6
-rw-r--r--src/lib/elementary/Elementary.h4
-rw-r--r--src/lib/elementary/efl_access_widget.c294
-rw-r--r--src/lib/elementary/efl_access_widget.eo30
-rw-r--r--src/lib/elementary/efl_access_widget.h9
-rw-r--r--src/lib/elementary/efl_access_widget_item.c175
-rw-r--r--src/lib/elementary/efl_access_widget_item.eo18
-rw-r--r--src/lib/elementary/efl_access_widget_item.h10
-rw-r--r--src/lib/elementary/efl_ui_widget.c284
-rw-r--r--src/lib/elementary/efl_ui_widget.eo18
-rw-r--r--src/lib/elementary/elm_widget.h1
-rw-r--r--src/lib/elementary/elm_widget_item.eo7
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;
}
}