diff options
author | Jason Conti <jason.conti@gmail.com> | 2012-05-08 14:01:57 -0400 |
---|---|---|
committer | Peng Huang <shawn.p.huang@gmail.com> | 2012-05-08 14:01:57 -0400 |
commit | a78a254715fb410d4c2f7fd274894e51d74bc9bb (patch) | |
tree | f9a1111d74b8b15c6fbd05c7b63aa9a90a0ce915 | |
parent | e9f682d4c6bf90ba8c40e2920d24d7bbba449e8f (diff) | |
download | ibus-a78a254715fb410d4c2f7fd274894e51d74bc9bb.tar.gz |
Add function ibus_bus_new_async to create a new IBusBus object and asynchronously connect to the IBus daemon.
BUG=http://code.google.com/p/ibus/issues/detail?id=1452
TEST=Manually
Review URL: https://codereview.appspot.com/6159047
Patch from Jason Conti <jason.conti@gmail.com>.
-rw-r--r-- | src/ibusbus.c | 88 | ||||
-rw-r--r-- | src/ibusbus.h | 10 |
2 files changed, 87 insertions, 11 deletions
diff --git a/src/ibusbus.c b/src/ibusbus.c index ea18841c..3aaf819d 100644 --- a/src/ibusbus.c +++ b/src/ibusbus.c @@ -258,7 +258,7 @@ _connection_closed_cb (GDBusConnection *connection, } static void -ibus_bus_connect (IBusBus *bus) +ibus_bus_disconnect (IBusBus *bus) { /* unref the old connection at first */ if (bus->priv->connection != NULL) { @@ -268,15 +268,11 @@ ibus_bus_connect (IBusBus *bus) g_object_unref (bus->priv->connection); bus->priv->connection = NULL; } +} - if (ibus_get_address () != NULL) { - bus->priv->connection = - g_dbus_connection_new_for_address_sync (ibus_get_address (), - G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | - G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, - NULL, NULL, NULL); - } - +static void +ibus_bus_connect_finish (IBusBus *bus) +{ if (bus->priv->connection) { /* FIXME */ ibus_bus_hello (bus); @@ -297,6 +293,63 @@ ibus_bus_connect (IBusBus *bus) } static void +_bus_connect_async_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + g_return_if_fail (user_data != NULL); + g_return_if_fail (IBUS_IS_BUS (user_data)); + + IBusBus *bus = IBUS_BUS (user_data); + GError *error = NULL; + + bus->priv->connection = g_dbus_connection_new_for_address_finish (res, &error); + + if (error != NULL) { + g_warning ("Unable to connect to ibus: %s", error->message); + g_error_free (error); + error = NULL; + } + + if (bus->priv->connection) + ibus_bus_connect_finish (bus); + + /* unref the ref from ibus_bus_connect */ + g_object_unref (bus); +} + +static void +ibus_bus_connect_async (IBusBus *bus) +{ + ibus_bus_disconnect (bus); + + if (ibus_get_address () != NULL) { + g_object_ref (bus); + g_dbus_connection_new_for_address (ibus_get_address (), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, + NULL, NULL, + _bus_connect_async_cb, bus); + } +} + +static void +ibus_bus_connect (IBusBus *bus) +{ + ibus_bus_disconnect (bus); + + if (ibus_get_address () != NULL) { + bus->priv->connection = + g_dbus_connection_new_for_address_sync (ibus_get_address (), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, + NULL, NULL, NULL); + } + + ibus_bus_connect_finish (bus); +} + +static void _changed_cb (GFileMonitor *monitor, GFile *file, GFile *other_file, @@ -343,8 +396,6 @@ ibus_bus_init (IBusBus *bus) } } - ibus_bus_connect (bus); - file = g_file_new_for_path (ibus_get_socket_path ()); bus->priv->monitor = g_file_monitor_file (file, 0, NULL, NULL); @@ -482,9 +533,24 @@ ibus_bus_new (void) { IBusBus *bus = IBUS_BUS (g_object_new (IBUS_TYPE_BUS, NULL)); + if (!ibus_bus_is_connected(bus)) + ibus_bus_connect (bus); + return bus; } +IBusBus * +ibus_bus_new_async (void) +{ + IBusBus *bus = IBUS_BUS (g_object_new (IBUS_TYPE_BUS, NULL)); + + if (!ibus_bus_is_connected(bus)) + ibus_bus_connect_async (bus); + + return bus; +} + + gboolean ibus_bus_is_connected (IBusBus *bus) diff --git a/src/ibusbus.h b/src/ibusbus.h index 337091bb..8fe0036a 100644 --- a/src/ibusbus.h +++ b/src/ibusbus.h @@ -91,6 +91,16 @@ GType ibus_bus_get_type (void); IBusBus *ibus_bus_new (void); /** + * ibus_bus_new_async: + * @returns: A newly allocated #IBusBus instance, and the instance is not floating. + * + * New an #IBusBus instance. The instance will asynchronously connect to the IBus + * daemon. + */ +IBusBus *ibus_bus_new_async (void); + + +/** * ibus_bus_is_connected: * @bus: An #IBusBus. * @returns: %TRUE if @bus is connected, %FALSE otherwise. |