diff options
author | Ted Gould <ted@canonical.com> | 2009-04-27 15:55:54 -0500 |
---|---|---|
committer | Ted Gould <ted@canonical.com> | 2009-04-27 15:55:54 -0500 |
commit | ba49215a4853010d670d20b1db4c29669cd220b4 (patch) | |
tree | 18da53e4ac688ee3965ef5f48c6c774719189ece | |
parent | 65273b8464d57c4792c144b080174ba0e48a41e1 (diff) | |
download | libdbusmenu-ba49215a4853010d670d20b1db4c29669cd220b4.tar.gz libdbusmenu-ba49215a4853010d670d20b1db4c29669cd220b4.tar.bz2 libdbusmenu-ba49215a4853010d670d20b1db4c29669cd220b4.zip |
Creating a lifecycle for our dbus proxies. We created them, so we must destroy them as well.
-rw-r--r-- | libdbusmenu-glib/client.c | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index a88d8e8..cfa87a2 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -21,6 +21,7 @@ struct _DbusmenuClientPrivate gchar * dbus_object; gchar * dbus_name; + DBusGConnection * session_bus; DBusGProxy * menuproxy; DBusGProxy * propproxy; DBusGProxyCall * layoutcall; @@ -78,6 +79,7 @@ dbusmenu_client_init (DbusmenuClient *self) priv->dbus_object = NULL; priv->dbus_name = NULL; + priv->session_bus = NULL; priv->menuproxy = NULL; priv->propproxy = NULL; priv->layoutcall = NULL; @@ -88,6 +90,22 @@ dbusmenu_client_init (DbusmenuClient *self) static void dbusmenu_client_dispose (GObject *object) { + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(object); + + if (priv->layoutcall != NULL) { + dbus_g_proxy_cancel_call(priv->propproxy, priv->layoutcall); + priv->layoutcall = NULL; + } + if (priv->menuproxy != NULL) { + g_object_unref(G_OBJECT(priv->menuproxy)); + priv->menuproxy = NULL; + } + if (priv->propproxy != NULL) { + g_object_unref(G_OBJECT(priv->propproxy)); + priv->propproxy = NULL; + } + priv->session_bus = NULL; + G_OBJECT_CLASS (dbusmenu_client_parent_class)->dispose (object); return; } @@ -152,8 +170,42 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) static void build_proxies (DbusmenuClient * client) { + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); + GError * error = NULL; + + g_return_if_fail(priv->dbus_object != NULL); + g_return_if_fail(priv->dbus_name != NULL); + + priv->session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + if (error != NULL) { + g_error("Unable to get session bus: %s", error->message); + g_error_free(error); + return; + } + priv->propproxy = dbus_g_proxy_new_for_name_owner(priv->session_bus, + priv->dbus_name, + priv->dbus_object, + DBUS_INTERFACE_PROPERTIES, + &error); + if (error != NULL) { + g_error("Unable to get property proxy for %s on %s: %s", priv->dbus_name, priv->dbus_object, error->message); + g_error_free(error); + return; + } + + priv->menuproxy = dbus_g_proxy_new_for_name_owner(priv->session_bus, + priv->dbus_name, + priv->dbus_object, + "org.freedesktop.dbusmenu", + &error); + if (error != NULL) { + g_error("Unable to get dbusmenu proxy for %s on %s: %s", priv->dbus_name, priv->dbus_object, error->message); + g_error_free(error); + return; + } + return; } /* When the layout property returns, here's where we take care of that. */ @@ -169,8 +221,18 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) static void update_layout (DbusmenuClient * client) { - update_layout_cb(NULL, NULL, NULL); + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client); + dbus_g_proxy_begin_call (priv->propproxy, + "Get", + update_layout_cb, + client, + NULL, + G_TYPE_STRING, "org.freedesktop.dbusmenu", + G_TYPE_STRING, "layout", + G_TYPE_INVALID, G_TYPE_VALUE, G_TYPE_INVALID); + + return; } /* Public API */ |