diff options
-rw-r--r-- | libdbusmenu-glib/server.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 9c085f7..4890d37 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -54,6 +54,7 @@ struct _DbusmenuServerPrivate guint layout_idle; GDBusConnection * bus; + guint find_server_signal; GCancellable * bus_lookup; guint dbus_registration; @@ -191,6 +192,14 @@ static void bus_event (DbusmenuServer * server, static void bus_about_to_show (DbusmenuServer * server, GVariant * params, GDBusMethodInvocation * invocation); +static void find_servers_cb (GDBusConnection * connection, + const gchar * sender, + const gchar * path, + const gchar * interface, + const gchar * signal, + GVariant * params, + gpointer user_data); +static gboolean layout_update_idle (gpointer user_data); /* Globals */ static GDBusNodeInfo * dbusmenu_node_info = NULL; @@ -366,6 +375,7 @@ dbusmenu_server_init (DbusmenuServer *self) priv->layout_idle = 0; priv->bus = NULL; priv->bus_lookup = NULL; + priv->find_server_signal = 0; priv->dbus_registration = 0; default_text_direction(self); @@ -405,6 +415,11 @@ dbusmenu_server_dispose (GObject *object) priv->dbus_registration = 0; } + if (priv->find_server_signal != 0) { + g_dbus_connection_signal_unsubscribe(priv->bus, priv->find_server_signal); + priv->find_server_signal = 0; + } + if (priv->bus != NULL) { g_object_unref(priv->bus); priv->bus = NULL; @@ -706,12 +721,32 @@ bus_got_cb (GObject * obj, GAsyncResult * result, gpointer user_data) DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(user_data); priv->bus = bus; + priv->find_server_signal = g_dbus_connection_signal_subscribe(priv->bus, + NULL, /* sender */ + "com.canonical.dbusmenu", /* interface */ + "FindServers", /* member */ + NULL, /* object path */ + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, /* flags */ + find_servers_cb, /* cb */ + user_data, /* data */ + NULL); /* free func */ + register_object(DBUSMENU_SERVER(user_data)); g_object_unref(G_OBJECT(user_data)); return; } +/* Respond to the find servers signal by sending an update + to the bus */ +static void +find_servers_cb (GDBusConnection * connection, const gchar * sender, const gchar * path, const gchar * interface, const gchar * signal, GVariant * params, gpointer user_data) +{ + layout_update_idle(user_data); + return; +} + /* Function for the GDBus vtable to handle all method calls and dish them out the appropriate functions */ static void |