X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=atk-adaptor%2Fevent.c;h=3d1250ef57163f186be4452ba00c5f77c8debd8f;hb=4ac4e0d4876bd1535748e8dc8ccf35db1e173673;hp=184cc36012e3b8dbfe06a6ef766b3a115a26a855;hpb=c936744935bbd2a4d4ff7ea59d4b8dfafe8f157b;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c index 184cc36..3d1250e 100644 --- a/atk-adaptor/event.c +++ b/atk-adaptor/event.c @@ -46,6 +46,32 @@ static gint atk_bridge_focus_tracker_id; /*---------------------------------------------------------------------------*/ +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_DEC, - 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; @@ -161,14 +187,23 @@ emit(AtkObject *accessible, { 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; + } spi_dbus_emit_signal (atk_adaptor_app_data->bus, path, klass, major, minor, detail1, detail2, type, val); g_free(path); @@ -272,11 +307,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, @@ -675,7 +716,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");