raster pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=0c26825eb931c80aa17b5caa1cec76e4cd08c960
commit 0c26825eb931c80aa17b5caa1cec76e4cd08c960 Author: Lukasz Stanislawski <l.stanisl...@samsung.com> Date: Tue May 27 16:23:13 2014 +0900 atspi: add AtspiImage interface support. Summary: Sample implementation for elm_image added. Reviewers: raster, seoz Differential Revision: https://phab.enlightenment.org/D794 --- src/lib/Makefile.am | 5 ++ src/lib/elm_atspi_bridge.c | 118 +++++++++++++++++++++++++++++++++++ src/lib/elm_image.c | 27 ++++++++ src/lib/elm_image.eo | 3 +- src/lib/elm_interface_atspi_image.c | 43 +++++++++++++ src/lib/elm_interface_atspi_image.eo | 43 +++++++++++++ 6 files changed, 238 insertions(+), 1 deletion(-) diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 075becc..f012fb5 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -452,6 +452,7 @@ elm_index.c \ elm_interface_atspi_accessible.c \ elm_interface_atspi_action.c \ elm_interface_atspi_component.c \ +elm_interface_atspi_image.c \ elm_interface_atspi_value.c \ elm_interface_atspi_widget.c \ elm_interface_atspi_widget_action.c \ @@ -658,6 +659,8 @@ BUILT_SOURCES = \ elm_interface_atspi_action.eo.h \ elm_interface_atspi_component.eo.c \ elm_interface_atspi_component.eo.h \ + elm_interface_atspi_image.eo.c \ + elm_interface_atspi_image.eo.h \ elm_interface_atspi_value.eo.c \ elm_interface_atspi_value.eo.h \ elm_interface_atspi_widget.eo.c \ @@ -789,6 +792,7 @@ elementaryeolianfiles_DATA = \ elm_interface_atspi_accessible.eo \ elm_interface_atspi_action.eo \ elm_interface_atspi_component.eo \ + elm_interface_atspi_image.eo \ elm_interface_atspi_value.eo \ elm_interface_atspi_widget.eo \ elm_interface_atspi_widget_action.eo \ @@ -881,6 +885,7 @@ nodist_includesunstable_HEADERS = \ elm_interface_atspi_accessible.eo.h \ elm_interface_atspi_action.eo.h \ elm_interface_atspi_component.eo.h \ + elm_interface_atspi_image.eo.h \ elm_interface_atspi_value.eo.h \ elm_interface_atspi_widget.eo.h \ elm_interface_atspi_widget_action.eo.h \ diff --git a/src/lib/elm_atspi_bridge.c b/src/lib/elm_atspi_bridge.c index 216fdfd..a488c62 100644 --- a/src/lib/elm_atspi_bridge.c +++ b/src/lib/elm_atspi_bridge.c @@ -6,6 +6,7 @@ #define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED #define ELM_INTERFACE_ATSPI_ACTION_PROTECTED #define ELM_INTERFACE_ATSPI_VALUE_PROTECTED +#define ELM_INTERFACE_ATSPI_IMAGE_PROTECTED #include "atspi/atspi-constants.h" #include <stdint.h> @@ -19,6 +20,7 @@ #include "elm_interface_atspi_window.eo.h" #include "elm_interface_atspi_action.eo.h" #include "elm_interface_atspi_value.eo.h" +#include "elm_interface_atspi_image.eo.h" /* * Accessibility Bus info not defined in atspi-constants.h @@ -706,6 +708,80 @@ static const Eldbus_Method action_methods[] = { { NULL, NULL, NULL, NULL, 0 } }; +static Eldbus_Message * +_image_extents_get(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) +{ + AtspiCoordType type; + Eldbus_Message *ret; + const char *obj_path = eldbus_service_object_path_get(iface); + int x, y, w, h; + Eina_Bool screen_coords; + Eo *obj = _access_object_from_path(obj_path); + + x = y = w = h = -1; + + if (!eldbus_message_arguments_get(msg, "u", &type)) + return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.InvalidArgs", "Invalid index type."); + + ret = eldbus_message_method_return_new(msg); + EINA_SAFETY_ON_NULL_RETURN_VAL(ret, NULL); + + screen_coords = type == ATSPI_COORD_TYPE_SCREEN ? EINA_TRUE : EINA_FALSE; + eo_do(obj, elm_interface_atspi_image_extents_get(screen_coords, &x, &y, &w, &h)); + eldbus_message_arguments_append(ret, "iiii", x, y, w, h); + + return ret; +} + +static Eldbus_Message * +_image_position_get(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) +{ + AtspiCoordType type; + Eldbus_Message *ret; + const char *obj_path = eldbus_service_object_path_get(iface); + Eo *obj = _access_object_from_path(obj_path); + int x = -1, y = -1; + Eina_Bool screen_coords; + + if (!eldbus_message_arguments_get(msg, "u", &type)) + return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.InvalidArgs", "Invalid index type."); + + ret = eldbus_message_method_return_new(msg); + EINA_SAFETY_ON_NULL_RETURN_VAL(ret, NULL); + + screen_coords = type == ATSPI_COORD_TYPE_SCREEN ? EINA_TRUE : EINA_FALSE; + eo_do(obj, elm_interface_atspi_image_extents_get(screen_coords, &x, &y, NULL, NULL)); + eldbus_message_arguments_append(ret, "i", x); + eldbus_message_arguments_append(ret, "i", y); + + return ret; +} + +static Eldbus_Message * +_image_size_get(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) +{ + Eldbus_Message *ret; + const char *obj_path = eldbus_service_object_path_get(iface); + Eo *obj = _access_object_from_path(obj_path); + int w = -1, h = -1; + + ret = eldbus_message_method_return_new(msg); + EINA_SAFETY_ON_NULL_RETURN_VAL(ret, NULL); + + eo_do(obj, elm_interface_atspi_image_extents_get(EINA_FALSE, NULL, NULL, &w, &h)); + eldbus_message_arguments_append(ret, "i", w); + eldbus_message_arguments_append(ret, "i", h); + + return ret; +} + +static const Eldbus_Method image_methods[] = { + { "GetImageExtents", ELDBUS_ARGS({"u", "coordType"}), ELDBUS_ARGS({"iiii", "extents"}), _image_extents_get, 0 }, + { "GetImagePosition", ELDBUS_ARGS({"u", "coordType"}), ELDBUS_ARGS({"i", "x"}, {"i", "y"}), _image_position_get, 0 }, + { "GetImageSize", NULL, ELDBUS_ARGS({"i", "width"}, {"i", "height"}), _image_size_get, 0 }, + { NULL, NULL, NULL, NULL, 0 } +}; + static Eo * _access_object_from_path(const char *path) { @@ -875,6 +951,34 @@ _value_properties_get(const Eldbus_Service_Interface *interface, const char *pro return EINA_FALSE; } +static Eina_Bool +_image_properties_get(const Eldbus_Service_Interface *interface, const char *property, + Eldbus_Message_Iter *iter, const Eldbus_Message *request_msg EINA_UNUSED, + Eldbus_Message **error EINA_UNUSED) +{ + const char *value; + const char *obj_path = eldbus_service_object_path_get(interface); + Eo *obj = _access_object_from_path(obj_path); + + EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE); + + if (!strcmp(property, "ImageDescription")) + { + eo_do(obj, value = elm_interface_atspi_image_description_get()); + value = value ? value : ""; + eldbus_message_iter_basic_append(iter, 's', value); + return EINA_TRUE; + } + if (!strcmp(property, "ImageLocale")) + { + eo_do(obj, value = elm_interface_atspi_image_locale_get()); + value = value ? value : ""; + eldbus_message_iter_basic_append(iter, 's', value); + return EINA_TRUE; + } + return EINA_FALSE; +} + static const Eldbus_Property accessible_properties[] = { { "Name", "s", _accessible_property_get, NULL, 0 }, { "Description", "s", _accessible_property_get, NULL, 0 }, @@ -896,6 +1000,12 @@ static const Eldbus_Property value_properties[] = { { NULL, NULL, NULL, NULL, 0 } }; +static const Eldbus_Property image_properties[] = { + { "ImageDescription", "s", NULL, NULL, 0 }, + { "ImageLocale", "s", NULL, NULL, 0 }, + { NULL, NULL, NULL, NULL, 0 } +}; + static const Eldbus_Service_Interface_Desc accessible_iface_desc = { ATSPI_DBUS_INTERFACE_ACCESSIBLE, accessible_methods, NULL, accessible_properties, _accessible_property_get, NULL }; @@ -916,6 +1026,10 @@ static const Eldbus_Service_Interface_Desc value_iface_desc = { ATSPI_DBUS_INTERFACE_VALUE, NULL, NULL, value_properties, _value_properties_get, _value_properties_set }; +static const Eldbus_Service_Interface_Desc image_iface_desc = { + ATSPI_DBUS_INTERFACE_IMAGE, image_methods, NULL, image_properties, _image_properties_get, NULL +}; + static void _object_append_reference(Eldbus_Message_Iter *iter, Eo *obj) { @@ -994,6 +1108,8 @@ _append_item_fn(const Eina_Hash *hash EINA_UNUSED, const void *key EINA_UNUSED, eldbus_message_iter_basic_append(iter_sub_array, 's', ATSPI_DBUS_INTERFACE_ACTION); if (eo_isa(data, ELM_INTERFACE_ATSPI_VALUE_CLASS)) eldbus_message_iter_basic_append(iter_sub_array, 's', ATSPI_DBUS_INTERFACE_VALUE); + if (eo_isa(data, ELM_INTERFACE_ATSPI_IMAGE_CLASS)) + eldbus_message_iter_basic_append(iter_sub_array, 's', ATSPI_DBUS_INTERFACE_IMAGE); eldbus_message_iter_container_close(iter_struct, iter_sub_array); @@ -1887,6 +2003,8 @@ static void _object_register(Eo *obj, char *path) eldbus_service_interface_register(_a11y_bus, path, &action_iface_desc); if (eo_isa(obj, ELM_INTERFACE_ATSPI_VALUE_CLASS)) eldbus_service_interface_register(_a11y_bus, path, &value_iface_desc); + if (eo_isa(obj, ELM_INTERFACE_ATSPI_IMAGE_CLASS)) + eldbus_service_interface_register(_a11y_bus, path, &image_iface_desc); } } diff --git a/src/lib/elm_image.c b/src/lib/elm_image.c index ac90ce8..7125fe3 100644 --- a/src/lib/elm_image.c +++ b/src/lib/elm_image.c @@ -7,6 +7,9 @@ #include "elm_priv.h" #include "elm_widget_image.h" +#define ELM_INTERFACE_ATSPI_IMAGE_PROTECTED +#include "elm_interface_atspi_image.eo.h" + #define FMT_SIZE_T "%zu" #define MY_CLASS ELM_OBJ_IMAGE_CLASS @@ -1313,4 +1316,28 @@ _elm_image_class_constructor(Eo_Class *klass) evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass); } +// A11Y + +EOLIAN static void +_elm_image_elm_interface_atspi_image_extents_get(Eo *obj, Elm_Image_Data *sd EINA_UNUSED, Eina_Bool screen_coords, int *x, int *y, int *w, int *h) +{ + int ee_x, ee_y; + Evas_Object *image = elm_image_object_get(obj); + if (!image) return; + + evas_object_geometry_get(image, x, y, NULL, NULL); + if (screen_coords) + { + Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(image)); + if (!ee) return; + ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL); + if (x) *x += ee_x; + if (y) *y += ee_y; + } + elm_image_object_size_get(obj, w, h); +} + + +// A11Y - END + #include "elm_image.eo.c" diff --git a/src/lib/elm_image.eo b/src/lib/elm_image.eo index 812b0ad..5e4a498 100644 --- a/src/lib/elm_image.eo +++ b/src/lib/elm_image.eo @@ -1,4 +1,4 @@ -class Elm_Image (Elm_Widget, Evas_Clickable_Interface) +class Elm_Image (Elm_Widget, Evas_Clickable_Interface, Elm_Interface_Atspi_Image) { eo_prefix: elm_obj_image; properties { @@ -547,6 +547,7 @@ class Elm_Image (Elm_Widget, Evas_Clickable_Interface) Evas_Smart::resize; Elm_Widget::theme_apply; Elm_Widget::event; + Elm_Interface_Atspi_Image::extents::get; } events { drop; diff --git a/src/lib/elm_interface_atspi_image.c b/src/lib/elm_interface_atspi_image.c new file mode 100644 index 0000000..bc4df19 --- /dev/null +++ b/src/lib/elm_interface_atspi_image.c @@ -0,0 +1,43 @@ +#ifdef HAVE_CONFIG_H + #include "elementary_config.h" +#endif + +#include <Elementary.h> +#include "elm_widget.h" +#include "elm_priv.h" + +#define ELM_INTERFACE_ATSPI_IMAGE_PROTECTED + +#include "elm_interface_atspi_image.eo.h" + +static void +_free_desc(void *data) +{ + eina_stringshare_del(data); +} + +EOLIAN static const char* +_elm_interface_atspi_image_description_get(Eo *obj, void *sd EINA_UNUSED) +{ + const char *descr = NULL; + + eo_do(obj, descr = eo_key_data_get("atspi_image_description")); + return descr; +} + +EOLIAN static void +_elm_interface_atspi_image_description_set(Eo *obj, void *sd EINA_UNUSED, const char *description) +{ + const char *descr = eina_stringshare_add(description); + eo_do(obj, eo_key_data_set("atspi_image_description", descr, _free_desc)); +} + +EOLIAN static const char* +_elm_interface_atspi_image_locale_get(Eo *obj EINA_UNUSED, void *sd EINA_UNUSED) +{ + // by default assume that descriptions are given in language of current + // locale. + return getenv("LANG"); +} + +#include "elm_interface_atspi_image.eo.c" diff --git a/src/lib/elm_interface_atspi_image.eo b/src/lib/elm_interface_atspi_image.eo new file mode 100644 index 0000000..3d072a8 --- /dev/null +++ b/src/lib/elm_interface_atspi_image.eo @@ -0,0 +1,43 @@ +mixin Elm_Interface_Atspi_Image () +{ + legacy_prefix: null; + eo_prefix: elm_interface_atspi_image; + data: null; + properties { + protected extents { + get { + /*@ Gets an image extents. */ + } + keys { + Eina_Bool screen_coords; + } + values { + int x; + int y; + int width; + int height; + } + } + description { + get { + /* Gets textual description of image */ + } + set { + } + values { + const char *description; + } + } + protected locale { + get { + /* Gets locale of the image description. */ + } + values { + const char *locale; + } + } + } + implements { + virtual::extents::get; + } +} --