From f3f4f23330512e0e6e72c1e4288ddfa506b9aa22 Mon Sep 17 00:00:00 2001 From: infirit Date: Fri, 11 Sep 2015 18:21:21 +0200 Subject: Add support for application indicators Patch by Jan Arne Petersen taken from https://bugzilla.gnome.org/show_bug.cgi?id=609680 --- src/Makefile.am | 2 ++ src/main.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index eb2fcfc..93f17f9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -33,6 +33,7 @@ polkit_mate_authentication_agent_1_CFLAGS = \ $(GLIB_CFLAGS) \ $(POLKIT_AGENT_CFLAGS) \ $(POLKIT_GOBJECT_CFLAGS) \ + $(APPINDICATOR_CFLAGS) \ $(WARN_CFLAGS) \ $(AM_CFLAGS) @@ -44,6 +45,7 @@ polkit_mate_authentication_agent_1_LDADD = \ $(GLIB_LIBS) \ $(POLKIT_AGENT_LIBS) \ $(POLKIT_GOBJECT_LIBS) \ + $(APPINDICATOR_LIBS) \ $(INTLLIBS) EXTRA_DIST = \ diff --git a/src/main.c b/src/main.c index 5f8059c..197d29a 100644 --- a/src/main.c +++ b/src/main.c @@ -29,6 +29,10 @@ #include #include +#ifdef HAVE_APPINDICATOR +#include +#endif + #include "polkitmatelistener.h" /* session management support for auto-restart */ @@ -47,7 +51,11 @@ static PolkitSubject *session = NULL; /* the current set of temporary authorizations */ static GList *current_temporary_authorizations = NULL; +#ifdef HAVE_APPINDICATOR +static AppIndicator *app_indicator = NULL; +#else static GtkStatusIcon *status_icon = NULL; +#endif static GDBusProxy *sm_proxy; static GDBusProxy *client_proxy = NULL; @@ -82,6 +90,14 @@ revoke_tmp_authz (void) NULL); } +#ifdef HAVE_APPINDICATOR +static void +on_menu_item_activate (GtkMenuItem *menu_item, + gpointer user_data) +{ + revoke_tmp_authz (); +} +#else static void on_status_icon_activate (GtkStatusIcon *status_icon, gpointer user_data) @@ -97,6 +113,7 @@ on_status_icon_popup_menu (GtkStatusIcon *status_icon, { revoke_tmp_authz (); } +#endif static void update_temporary_authorization_icon_real (void) @@ -134,6 +151,31 @@ update_temporary_authorization_icon_real (void) if (current_temporary_authorizations != NULL) { /* show icon */ +#ifdef HAVE_APPINDICATOR + if (app_indicator == NULL) + { + GtkWidget *item, *menu; + + app_indicator = app_indicator_new ("mate-polkit", + "gtk-dialog-authentication", + APP_INDICATOR_CATEGORY_SYSTEM_SERVICES); + + item = gtk_menu_item_new_with_label (_("Drop all elevated privileges")); + g_signal_connect (item, + "activate", + G_CALLBACK (on_menu_item_activate), + NULL); + menu = gtk_menu_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_show_all (menu); + + app_indicator_set_menu (app_indicator, + GTK_MENU (menu)); + app_indicator_set_status (app_indicator, + APP_INDICATOR_STATUS_ACTIVE); + } + +#else if (status_icon == NULL) { status_icon = gtk_status_icon_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION); @@ -148,16 +190,27 @@ update_temporary_authorization_icon_real (void) G_CALLBACK (on_status_icon_popup_menu), NULL); } +#endif } else { /* hide icon */ +#ifdef HAVE_APPINDICATOR + if (app_indicator != NULL) + { + app_indicator_set_status (app_indicator, + APP_INDICATOR_STATUS_PASSIVE); + g_object_unref (app_indicator); + app_indicator = NULL; + } +#else if (status_icon != NULL) { gtk_status_icon_set_visible (status_icon, FALSE); g_object_unref (status_icon); status_icon = NULL; } +#endif } } -- cgit v1.2.1