diff options
Diffstat (limited to 'src/ibusproxy.c')
-rw-r--r-- | src/ibusproxy.c | 158 |
1 files changed, 122 insertions, 36 deletions
diff --git a/src/ibusproxy.c b/src/ibusproxy.c index 5ef3b40..9abf8f6 100644 --- a/src/ibusproxy.c +++ b/src/ibusproxy.c @@ -43,6 +43,7 @@ enum { /* IBusProxyPriv */ struct _IBusProxyPrivate { gchar *name; + gchar *unique_name; gchar *path; gchar *interface; IBusConnection *connection; @@ -187,6 +188,12 @@ _connection_ibus_signal_cb (IBusConnection *connection, IBusMessage *message, IBusProxy *proxy) { + IBusProxyPrivate *priv; + priv = IBUS_PROXY_GET_PRIVATE (proxy); + + if (g_strcmp0 (ibus_message_get_path (message), priv->path) != 0) + return FALSE; + if (ibus_proxy_handle_signal (proxy, message)) { g_signal_stop_emission_by_name (connection, "ibus-signal"); return TRUE; @@ -224,45 +231,71 @@ ibus_proxy_constructor (GType type, proxy = IBUS_PROXY (obj); priv = IBUS_PROXY_GET_PRIVATE (proxy); - if (priv->connection != NULL) { - if (priv->name != NULL) { + if (priv->connection == NULL) { + g_object_unref (proxy); + return NULL; + } - IBusError *error; - gchar *rule; + if (priv->name != NULL) { + IBusError *error; + gchar *rule; - rule = g_strdup_printf ("type='signal'," - "sender='" DBUS_SERVICE_DBUS "'," - "path='" DBUS_PATH_DBUS "'," - "interface='" DBUS_INTERFACE_DBUS "'," - "member='NameOwnerChanged'," - "arg0='%s'", - priv->name); + if (ibus_proxy_get_unique_name (proxy) == NULL) { + g_object_unref (proxy); + return NULL; + } - if (!ibus_connection_call (priv->connection, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS, - "AddMatch", - &error, - G_TYPE_STRING, &rule, - G_TYPE_INVALID, - G_TYPE_INVALID)) { - g_warning ("%s: %s", error->name, error->message); - ibus_error_free (error); - } - g_free (rule); + rule = g_strdup_printf ("type='signal'," + "sender='" DBUS_SERVICE_DBUS "'," + "path='" DBUS_PATH_DBUS "'," + "interface='" DBUS_INTERFACE_DBUS "'," + "member='NameOwnerChanged'," + "arg0='%s'", + priv->unique_name); + + if (!ibus_connection_call (priv->connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS, + "AddMatch", + &error, + G_TYPE_STRING, &rule, + G_TYPE_INVALID, + G_TYPE_INVALID)) { + g_warning ("%s: %s", error->name, error->message); + ibus_error_free (error); + } + g_free (rule); + + rule = g_strdup_printf ("type='signal'," + "sender='%s'," + "path='%s'", + priv->unique_name, + priv->path); + + if (!ibus_connection_call (priv->connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS, + "AddMatch", + &error, + G_TYPE_STRING, &rule, + G_TYPE_INVALID, + G_TYPE_INVALID)) { + g_warning ("%s: %s", error->name, error->message); + ibus_error_free (error); } - g_signal_connect (priv->connection, - "ibus-signal", - (GCallback) _connection_ibus_signal_cb, - proxy); - - g_signal_connect (priv->connection, - "destroy", - (GCallback) _connection_destroy_cb, - proxy); + g_free (rule); } - + g_signal_connect (priv->connection, + "ibus-signal", + (GCallback) _connection_ibus_signal_cb, + proxy); + + g_signal_connect (priv->connection, + "destroy", + (GCallback) _connection_destroy_cb, + proxy); return obj; } @@ -273,6 +306,7 @@ ibus_proxy_init (IBusProxy *proxy) priv = IBUS_PROXY_GET_PRIVATE (proxy); priv->name = NULL; + priv->unique_name = NULL; priv->path = NULL; priv->interface = NULL; priv->connection = NULL; @@ -304,7 +338,28 @@ ibus_proxy_destroy (IBusProxy *proxy) "interface='" DBUS_INTERFACE_DBUS "'," "member='NameOwnerChanged'," "arg0='%s'", - priv->name); + priv->unique_name); + + if (!ibus_connection_call (priv->connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS, + "RemoveMatch", + &error, + G_TYPE_STRING, &rule, + G_TYPE_INVALID, + G_TYPE_INVALID)) { + + g_warning ("%s: %s", error->name, error->message); + ibus_error_free (error); + } + g_free (rule); + + rule = g_strdup_printf ("type='signal'," + "sender='%s'," + "path='%s'", + priv->unique_name, + priv->path); if (!ibus_connection_call (priv->connection, DBUS_SERVICE_DBUS, @@ -320,10 +375,12 @@ ibus_proxy_destroy (IBusProxy *proxy) ibus_error_free (error); } g_free (rule); + } } g_free (priv->name); + g_free (priv->unique_name); g_free (priv->path); g_free (priv->interface); @@ -421,7 +478,7 @@ ibus_proxy_handle_signal (IBusProxy *proxy, ibus_error_free (error); } - if (g_strcmp0 (priv->name, old_name) == 0) { + if (g_strcmp0 (priv->unique_name, old_name) == 0) { ibus_object_destroy (IBUS_OBJECT (proxy)); return FALSE; } @@ -452,6 +509,35 @@ ibus_proxy_get_name (IBusProxy *proxy) } const gchar * +ibus_proxy_get_unique_name (IBusProxy *proxy) +{ + + IBusProxyPrivate *priv; + priv = IBUS_PROXY_GET_PRIVATE (proxy); + + if (priv->unique_name == NULL && priv->connection != NULL) { + IBusError *error; + gchar *owner; + if (!ibus_connection_call (priv->connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS, + "GetNameOwner", + &error, + G_TYPE_STRING, &(priv->name), + G_TYPE_INVALID, + G_TYPE_STRING, &owner, + G_TYPE_INVALID)) { + g_warning ("%s: %s", error->name, error->message); + ibus_error_free (error); + } + priv->unique_name = g_strdup (owner); + } + + return priv->unique_name; +} + +const gchar * ibus_proxy_get_path (IBusProxy *proxy) { IBusProxyPrivate *priv; |