X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git;a=blobdiff_plain;f=atk-adaptor%2Fevent.c;h=dc4e3ec68085525e3c4bc287922d31eade8c19cd;hp=6add6e728af197d1e82489ee52a8ff9bf4068c8a;hb=683739dea15d7c02c217a404d8c5d9d7af076a57;hpb=9c6a0bf23be6b7ec8459c32bef270e44c16e8af7 diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c index 6add6e7..dc4e3ec 100644 --- a/atk-adaptor/event.c +++ b/atk-adaptor/event.c @@ -53,8 +53,10 @@ static gint atk_bridge_focus_tracker_id; typedef struct _SpiReentrantCallClosure { + DBusConnection *bus; GMainLoop *loop; DBusMessage *reply; + guint timeout; } SpiReentrantCallClosure; static void @@ -62,9 +64,8 @@ switch_main_context (GMainContext *cnx) { GList *list; -#ifndef DISABLE_P2P - atspi_dbus_server_setup_with_g_main (spi_global_app_data->server, cnx); -#endif + if (spi_global_app_data->server) + atspi_dbus_server_setup_with_g_main (spi_global_app_data->server, cnx); atspi_dbus_connection_setup_with_g_main (spi_global_app_data->bus, cnx); for (list = spi_global_app_data->direct_connections; list; list = list->next) atspi_dbus_connection_setup_with_g_main (list->data, cnx); @@ -81,25 +82,42 @@ set_reply (DBusPendingCall * pending, void *user_data) g_main_loop_quit (closure->loop); } +static gboolean +timeout_reply (void *data) +{ + SpiReentrantCallClosure *closure = data; + + if (!dbus_connection_get_is_connected (closure->bus)) + g_main_loop_quit (closure->loop); + closure->timeout = -1; + return FALSE; +} + static DBusMessage * send_and_allow_reentry (DBusConnection * bus, DBusMessage * message) { DBusPendingCall *pending; SpiReentrantCallClosure closure; - GMainContext *main_context; + GSource *source; - main_context = (g_getenv ("AT_SPI_CLIENT") ? NULL : - spi_global_app_data->main_context); - closure.loop = g_main_loop_new (main_context, FALSE); - switch_main_context (main_context); + closure.bus = bus; + closure.loop = g_main_loop_new (spi_global_app_data->main_context, FALSE); + closure.reply = NULL; + switch_main_context (spi_global_app_data->main_context); - if (!dbus_connection_send_with_reply (bus, message, &pending, -1) || !pending) + if (!dbus_connection_send_with_reply (bus, message, &pending, 9000) || !pending) { switch_main_context (NULL); return NULL; } dbus_pending_call_set_notify (pending, set_reply, (void *) &closure, NULL); + source = g_timeout_source_new (500); + g_source_set_callback (source, timeout_reply, &closure, NULL); + closure.timeout = g_source_attach (source, spi_global_app_data->main_context); + g_source_unref (source); g_main_loop_run (closure.loop); + if (closure.timeout != -1) + g_source_destroy (source); g_main_loop_unref (closure.loop); return closure.reply; @@ -119,7 +137,6 @@ Accessibility_DeviceEventController_NotifyListenersSync (const * key_event) { DBusMessage *message; - DBusError error; dbus_bool_t consumed = FALSE; message = @@ -128,7 +145,6 @@ Accessibility_DeviceEventController_NotifyListenersSync (const ATSPI_DBUS_INTERFACE_DEC, "NotifyListenersSync"); - dbus_error_init (&error); if (spi_dbus_marshal_deviceEvent (message, key_event)) { DBusMessage *reply = @@ -137,8 +153,12 @@ Accessibility_DeviceEventController_NotifyListenersSync (const { DBusError error; dbus_error_init (&error); - dbus_message_get_args (reply, &error, DBUS_TYPE_BOOLEAN, &consumed, - DBUS_TYPE_INVALID); + if (!dbus_message_get_args (reply, &error, DBUS_TYPE_BOOLEAN, + &consumed, DBUS_TYPE_INVALID)) + { + /* TODO: print a warning */ + dbus_error_free (&error); + } dbus_message_unref (reply); } } @@ -211,23 +231,6 @@ spi_atk_bridge_key_listener (AtkKeyEventStruct * event, gpointer data) /*---------------------------------------------------------------------------*/ -static gchar * -convert_signal_name (const gchar * s) -{ - gchar *ret = g_strdup (s); - gchar *t; - - if (!ret) - return NULL; - ret[0] = toupper (ret[0]); - while ((t = strchr (ret, '-')) != NULL) - { - memmove (t, t + 1, strlen (t)); - *t = toupper (*t); - } - return ret; -} - static const void * validate_for_dbus (const gint type, const void *val) @@ -351,7 +354,6 @@ static gboolean signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor) { gchar *data [4]; - GList *iter; event_data *evdata; gboolean ret = FALSE; GList *list; @@ -368,7 +370,11 @@ signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor) * TODO: FOr 2.2, have at-spi2-core define a special "cache listener" for * this instead, so that we don't send these if no one is listening */ if (!g_strcmp0 (data [1], "ChildrenChanged") || - !g_strcmp0 (data [1], "PropertyChange") || + ((!g_strcmp0 (data [1], "PropertyChange")) && + (!g_strcmp0 (data [2], "accessible-name") || + !g_strcmp0 (data [2], "accessible-description") || + !g_strcmp0 (data [2], "accessible-parent") || + !g_strcmp0 (data [2], "accessible-role"))) || !g_strcmp0 (data [1], "StateChanged")) { g_free (data [2]); @@ -399,6 +405,18 @@ signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor) return ret; } +/* Convert a : to a / so that listeners can use arg0path to match only + * * the prefix */ +static char * +adapt_minor_for_dbus (const char *source) +{ + gchar *ret = g_strdup (source); + int i = strcspn (ret, ":"); + if (ret[i] == ':') + ret[i] = '/'; + return ret; +} + /* * Emits an AT-SPI event. * AT-SPI events names are split into three parts: @@ -421,11 +439,12 @@ emit_event (AtkObject *obj, void (*append_variant) (DBusMessageIter *, const char *, const void *)) { DBusConnection *bus = spi_global_app_data->bus; - const char *path; + char *path; + char *minor_dbus; - gchar *cname, *t; + gchar *cname; DBusMessage *sig; - DBusMessageIter iter, iter_struct; + DBusMessageIter iter; if (!klass) klass = ""; if (!major) major = ""; @@ -436,6 +455,7 @@ emit_event (AtkObject *obj, return; path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj)); + g_return_if_fail (path != NULL); /* * This is very annoying, but as '-' isn't a legal signal @@ -447,7 +467,9 @@ emit_event (AtkObject *obj, dbus_message_iter_init_append(sig, &iter); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &minor); + minor_dbus = adapt_minor_for_dbus (minor); + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &minor_dbus); + g_free (minor_dbus); dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail1); dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail2); append_variant (&iter, type, val); @@ -499,7 +521,7 @@ property_event_listener (GSignalInvocationHint * signal_hint, const gchar *pname = NULL; AtkObject *otemp; - const gchar *s1, s2; + const gchar *s1; gint i; accessible = g_value_get_object (¶m_values[0]); @@ -603,7 +625,7 @@ state_event_listener (GSignalInvocationHint * signal_hint, const GValue * param_values, gpointer data) { AtkObject *accessible; - gchar *pname; + const gchar *pname; guint detail1; accessible = ATK_OBJECT (g_value_get_object (¶m_values[0])); @@ -613,7 +635,7 @@ state_event_listener (GSignalInvocationHint * signal_hint, emit_event (accessible, ITF_EVENT_OBJECT, STATE_CHANGED, pname, detail1, 0, DBUS_TYPE_INT32_AS_STRING, 0, append_basic); - if (!g_strcmp0 (pname, "defunct")) + if (!g_strcmp0 (pname, "defunct") && detail1) spi_register_deregister_object (spi_global_register, G_OBJECT (accessible), TRUE); return TRUE; @@ -696,7 +718,7 @@ bounds_event_listener (GSignalInvocationHint * signal_hint, AtkObject *accessible; AtkRectangle *atk_rect; GSignalQuery signal_query; - const gchar *name, *s; + const gchar *name; g_signal_query (signal_hint->signal_id, &signal_query); name = signal_query.signal_name; @@ -728,7 +750,7 @@ active_descendant_event_listener (GSignalInvocationHint * signal_hint, AtkObject *accessible; AtkObject *child; GSignalQuery signal_query; - const gchar *name, *minor; + const gchar *name; gint detail1; g_signal_query (signal_hint->signal_id, &signal_query); @@ -737,7 +759,6 @@ active_descendant_event_listener (GSignalInvocationHint * signal_hint, accessible = ATK_OBJECT (g_value_get_object (¶m_values[0])); child = ATK_OBJECT (g_value_get_pointer (¶m_values[1])); g_return_val_if_fail (ATK_IS_OBJECT (child), TRUE); - minor = g_quark_to_string (signal_hint->detail); detail1 = atk_object_get_index_in_parent (child); @@ -833,7 +854,8 @@ text_insert_event_listener (GSignalInvocationHint * signal_hint, guint text_changed_signal_id; GSignalQuery signal_query; const gchar *name; - gchar *minor, *text; + const gchar *minor_raw, *text; + gchar *minor; gint detail1 = 0, detail2 = 0; accessible = ATK_OBJECT (g_value_get_object (¶m_values[0])); @@ -846,9 +868,9 @@ text_insert_event_listener (GSignalInvocationHint * signal_hint, /* Add the insert and keep any detail coming from atk */ - minor = g_quark_to_string (signal_hint->detail); - if (minor) - minor = g_strconcat ("insert:", minor, NULL); + minor_raw = g_quark_to_string (signal_hint->detail); + if (minor_raw) + minor = g_strconcat ("insert:", minor_raw, NULL); else minor = g_strdup ("insert"); @@ -881,7 +903,8 @@ text_remove_event_listener (GSignalInvocationHint * signal_hint, guint text_changed_signal_id; GSignalQuery signal_query; const gchar *name; - gchar *minor, *text; + const gchar *minor_raw, *text; + gchar *minor; gint detail1 = 0, detail2 = 0; accessible = ATK_OBJECT (g_value_get_object (¶m_values[0])); @@ -892,12 +915,11 @@ text_remove_event_listener (GSignalInvocationHint * signal_hint, g_signal_query (text_changed_signal_id, &signal_query); name = signal_query.signal_name; - minor = g_quark_to_string (signal_hint->detail); + minor_raw = g_quark_to_string (signal_hint->detail); /* Add the delete and keep any detail coming from atk */ - minor = g_quark_to_string (signal_hint->detail); - if (minor) - minor = g_strconcat ("delete:", minor, NULL); + if (minor_raw) + minor = g_strconcat ("delete:", minor_raw, NULL); else minor = g_strdup ("delete"); @@ -997,6 +1019,7 @@ children_changed_event_listener (GSignalInvocationHint * signal_hint, detail1); emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2, "(so)", ao, append_object); + g_object_unref (ao); } else { @@ -1009,24 +1032,6 @@ children_changed_event_listener (GSignalInvocationHint * signal_hint, /*---------------------------------------------------------------------------*/ -static void -toplevel_added_event_listener (AtkObject * accessible, - guint index, AtkObject * child) -{ - emit_event (accessible, ITF_EVENT_OBJECT, "children-changed", "add", index, 0, - "(so)", child, append_object); -} - -static void -toplevel_removed_event_listener (AtkObject * accessible, - guint index, AtkObject * child) -{ - emit_event (accessible, ITF_EVENT_OBJECT, "children-changed", "remove", index, 0, - "(so)", child, append_object); -} - -/*---------------------------------------------------------------------------*/ - /* * Generic signal converter and forwarder. *