summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukasz Stanislawski <l.stanislaws@samsung.com>2014-05-27 16:23:13 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2014-05-27 16:23:13 +0900
commit0c26825eb931c80aa17b5caa1cec76e4cd08c960 (patch)
tree3af45ee9f30c2b2e25936d1f09106b2582856403
parent35021cfd6e87704971bc3005d1e500e05f206212 (diff)
downloadelementary-0c26825eb931c80aa17b5caa1cec76e4cd08c960.tar.gz
atspi: add AtspiImage interface support.
Summary: Sample implementation for elm_image added. Reviewers: raster, seoz Differential Revision: https://phab.enlightenment.org/D794
-rw-r--r--src/lib/Makefile.am5
-rw-r--r--src/lib/elm_atspi_bridge.c118
-rw-r--r--src/lib/elm_image.c27
-rw-r--r--src/lib/elm_image.eo3
-rw-r--r--src/lib/elm_interface_atspi_image.c43
-rw-r--r--src/lib/elm_interface_atspi_image.eo43
6 files changed, 238 insertions, 1 deletions
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 075becc1a..f012fb516 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 216fdfd04..a488c6283 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 ac90ce880..7125fe3df 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 812b0ad3c..5e4a49820 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 000000000..bc4df190a
--- /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 000000000..3d072a8d9
--- /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;
+ }
+}