X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=atk-adaptor%2Fevent.c;h=0430271c45f068730efc902e663af3d7e6d22ab7;hb=305e6dd2f4b8c551108b6907de8146eb8007d657;hp=d8a74cc0bb981586a3f91149a0029c70b8a3bb75;hpb=548478747b2493842b736b4a1e2bc6bb3015f790;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c index d8a74cc..0430271 100644 --- a/atk-adaptor/event.c +++ b/atk-adaptor/event.c @@ -353,13 +353,37 @@ ensure_proper_format (const char *name) return ret; } +void +append_properties (GArray *properties, event_data *evdata) +{ + GSList *ls; + gint i; + + for (ls = evdata->properties; ls; ls = ls->next) + { + gboolean dup = FALSE; + for (i = 0; i < properties->len; i++) + { + if (ls->data == g_array_index (properties, AtspiPropertyDefinition *, i)) + { + dup = TRUE; + break; + } + } + if (!dup) + g_array_append_val (properties, ls->data); + } +} + static gboolean -signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor) +signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor, + GArray **properties) { gchar *data [4]; event_data *evdata; gboolean ret = FALSE; GList *list; + GArray *props = NULL; if (!spi_global_app_data->events_initialized) return TRUE; @@ -379,32 +403,28 @@ signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor) !g_strcmp0 (data [2], "accessible-parent") || !g_strcmp0 (data [2], "accessible-role"))) || !g_strcmp0 (data [1], "StateChanged")) - { - g_free (data [2]); - g_free (data [1]); - g_free (data [0]); - return TRUE; - } + ret = TRUE; /* Hack: events such as "object::text-changed::insert:system" as generated by Gecko */ data [2][strcspn (data [2], ":")] = '\0'; + for (list = spi_global_app_data->events; list; list = list->next) { evdata = list->data; if (spi_event_is_subtype (data, evdata->data)) { ret = TRUE; - break; + if (!props) + props = g_array_new (TRUE, TRUE, sizeof (AtspiPropertyDefinition *)); + append_properties (props, evdata); } } -#if 0 - g_print("event: %s %s %s: %d\n", data[0], data[1], data[2], ret); -#endif g_free (data [2]); g_free (data [1]); g_free (data [0]); + *properties = props; return ret; } @@ -420,6 +440,14 @@ adapt_minor_for_dbus (const char *source) return ret; } +static void +open_variant (DBusMessageIter *iter, const char *name, const char *type, + DBusMessageIter *out) +{ + dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &name); + dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, type, out); +} + /* * Emits an AT-SPI event. * AT-SPI events names are split into three parts: @@ -447,14 +475,15 @@ emit_event (AtkObject *obj, gchar *cname; DBusMessage *sig; - DBusMessageIter iter; + DBusMessageIter iter, iter_dict, iter_dict_entry, iter_variant, iter_array; + GArray *properties = NULL; if (!klass) klass = ""; if (!major) major = ""; if (!minor) minor = ""; if (!type) type = "u"; - if (!signal_is_needed (klass, major, minor)) + if (!signal_is_needed (klass, major, minor, &properties)) return; path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj)); @@ -476,7 +505,28 @@ emit_event (AtkObject *obj, 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); - spi_object_append_reference (&iter, spi_global_app_data->root); + + dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}", &iter_dict); + /* Add requested properties, unless the object is being marked defunct, in + which case it's safest not to touch it */ + if (minor == NULL || strcmp (minor, "defunct") != 0 || detail1 == 0) + { + if (properties) + { + gint i; + for (i = 0; i < properties->len; i++) + { + AtspiPropertyDefinition *prop = g_array_index (properties, AtspiPropertyDefinition *, i); + dbus_message_iter_open_container (&iter_dict, DBUS_TYPE_DICT_ENTRY, NULL, + &iter_dict_entry); + dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING, &prop->name); + prop->func (&iter_dict_entry, obj); + dbus_message_iter_close_container (&iter_dict, &iter_dict_entry); + } + g_array_free (properties, TRUE); + } + } + dbus_message_iter_close_container (&iter, &iter_dict); dbus_connection_send(bus, sig, NULL); dbus_message_unref(sig); @@ -686,6 +736,7 @@ window_event_listener (GSignalInvocationHint * signal_hint, * Gtk:AtkDocument:load-complete -> document:load-complete * Gtk:AtkDocument:load-stopped -> document:load-stopped * Gtk:AtkDocument:reload -> document:reload + * Gtk:AtkDocument:page-changed -> document:page-changed */ static gboolean document_event_listener (GSignalInvocationHint * signal_hint, @@ -695,13 +746,18 @@ document_event_listener (GSignalInvocationHint * signal_hint, AtkObject *accessible; GSignalQuery signal_query; const gchar *name, *s; + gint detail1 = 0; g_signal_query (signal_hint->signal_id, &signal_query); name = signal_query.signal_name; + if (n_param_values > 0) // on the case of page-changed + if (G_VALUE_TYPE (¶m_values[1]) == G_TYPE_INT) + detail1 = g_value_get_int (¶m_values[1]); + accessible = ATK_OBJECT (g_value_get_object (¶m_values[0])); s = atk_object_get_name (accessible); - emit_event (accessible, ITF_EVENT_DOCUMENT, name, "", 0, 0, + emit_event (accessible, ITF_EVENT_DOCUMENT, name, "", detail1, 0, DBUS_TYPE_STRING_AS_STRING, s, append_basic); return TRUE; @@ -1159,6 +1215,8 @@ spi_atk_register_event_listeners (void) add_signal_listener (document_event_listener, "Gtk:AtkDocument:reload"); add_signal_listener (document_event_listener, "Gtk:AtkDocument:load-stopped"); + add_signal_listener (document_event_listener, + "Gtk:AtkDocument:page-changed"); /* TODO Fake this event on the client side */ add_signal_listener (state_event_listener, "Gtk:AtkObject:state-change"); /* TODO */