summaryrefslogtreecommitdiffstats
path: root/src/ibusproxy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ibusproxy.c')
-rw-r--r--src/ibusproxy.c158
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;