From c22a02deaa59a6568c989df606cf84b3860933d3 Mon Sep 17 00:00:00 2001 From: Mike Gorse Date: Fri, 9 Apr 2010 16:51:56 -0400 Subject: [PATCH] Plug/socket fixes Override GetExtents, GetSize, and GetPosition for a plug to query the socket. Do not register an application if the root is an AtkPlug. Move Embedded method to the Socket interface. --- atk-adaptor/adaptors/Makefile.am | 1 + atk-adaptor/adaptors/accessible-adaptor.c | 22 ---- atk-adaptor/adaptors/socket-adaptor.c | 205 ++++++++++++++++++++++++++++++ atk-adaptor/bridge.c | 5 +- 4 files changed, 209 insertions(+), 24 deletions(-) create mode 100644 atk-adaptor/adaptors/socket-adaptor.c diff --git a/atk-adaptor/adaptors/Makefile.am b/atk-adaptor/adaptors/Makefile.am index 28991fb..59a6ece 100644 --- a/atk-adaptor/adaptors/Makefile.am +++ b/atk-adaptor/adaptors/Makefile.am @@ -25,6 +25,7 @@ libatk_bridge_adaptors_la_SOURCES =\ hypertext-adaptor.c \ image-adaptor.c \ selection-adaptor.c \ + socket-adaptor.c \ table-adaptor.c \ text-adaptor.c \ value-adaptor.c diff --git a/atk-adaptor/adaptors/accessible-adaptor.c b/atk-adaptor/adaptors/accessible-adaptor.c index 818fca4..b40c5f9 100644 --- a/atk-adaptor/adaptors/accessible-adaptor.c +++ b/atk-adaptor/adaptors/accessible-adaptor.c @@ -496,27 +496,6 @@ impl_GetInterfaces (DBusConnection * bus, return reply; } -static DBusMessage * -impl_Embedded (DBusConnection *bus, - DBusMessage *message, - void *user_data) -{ - AtkObject *object = (AtkObject *) user_data; - char *path; - gchar *id; - - if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) - { - return droute_invalid_arguments_error (message); - } - id = g_object_get_data (G_OBJECT (object), "dbus-plug-parent"); - if (id) - g_free (id); - id = g_strconcat (dbus_message_get_sender (message), ":", path, NULL); - g_object_set_data (G_OBJECT (object), "dbus-plug-parent", id); - return dbus_message_new_method_return (message); -} - static DRouteMethod methods[] = { {impl_GetChildAtIndex, "GetChildAtIndex"}, {impl_GetChildren, "GetChildren"}, @@ -529,7 +508,6 @@ static DRouteMethod methods[] = { {impl_GetAttributes, "GetAttributes"}, {impl_GetApplication, "GetApplication"}, {impl_GetInterfaces, "GetInterfaces"}, - {impl_Embedded, "Embedded"}, {NULL, NULL} }; diff --git a/atk-adaptor/adaptors/socket-adaptor.c b/atk-adaptor/adaptors/socket-adaptor.c new file mode 100644 index 0000000..1b57fc6 --- /dev/null +++ b/atk-adaptor/adaptors/socket-adaptor.c @@ -0,0 +1,205 @@ +/* + * AT-SPI - Assistive Technology Service Provider Interface + * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) + * + * Copyright 2008 Novell, Inc. + * Copyright 2001, 2002 Sun Microsystems Inc., + * Copyright 2001, 2002 Ximian, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include + +#include "common/spi-dbus.h" +#include "common/spi-stateset.h" +#include "object.h" +#include "introspection.h" +#include "bridge.h" + +static DBusMessage * +new_socket_call_message (AtkComponent *component, const char *member) +{ + char *id = g_object_get_data (G_OBJECT (component), "dbus-plug-parent"); + char *bus_parent; + char *path_parent; + + if (!id) + { + g_warning ("new_socket_call_message: no id"); + return NULL; + } + bus_parent = g_strdup (id); + if (bus_parent && (path_parent = g_utf8_strchr (bus_parent + 1, -1, ':'))) + { + DBusMessage *message; + *(path_parent++) = '\0'; + message = dbus_message_new_method_call (bus_parent, path_parent, + SPI_DBUS_INTERFACE_COMPONENT, + member); + g_free (bus_parent); + return message; + } + return NULL; +} + +static void +atspi_plug_component_get_extents (AtkComponent *component, gint *x, gint *y, + gint *width, gint *height, + AtkCoordType coord_type) +{ + DBusMessage *message = new_socket_call_message (component, "GetExtents"); + DBusMessage *reply; + dbus_uint32_t coord_type_dbus = coord_type; + DBusError error; + const char *signature; + DBusMessageIter iter, iter_struct; + dbus_int32_t tmp; + + dbus_error_init (&error); + dbus_message_append_args (message, DBUS_TYPE_UINT32, &coord_type_dbus, DBUS_TYPE_INVALID); + reply = dbus_connection_send_with_reply_and_block (spi_global_app_data->bus, + message, -1, &error); + dbus_message_unref (message); + if (!reply) + return; + signature = dbus_message_get_signature (reply); + if (strcmp (signature, "(iiii)") != 0) + { + g_warning ("Got unexpected signature %s from GetExtents: %s\n", signature); + dbus_message_unref (reply); + return; + } + dbus_message_iter_init (reply, &iter); + dbus_message_iter_recurse (&iter, &iter_struct); + dbus_message_iter_get_basic (&iter_struct, &tmp); + *x = tmp; + dbus_message_iter_next (&iter_struct); + dbus_message_iter_get_basic (&iter_struct, &tmp); + *y = tmp; + dbus_message_iter_next (&iter_struct); + dbus_message_iter_get_basic (&iter_struct, &tmp); + *width = tmp; + dbus_message_iter_next (&iter_struct); + dbus_message_iter_get_basic (&iter_struct, &tmp); + *height = tmp; + dbus_message_unref (reply); +} + +static void +atspi_plug_component_get_position (AtkComponent *component, gint *x, gint *y, + AtkCoordType coord_type) +{ + DBusMessage *message = new_socket_call_message (component, "GetPosition"); + DBusMessage *reply; + dbus_uint32_t coord_type_dbus = coord_type; + DBusError error; + dbus_int32_t x_dbus, y_dbus; + + dbus_error_init (&error); + dbus_message_append_args (message, DBUS_TYPE_UINT32, &coord_type_dbus, DBUS_TYPE_INVALID); + reply = dbus_connection_send_with_reply_and_block (spi_global_app_data->bus, + message, -1, &error); + dbus_message_unref (message); + if (!reply) + return; + if (!dbus_message_get_args (reply, &error, DBUS_TYPE_INT32, &x_dbus, + DBUS_TYPE_INT32, &y_dbus, DBUS_TYPE_INVALID)) + { + g_warning ("GetPosition failed: %s", error.message); + dbus_error_free (&error); + } + else + { + *x = x_dbus; + *y = y_dbus; + } + dbus_message_unref (reply); +} + +static void +atspi_plug_component_get_size (AtkComponent *component, + gint *width, gint *height) +{ + DBusMessage *message = new_socket_call_message (component, "GetSize"); + DBusMessage *reply; + DBusError error; + dbus_uint32_t width_dbus, height_dbus; + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (spi_global_app_data->bus, + message, -1, &error); + dbus_message_unref (message); + if (!reply) + return; + if (!dbus_message_get_args (reply, &error, DBUS_TYPE_INT32, &width_dbus, + DBUS_TYPE_INT32, &height_dbus, DBUS_TYPE_INVALID)) + { + g_warning ("GetSize failed: %s", error.message); + dbus_error_free (&error); + } + else + { + *width = width_dbus; + *height = height_dbus; + } + dbus_message_unref (reply); +} + +static DBusMessage * +impl_Embedded (DBusConnection *bus, + DBusMessage *message, + void *user_data) +{ + AtkObject *object = (AtkObject *) user_data; + char *path; + gchar *id; + + if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID)) + { + return droute_invalid_arguments_error (message); + } + id = g_object_get_data (G_OBJECT (object), "dbus-plug-parent"); + if (id) + g_free (id); + id = g_strconcat (dbus_message_get_sender (message), ":", path, NULL); + g_object_set_data (G_OBJECT (object), "dbus-plug-parent", id); + + if (ATK_IS_COMPONENT (object)) + { + AtkComponent *component = ATK_COMPONENT (object); + AtkComponentIface *iface = ATK_COMPONENT_GET_IFACE (component); + iface->get_extents = atspi_plug_component_get_extents; + iface->get_size = atspi_plug_component_get_size; + iface->get_position = atspi_plug_component_get_position; + } + return dbus_message_new_method_return (message); +} + +static DRouteMethod methods[] = { + {impl_Embedded, "Embedded"}, + {NULL, NULL} +}; + +void +spi_initialize_socket (DRoutePath * path) +{ + droute_path_add_interface (path, + SPI_DBUS_INTERFACE_SOCKET, + NULL, /* spi_org_a11y_atspi_Socket, */ + methods, NULL); +}; diff --git a/atk-adaptor/bridge.c b/atk-adaptor/bridge.c index a2ab66c..489f1b1 100644 --- a/atk-adaptor/bridge.c +++ b/atk-adaptor/bridge.c @@ -305,7 +305,7 @@ socket_embed_hook (AtkSocket * socket, gchar * plug_id) { DBusMessage *message; *(plug_path++) = '\0'; - message = dbus_message_new_method_call (plug_name, plug_path, "org.a11y.atspi.Accessible", "Embedded"); + message = dbus_message_new_method_call (plug_name, plug_path, SPI_DBUS_INTERFACE_SOCKET, "Embedded"); dbus_message_append_args (message, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID); dbus_connection_send (spi_global_app_data->bus, message, NULL); } @@ -450,6 +450,7 @@ adaptor_init (gint * argc, gchar ** argv[]) spi_initialize_hypertext (accpath); spi_initialize_image (accpath); spi_initialize_selection (accpath); + spi_initialize_socket (accpath); spi_initialize_table (accpath); spi_initialize_text (accpath); spi_initialize_value (accpath); @@ -461,7 +462,7 @@ adaptor_init (gint * argc, gchar ** argv[]) install_plug_hooks (); /* Register this app by sending a signal out to AT-SPI registry daemon */ - if (!atspi_no_register) + if (!atspi_no_register && (!root || !ATK_IS_PLUG (root))) register_application (spi_global_app_data); g_atexit (exit_func); -- 2.7.4