X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=atk-adaptor%2Fevent.c;h=7f9a2538746501dc47e5cec927cfd164c370ef1b;hb=be85f6679837d731b2008cb3b0c485c03b661cad;hp=ddc353630524c3c29091b889ffd1391b681e04d0;hpb=f01ffde94695198fe9e68df3b07eea59d563c495;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c index ddc3536..7f9a253 100644 --- a/atk-adaptor/event.c +++ b/atk-adaptor/event.c @@ -2,7 +2,7 @@ * AT-SPI - Assistive Technology Service Provider Interface * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) * - * Copyright 2008, Codethink Ltd. + * Copyright 2008, 2009, Codethink Ltd. * Copyright 2001, 2002, 2003 Sun Microsystems Inc., * Copyright 2001, 2002, 2003 Ximian, Inc. * @@ -22,20 +22,21 @@ * Boston, MA 02111-1307, USA. */ -#include #include -#include "accessible.h" + +#include +#include + #include "bridge.h" -#include "atk-dbus.h" +#include "accessible-register.h" -extern SpiAppData *app_data; +#include "spi-common/spi-dbus.h" static GArray *listener_ids = NULL; static gint atk_bridge_key_event_listener_id; static gint atk_bridge_focus_tracker_id; - /*---------------------------------------------------------------------------*/ #define ITF_EVENT_OBJECT "org.freedesktop.atspi.Event.Object" @@ -61,7 +62,7 @@ Accessibility_DeviceEventController_notifyListenersSync(const Accessibility_Devi dbus_error_init(&error); if (spi_dbus_marshal_deviceEvent(message, key_event)) { - DBusMessage *reply = dbus_connection_send_with_reply_and_block(app_data->droute.bus, message, 1000, &error); + DBusMessage *reply = dbus_connection_send_with_reply_and_block(atk_adaptor_app_data->bus, message, 1000, &error); if (reply) { DBusError error; @@ -148,36 +149,6 @@ spi_atk_bridge_key_listener (AtkKeyEventStruct *event, gpointer data) * the AT-SPI event. */ -/* - * This is a rather annoying function needed to replace - * NULL values of strings with the empty string. Null string - * values can be created by the atk_object_get_name or text selection - */ -static const void * -provide_defaults(const gint type, - const void *val) -{ - switch (type) - { - case DBUS_TYPE_STRING: - case DBUS_TYPE_OBJECT_PATH: - if (!val) - return ""; - else - return val; - default: - return val; - } -} - - -/* TODO Should we bother emiting events for objects that have not yet - * been added to the tree? - * - * This gets difficult. Its entirely possible that an Accessible would have been - * added to the tree, but not yet reached the clients. - * In this case we would be wrongly surpressing an event. - */ static void emit(AtkObject *accessible, const char *klass, @@ -188,46 +159,19 @@ emit(AtkObject *accessible, const char *type, const void *val) { - DBusMessage *sig; - DBusMessageIter iter, sub; - gchar *path, *cname, *t; + gchar *path; - if (!klass) klass = ""; - if (!major) major = ""; - if (!minor) minor = ""; + path = atk_dbus_object_to_path (accessible); - /* - * This is very annoying, but as '-' isn't a legal signal - * name in D-Bus (Why not??!?) The names need converting - * on this side, and again on the client side. + /* Tough decision here + * We won't send events from accessible + * objects that have not yet been added to the accessible tree. */ - cname = g_strdup(major); - while ((t = strchr(cname, '-')) != NULL) *t = '_'; + if (path == NULL) + return; - path = atk_dbus_get_path(accessible); - sig = dbus_message_new_signal(path, klass, cname); - g_free(cname); + spi_dbus_emit_signal (atk_adaptor_app_data->bus, path, klass, major, minor, detail1, detail2, type, val); g_free(path); - - dbus_message_iter_init_append(sig, &iter); - - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &minor); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail1); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail2); - - dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, type, &sub); - /* - * I need to convert the string signature to an integer type signature. - * DBUS_TYPE_INT32 is defined as 'i' whereas the string is "i". - * I should just be able to cast the first character of the string to an - * integer. - */ - val = provide_defaults((int) *type, val); - dbus_message_iter_append_basic(&sub, (int) *type, &val); - dbus_message_iter_close_container(&iter, &sub); - - dbus_connection_send(app_data->droute.bus, sig, NULL); - dbus_message_unref(sig); } /*---------------------------------------------------------------------------*/ @@ -248,6 +192,15 @@ emit_rect(AtkObject *accessible, gchar *path, *cname, *t; dbus_int32_t dummy = 0; + path = atk_dbus_object_to_path (accessible); + + /* Tough decision here + * We won't send events from accessible + * objects that have not yet been added to the accessible tree. + */ + if (path == NULL) + return; + if (!klass) klass = ""; if (!major) major = ""; if (!minor) minor = ""; @@ -260,7 +213,6 @@ emit_rect(AtkObject *accessible, cname = g_strdup(major); while ((t = strchr(cname, '-')) != NULL) *t = '_'; - path = atk_dbus_get_path(accessible); sig = dbus_message_new_signal(path, klass, cname); g_free(path); g_free(cname); @@ -279,74 +231,7 @@ emit_rect(AtkObject *accessible, dbus_message_iter_close_container (&variant, &sub); dbus_message_iter_close_container (&iter, &variant); - dbus_connection_send(app_data->droute.bus, sig, NULL); -} - -/*---------------------------------------------------------------------------*/ - -/* - * The tree update listener handles the following Atk signals: - * - * Gtk:AtkObject:property-change - * - * With the folowing property names: - * - * accessible-name - * accessible-description - * accessible-parent - * - * It updates the server side accessible-object database, which - * will then syncronize with the client-side accessible cache. - * - */ -static gboolean -tree_update_listener (GSignalInvocationHint *signal_hint, - guint n_param_values, - const GValue *param_values, - gpointer data) -{ - AtkObject *accessible; - AtkPropertyValues *values; - const gchar *pname = NULL; - - accessible = g_value_get_object (¶m_values[0]); - values = (AtkPropertyValues*) g_value_get_pointer (¶m_values[1]); - - pname = values[0].property_name; - - if (strcmp (pname, "accessible-name") == 0) - { - atk_dbus_notify_change(accessible); - } - else if (strcmp (pname, "accessible-description") == 0) - { - atk_dbus_notify_change(accessible); - } - else if (strcmp (pname, "accessible-parent") == 0) - { - atk_dbus_notify_change(accessible); - } - return TRUE; -} - -/* - * Handles the ATK signal 'Gtk:AtkObject:children-changed'. - * - * It updates the server side accessible-object database, which - * will then syncronize with the client-side accessible cache. - * - */ -static gboolean -tree_update_children_listener (GSignalInvocationHint *signal_hint, - guint n_param_values, - const GValue *param_values, - gpointer data) -{ - AtkObject *accessible; - - accessible = g_value_get_object (¶m_values[0]); - atk_dbus_register_subtree(accessible); - return TRUE; + dbus_connection_send(atk_adaptor_app_data->bus, sig, NULL); } /*---------------------------------------------------------------------------*/ @@ -399,22 +284,25 @@ property_event_listener (GSignalInvocationHint *signal_hint, if (strcmp (pname, "accessible-table-summary") == 0) { otemp = atk_table_get_summary(ATK_TABLE (accessible)); - stemp = atk_dbus_get_path(otemp); - emit(accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, stemp); + stemp = atk_dbus_object_to_path (otemp); + if (stemp != NULL) + emit(accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, stemp); } else if (strcmp (pname, "accessible-table-column-header") == 0) { i = g_value_get_int (&(values->new_value)); otemp = atk_table_get_column_header(ATK_TABLE (accessible), i); - stemp = atk_dbus_get_path(otemp); - emit(accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, stemp); + stemp = atk_dbus_object_to_path (otemp); + if (stemp != NULL) + emit(accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, stemp); } else if (strcmp (pname, "accessible-table-row-header") == 0) { i = g_value_get_int (&(values->new_value)); otemp = atk_table_get_row_header(ATK_TABLE (accessible), i); - stemp = atk_dbus_get_path(otemp); - emit(accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, stemp); + stemp = atk_dbus_object_to_path (otemp); + if (stemp != NULL) + emit(accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, stemp); } else if (strcmp (pname, "accessible-table-row-description") == 0) { @@ -593,7 +481,12 @@ active_descendant_event_listener (GSignalInvocationHint *signal_hint, minor = g_quark_to_string (signal_hint->detail); detail1 = atk_object_get_index_in_parent (child); - s = atk_dbus_get_path(child); + s = atk_dbus_object_to_path (child); + if (s == NULL) + { + g_free (s); + return TRUE; + } emit(accessible, ITF_EVENT_OBJECT, name, "", detail1, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, s); g_free(s); @@ -771,9 +664,6 @@ spi_atk_register_event_listeners (void) atk_bridge_focus_tracker_id = atk_add_focus_tracker (focus_tracker); - add_signal_listener (tree_update_listener, "Gtk:AtkObject:property-change"); - add_signal_listener (tree_update_children_listener, "Gtk:AtkObject:children-changed"); - add_signal_listener (property_event_listener, "Gtk:AtkObject:property-change"); add_signal_listener (window_event_listener, "window:create"); add_signal_listener (window_event_listener, "window:destroy");