X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=atk-adaptor%2Fevent.c;h=81a0f340fbdfa124808cb43ff51d9481ed8cb66f;hb=f6a0fdcf50c5bcbab547996313161ee4200266e4;hp=b9730213f65fe085274f24b7fd563c8b7e8d455b;hpb=0b3e035c05d6377cdf967b30cc38ebfa051e83ca;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c index b973021..81a0f34 100644 --- a/atk-adaptor/event.c +++ b/atk-adaptor/event.c @@ -53,11 +53,28 @@ typedef struct _SpiReentrantCallClosure } SpiReentrantCallClosure; static void +switch_main_context (GMainContext *cnx) +{ +/* This code won't work on dbus-glib earlier than 0.9.0 because of FDO#30574 */ + if (spi_global_app_data->app_bus_addr [0] == '\0') + return; + + GList *list; + + dbus_server_setup_with_g_main (spi_global_app_data->server, cnx); + dbus_connection_setup_with_g_main (spi_global_app_data->bus, cnx); + for (list = spi_global_app_data->direct_connections; list; list = list->next) + dbus_connection_setup_with_g_main (list->data, cnx); +} + +static void set_reply (DBusPendingCall * pending, void *user_data) { SpiReentrantCallClosure* closure = (SpiReentrantCallClosure *) user_data; closure->reply = dbus_pending_call_steal_reply (pending); + dbus_pending_call_unref (pending); + switch_main_context (NULL); g_main_loop_quit (closure->loop); } @@ -66,26 +83,20 @@ send_and_allow_reentry (DBusConnection * bus, DBusMessage * message) { DBusPendingCall *pending; SpiReentrantCallClosure closure; + GMainContext *main_context; - if (!dbus_connection_send_with_reply (bus, message, &pending, -1)) - return NULL; - dbus_pending_call_set_notify (pending, set_reply, (void *) &closure, NULL); - closure.loop = g_main_loop_new (NULL, FALSE); + 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); - /* TODO: Remove old AT_SPI_CLIENT name */ - if (getenv ("AT_SPI_CLIENT") || getenv ("AT_SPI_REENTER_G_MAIN_LOOP")) + if (!dbus_connection_send_with_reply (bus, message, &pending, -1) || !pending) { - g_main_loop_run (closure.loop); - } - else - { - closure.reply = NULL; - while (!closure.reply) - { - if (!dbus_connection_read_write_dispatch (spi_global_app_data->bus, 1000)) - return NULL; - } + switch_main_context (NULL); + return NULL; } + dbus_pending_call_set_notify (pending, set_reply, (void *) &closure, NULL); + g_main_loop_run (closure.loop); g_main_loop_unref (closure.loop); return closure.reply; @@ -337,6 +348,9 @@ signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor) gboolean ret = FALSE; GList *list; + if (!spi_global_app_data->events_initialized) + return TRUE; + data [0] = ensure_proper_format (klass + 21); data [1] = ensure_proper_format (major); data [2] = ensure_proper_format (minor); @@ -405,7 +419,6 @@ emit_event (AtkObject *obj, */ cname = signal_name_to_dbus (major); sig = dbus_message_new_signal(path, klass, cname); - g_free(cname); dbus_message_iter_init_append(sig, &iter); @@ -420,6 +433,8 @@ emit_event (AtkObject *obj, if (g_strcmp0 (cname, "ChildrenChanged") != 0) spi_object_lease_if_needed (G_OBJECT (obj)); + + g_free(cname); } /*---------------------------------------------------------------------------*/