diff options
author | Alberto Mardegan <alberto.mardegan@canonical.com> | 2012-03-07 11:36:37 +0200 |
---|---|---|
committer | Alberto Mardegan <alberto.mardegan@canonical.com> | 2012-03-07 11:36:37 +0200 |
commit | db65e23e1fa51bf8c18f59d126e7c397fba2a206 (patch) | |
tree | fa3c6a4a2b0e76a212341571d79514c2a629e834 | |
parent | cc8293dacbdf1d1f74b94588e51d1fe3dcc5f021 (diff) | |
download | ayatana-indicator-session-db65e23e1fa51bf8c18f59d126e7c397fba2a206.tar.gz ayatana-indicator-session-db65e23e1fa51bf8c18f59d126e7c397fba2a206.tar.bz2 ayatana-indicator-session-db65e23e1fa51bf8c18f59d126e7c397fba2a206.zip |
Add Web Accounts menu item
Also, listen for the webcredentials service signals, to know when to set the
alert disposition on the menu item.
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/user-menu-mgr.c | 7 | ||||
-rw-r--r-- | src/webcredentials-mgr.c | 166 | ||||
-rw-r--r-- | src/webcredentials-mgr.h | 50 |
4 files changed, 226 insertions, 1 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index a1e443e..2201da0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -109,7 +109,9 @@ indicator_session_service_SOURCES = \ user-menu-mgr.c \ device-menu-mgr.h \ device-menu-mgr.c \ - sane-rules.h + sane-rules.h \ + webcredentials-mgr.c \ + webcredentials-mgr.h if BUILD_APT indicator_session_service_SOURCES += \ diff --git a/src/user-menu-mgr.c b/src/user-menu-mgr.c index 3f4bdc4..5b2aefb 100644 --- a/src/user-menu-mgr.c +++ b/src/user-menu-mgr.c @@ -24,6 +24,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include "dbusmenu-shared.h" #include "lock-helper.h" #include "users-service-dbus.h" +#include "webcredentials-mgr.h" static GSettings* settings = NULL; static DbusmenuMenuitem *switch_menuitem = NULL; @@ -32,6 +33,7 @@ struct _UserMenuMgr { GObject parent_instance; UsersServiceDbus* users_dbus_interface; + WebcredentialsMgr *webcredentials_mgr; DbusmenuMenuitem* root_item; gint user_count; SessionDbus* session_dbus_interface; @@ -71,6 +73,7 @@ static void user_menu_mgr_init (UserMenuMgr *self) { self->users_dbus_interface = g_object_new (USERS_SERVICE_DBUS_TYPE, NULL); + self->webcredentials_mgr = webcredentials_mgr_new (); self->root_item = dbusmenu_menuitem_new (); g_signal_connect (G_OBJECT (self->users_dbus_interface), "user-added", @@ -259,6 +262,10 @@ user_menu_mgr_rebuild_items (UserMenuMgr *self, gboolean greeter_mode) DBUSMENU_CLIENT_TYPES_SEPARATOR); dbusmenu_menuitem_child_append (self->root_item, separator1); + DbusmenuMenuitem *webcredentials_item = + webcredentials_mgr_get_menu_item (self->webcredentials_mgr); + dbusmenu_menuitem_child_append (self->root_item, webcredentials_item); + DbusmenuMenuitem * user_accounts_item = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set (user_accounts_item, DBUSMENU_MENUITEM_PROP_TYPE, diff --git a/src/webcredentials-mgr.c b/src/webcredentials-mgr.c new file mode 100644 index 0000000..8b44a95 --- /dev/null +++ b/src/webcredentials-mgr.c @@ -0,0 +1,166 @@ +/* +Copyright 2012 Canonical Ltd. + +Authors: + Alberto Mardegan <alberto.mardegan@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <gio/gio.h> +#include <glib/gi18n.h> + +#include "webcredentials-mgr.h" + +#include <libdbusmenu-glib/client.h> + +struct _WebcredentialsMgr +{ + GObject parent_instance; + GDBusProxy *proxy; + DbusmenuMenuitem *menu_item; +}; + +#define WEBCREDENTIALS_OBJECT_PATH "/com/canonical/indicators/webcredentials" +#define WEBCREDENTIALS_BUS_NAME "com.canonical.indicators.webcredentials" +#define WEBCREDENTIALS_INTERFACE WEBCREDENTIALS_BUS_NAME + +G_DEFINE_TYPE (WebcredentialsMgr, webcredentials_mgr, G_TYPE_OBJECT); + +static void +update_disposition (WebcredentialsMgr *self, GVariant *error_status_prop) +{ + gboolean error_status; + + error_status = g_variant_get_boolean (error_status_prop); + dbusmenu_menuitem_property_set (self->menu_item, + DBUSMENU_MENUITEM_PROP_DISPOSITION, + error_status ? + DBUSMENU_MENUITEM_DISPOSITION_ALERT : + DBUSMENU_MENUITEM_DISPOSITION_NORMAL); +} + +static void +on_properties_changed (GDBusProxy *proxy, + GVariant *changed_properties, + GStrv invalidated_properties, + WebcredentialsMgr *self) +{ + if (g_variant_n_children (changed_properties) > 0) { + GVariantIter *iter; + const gchar *key; + GVariant *value; + + g_variant_get (changed_properties, "a{sv}", &iter); + while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) { + if (g_strcmp0 (key, "ErrorStatus") == 0) { + update_disposition (self, value); + } + } + g_variant_iter_free (iter); + } +} + +static void +on_menu_item_activated (DbusmenuMenuitem *menu_item, + guint timestamp, + WebcredentialsMgr *self) +{ + GError *error = NULL; + + if (!g_spawn_command_line_async("gnome-control-center credentials", &error)) + { + g_warning("Unable to show control centre: %s", error->message); + g_error_free(error); + } +} + +static void +webcredentials_mgr_init (WebcredentialsMgr *self) +{ + GError *error = NULL; + GVariant *error_status_prop; + + self->menu_item = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (self->menu_item, + DBUSMENU_MENUITEM_PROP_TYPE, + DBUSMENU_CLIENT_TYPES_DEFAULT); + dbusmenu_menuitem_property_set (self->menu_item, + DBUSMENU_MENUITEM_PROP_LABEL, + _("Web Accounts…")); + g_signal_connect (self->menu_item, + DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, + G_CALLBACK (on_menu_item_activated), + self); + + self->proxy = + g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, + NULL, + WEBCREDENTIALS_BUS_NAME, + WEBCREDENTIALS_OBJECT_PATH, + WEBCREDENTIALS_INTERFACE, + NULL, + &error); + if (G_UNLIKELY (error != NULL)) { + g_warning ("Couldn't create webcredentials proxy: %s", error->message); + g_clear_error (&error); + return; + } + + g_signal_connect (self->proxy, "g-properties-changed", + G_CALLBACK (on_properties_changed), self); + + error_status_prop = + g_dbus_proxy_get_cached_property (self->proxy, "ErrorStatus"); + if (error_status_prop != NULL) { + update_disposition (self, error_status_prop); + g_variant_unref (error_status_prop); + } +} + +static void +webcredentials_mgr_dispose (GObject *object) +{ + WebcredentialsMgr *self = WEBCREDENTIALS_MGR (object); + + if (self->proxy != NULL) { + g_object_unref (self->proxy); + self->proxy = NULL; + } + + if (self->menu_item != NULL) { + g_object_unref (self->menu_item); + self->menu_item = NULL; + } + + G_OBJECT_CLASS (webcredentials_mgr_parent_class)->dispose (object); +} + +static void +webcredentials_mgr_class_init (WebcredentialsMgrClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->dispose = webcredentials_mgr_dispose; +} + +WebcredentialsMgr *webcredentials_mgr_new () +{ + return g_object_new (WEBCREDENTIALS_TYPE_MGR, NULL); +} + +DbusmenuMenuitem *webcredentials_mgr_get_menu_item (WebcredentialsMgr *self) +{ + g_return_val_if_fail (WEBCREDENTIALS_IS_MGR (self), NULL); + return self->menu_item; +} diff --git a/src/webcredentials-mgr.h b/src/webcredentials-mgr.h new file mode 100644 index 0000000..6c16ea0 --- /dev/null +++ b/src/webcredentials-mgr.h @@ -0,0 +1,50 @@ +/* +Copyright 2012 Canonical Ltd. + +Authors: + Alberto Mardegan <alberto.mardegan@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef _WEBCREDENTIALS_MGR_H_ +#define _WEBCREDENTIALS_MGR_H_ + +#include <glib-object.h> +#include <libdbusmenu-glib/menuitem.h> + +G_BEGIN_DECLS + +#define WEBCREDENTIALS_TYPE_MGR (webcredentials_mgr_get_type ()) +#define WEBCREDENTIALS_MGR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), WEBCREDENTIALS_TYPE_MGR, WebcredentialsMgr)) +#define WEBCREDENTIALS_MGR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), WEBCREDENTIALS_TYPE_MGR, WebcredentialsMgrClass)) +#define WEBCREDENTIALS_IS_MGR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), WEBCREDENTIALS_TYPE_MGR)) +#define WEBCREDENTIALS_IS_MGR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), WEBCREDENTIALS_TYPE_MGR)) +#define WEBCREDENTIALS_MGR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), WEBCREDENTIALS_TYPE_MGR, WebcredentialsMgrClass)) + +typedef struct _WebcredentialsMgrClass WebcredentialsMgrClass; +typedef struct _WebcredentialsMgr WebcredentialsMgr; + +struct _WebcredentialsMgrClass +{ + GObjectClass parent_class; +}; + +GType webcredentials_mgr_get_type (void) G_GNUC_CONST; +WebcredentialsMgr *webcredentials_mgr_new (void); + +DbusmenuMenuitem *webcredentials_mgr_get_menu_item (WebcredentialsMgr *self); + +G_END_DECLS + +#endif /* _WEBCREDENTIALS_MGR_H_ */ |