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;
+   }
+}

-- 


Reply via email to