X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=atk-adaptor%2Fevent.c;h=bbfa4df00c215b384f883b10ebbfbbea524cfe71;hb=a5b218b88d39d69de3c79a86952bbc9ad4d130f2;hp=80fb7b887449d19ce51029a5df2a3589a9c721ff;hpb=ded0545beb48d45741f1ac54085cb3be9a823768;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c index 80fb7b8..bbfa4df 100644 --- a/atk-adaptor/event.c +++ b/atk-adaptor/event.c @@ -30,7 +30,7 @@ #include "bridge.h" #include "accessible-register.h" -#include "spi-common/spi-dbus.h" +#include "common/spi-dbus.h" static GArray *listener_ids = NULL; @@ -41,11 +41,37 @@ static gint atk_bridge_focus_tracker_id; #define ITF_EVENT_OBJECT "org.freedesktop.atspi.Event.Object" #define ITF_EVENT_WINDOW "org.freedesktop.atspi.Event.Window" -#define ITF_EVENT_DOCUMENT "org.freedekstop.atspi.Event.Document" +#define ITF_EVENT_DOCUMENT "org.freedesktop.atspi.Event.Document" #define ITF_EVENT_FOCUS "org.freedesktop.atspi.Event.Focus" /*---------------------------------------------------------------------------*/ +static void +set_reply (DBusPendingCall *pending, void *user_data) +{ + void **replyptr = (void **)user_data; + + *replyptr = dbus_pending_call_steal_reply (pending); +} + +static DBusMessage * +send_and_allow_reentry (DBusConnection *bus, DBusMessage *message) +{ + DBusPendingCall *pending; + DBusMessage *reply = NULL; + + if (!dbus_connection_send_with_reply (bus, message, &pending, -1)) + { + return NULL; + } + dbus_pending_call_set_notify (pending, set_reply, (void *)&reply, NULL); + while (!reply) + { + if (!dbus_connection_read_write_dispatch (bus, -1)) return NULL; + } + return reply; +} + static gboolean Accessibility_DeviceEventController_notifyListenersSync(const Accessibility_DeviceEvent *key_event) { @@ -53,16 +79,16 @@ Accessibility_DeviceEventController_notifyListenersSync(const Accessibility_Devi DBusError error; dbus_bool_t consumed = FALSE; - message = + message = dbus_message_new_method_call(SPI_DBUS_NAME_REGISTRY, - SPI_DBUS_PATH_REGISTRY, - SPI_DBUS_INTERFACE_DEC, - "notifyListenersSync"); + SPI_DBUS_PATH_DEC, + SPI_DBUS_INTERFACE_DEC, + "notifyListenersSync"); dbus_error_init(&error); if (spi_dbus_marshal_deviceEvent(message, key_event)) { - DBusMessage *reply = dbus_connection_send_with_reply_and_block(atk_adaptor_app_data->bus, message, 1000, &error); + DBusMessage *reply = send_and_allow_reentry (atk_adaptor_app_data->bus, message); if (reply) { DBusError error; @@ -149,28 +175,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; - } -} - static void emit(AtkObject *accessible, const char *klass, @@ -181,54 +185,28 @@ emit(AtkObject *accessible, const char *type, const void *val) { - DBusMessage *sig; - DBusMessageIter iter, sub; - gchar *path, *cname, *t; + gchar *path; - path = atk_dbus_object_to_path (accessible); + /* TODO this is a hack, used becuase child-added events are not guaranteed. + * On recieving an event from a non-registered object we check if it can be safely + * registered before sending the event. + */ + path = atk_dbus_object_attempt_registration (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) + { +#ifdef SPI_ATK_DEBUG + g_debug ("AT-SPI: Event recieved from non-registered object"); +#endif return; + } - if (!klass) klass = ""; - if (!major) major = ""; - if (!minor) minor = ""; - - /* - * 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. - */ - cname = g_strdup(major); - while ((t = strchr(cname, '-')) != NULL) *t = '_'; - - 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(atk_adaptor_app_data->bus, sig, NULL); - dbus_message_unref(sig); } /*---------------------------------------------------------------------------*/ @@ -249,7 +227,7 @@ emit_rect(AtkObject *accessible, gchar *path, *cname, *t; dbus_int32_t dummy = 0; - path = atk_dbus_object_to_path (accessible); + path = atk_dbus_object_to_path (accessible, FALSE); /* Tough decision here * We won't send events from accessible @@ -289,6 +267,8 @@ emit_rect(AtkObject *accessible, dbus_message_iter_close_container (&iter, &variant); dbus_connection_send(atk_adaptor_app_data->bus, sig, NULL); + + dbus_message_unref (sig); } /*---------------------------------------------------------------------------*/ @@ -329,11 +309,17 @@ property_event_listener (GSignalInvocationHint *signal_hint, AtkObject *otemp; const gchar *stemp; gint i; - + 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 || + strcmp (pname, "accessible-description") == 0 || + strcmp (pname, "accessible-parent") == 0) + { + return TRUE; + } /* TODO Could improve this control statement by matching * on only the end of the signal names, @@ -341,7 +327,7 @@ property_event_listener (GSignalInvocationHint *signal_hint, if (strcmp (pname, "accessible-table-summary") == 0) { otemp = atk_table_get_summary(ATK_TABLE (accessible)); - stemp = atk_dbus_object_to_path (otemp); + stemp = atk_dbus_object_to_path (otemp, FALSE); if (stemp != NULL) emit(accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, stemp); } @@ -349,7 +335,7 @@ property_event_listener (GSignalInvocationHint *signal_hint, { i = g_value_get_int (&(values->new_value)); otemp = atk_table_get_column_header(ATK_TABLE (accessible), i); - stemp = atk_dbus_object_to_path (otemp); + stemp = atk_dbus_object_to_path (otemp, FALSE); if (stemp != NULL) emit(accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, stemp); } @@ -357,7 +343,7 @@ property_event_listener (GSignalInvocationHint *signal_hint, { i = g_value_get_int (&(values->new_value)); otemp = atk_table_get_row_header(ATK_TABLE (accessible), i); - stemp = atk_dbus_object_to_path (otemp); + stemp = atk_dbus_object_to_path (otemp, FALSE); if (stemp != NULL) emit(accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0, DBUS_TYPE_OBJECT_PATH_AS_STRING, stemp); } @@ -538,7 +524,7 @@ 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_object_to_path (child); + s = atk_dbus_object_to_path (child, FALSE); if (s == NULL) { g_free (s); @@ -732,7 +718,9 @@ spi_atk_register_event_listeners (void) add_signal_listener (document_event_listener, "Gtk:AtkDocument:load-complete"); add_signal_listener (document_event_listener, "Gtk:AtkDocument:reload"); add_signal_listener (document_event_listener, "Gtk:AtkDocument:load-stopped"); + /* TODO Fake this event on the client side */ add_signal_listener (state_event_listener, "Gtk:AtkObject:state-change"); + /* TODO */ add_signal_listener (active_descendant_event_listener, "Gtk:AtkObject:active-descendant-changed"); add_signal_listener (bounds_event_listener, "Gtk:AtkComponent:bounds-changed"); add_signal_listener (text_selection_changed_event_listener, "Gtk:AtkText:text-selection-changed");