From 7bfae91c04550d64b8df51357fe59d161ccd5a73 Mon Sep 17 00:00:00 2001 From: Robert Love Date: Tue, 7 Mar 2006 20:29:20 +0000 Subject: [PATCH] 2006-03-06 Robert Love * gnome/applet/Makefile.am: Define AUTOSTARTDIR. * gnome/applet/applet.c: Add 'Remove' option to the right click menu, to exit the applet. As a sweet side-effect, idea courtesy of Chris Rivera, detect if the applet was auto-started. If so, ask the user if he or she would like to stop automatically running the applet on login. If so, disable autostart. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1561 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 9 ++++ gnome/applet/Makefile.am | 41 ++++++++--------- gnome/applet/applet.c | 95 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 121 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 87a377c481..50247fbe2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2006-03-06 Robert Love + + * gnome/applet/Makefile.am: Define AUTOSTARTDIR. + * gnome/applet/applet.c: Add 'Remove' option to the right click menu, + to exit the applet. As a sweet side-effect, idea courtesy of Chris + Rivera, detect if the applet was auto-started. If so, ask the user + if he or she would like to stop automatically running the applet on + login. If so, disable autostart. + 2006-03-06 Robert Love * NetworkManager.pc.in: Provide an -I to the NetworkManager include diff --git a/gnome/applet/Makefile.am b/gnome/applet/Makefile.am index 542bed9ab5..c53ac218f1 100644 --- a/gnome/applet/Makefile.am +++ b/gnome/applet/Makefile.am @@ -6,28 +6,29 @@ INCLUDES = -I${top_srcdir} -I${top_srcdir}/utils -I${top_srcdir}/include -I${top bin_PROGRAMS = nm-applet -nm_applet_CPPFLAGS = \ - $(DBUS_CFLAGS) \ - $(GTHREAD_CFLAGS) \ - $(HAL_CFLAGS) \ - $(DBUS_GLIB_CFLAGS) \ - $(GLADE_CFLAGS) \ - $(GTK_CFLAGS) \ - $(GCONF_CFLAGS) \ - $(LIBGNOMEUI_CFLAGS) \ - $(PANEL_APPLET_CFLAGS) \ - $(GNOME_KEYRING_CFLAGS) \ - -DICONDIR=\""$(datadir)/pixmaps"\" \ - -DGLADEDIR=\""$(gladedir)"\" \ - -DBINDIR=\""$(bindir)"\" \ - -DSYSCONFDIR=\""$(sysconfdir)"\" \ +nm_applet_CPPFLAGS = \ + $(DBUS_CFLAGS) \ + $(GTHREAD_CFLAGS) \ + $(HAL_CFLAGS) \ + $(DBUS_GLIB_CFLAGS) \ + $(GLADE_CFLAGS) \ + $(GTK_CFLAGS) \ + $(GCONF_CFLAGS) \ + $(LIBGNOMEUI_CFLAGS) \ + $(PANEL_APPLET_CFLAGS) \ + $(GNOME_KEYRING_CFLAGS) \ + -DICONDIR=\""$(datadir)/pixmaps"\" \ + -DGLADEDIR=\""$(gladedir)"\" \ + -DBINDIR=\""$(bindir)"\" \ + -DSYSCONFDIR=\""$(sysconfdir)"\" \ + -DAUTOSTARTDIR=\""$(datadir)/gnome/autostart"\" \ -DVPN_NAME_FILES_DIR=\""$(sysconfdir)/NetworkManager/VPN"\" \ - -DDBUS_API_SUBJECT_TO_CHANGE \ - -DG_DISABLE_DEPRECATED \ - -DGDK_DISABLE_DEPRECATED \ - -DGNOME_DISABLE_DEPRECATED \ + -DDBUS_API_SUBJECT_TO_CHANGE \ + -DG_DISABLE_DEPRECATED \ + -DGDK_DISABLE_DEPRECATED \ + -DGNOME_DISABLE_DEPRECATED \ -DGNOMELOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ - -DVERSION=\"$(VERSION)\" \ + -DVERSION=\"$(VERSION)\" \ $(NULL) if WITH_NOTIFY diff --git a/gnome/applet/applet.c b/gnome/applet/applet.c index f4d1aeb65a..35000fa582 100644 --- a/gnome/applet/applet.c +++ b/gnome/applet/applet.c @@ -78,11 +78,11 @@ static GObject * nma_constructor (GType type, guint n_props, GObjectConstructParam *construct_props); static gboolean nma_icons_init (NMApplet *applet); static void nma_icons_free (NMApplet *applet); -static void nma_about_cb (NMApplet *applet); static void nma_context_menu_update (NMApplet *applet); static GtkWidget * nma_get_instance (NMApplet *applet); static void nma_update_state (NMApplet *applet); static void nma_dropdown_menu_deactivate_cb (GtkWidget *menu, NMApplet *applet); +static void nma_destroy (NMApplet *applet); static GType nma_get_type (void); /* for G_DEFINE_TYPE */ G_DEFINE_TYPE(NMApplet, nma, EGG_TYPE_TRAY_ICON) @@ -291,7 +291,7 @@ static void about_dialog_activate_link_cb (GtkAboutDialog *about, gnome_url_show (url, NULL); } -static void nma_about_cb (NMApplet *applet) +static void nma_about_cb (GtkMenuItem *mi, NMApplet *applet) { static const gchar *authors[] = { @@ -373,6 +373,87 @@ static void nma_about_cb (NMApplet *applet) #endif } + +#define AUTOSTART_ENABLE_STR "X-GNOME-Autostart-enabled=true" +#define AUTOSTART_ENABLE_STR_LEN 30 +#define AUTOSTART_DISABLE_STR "X-GNOME-Autostart-enabled=false" +#define AUTOSTART_DISABLE_STR_LEN 31 +static void G_GNUC_NORETURN nma_remove_cb (GtkMenuItem *mi, NMApplet *applet) +{ + char *src; + char *dir; + char *file; + const char *sub; + gsize src_len; + GtkWidget *dialog; + + /* + * Give the user the option of disabling autostart, if it is enabled. Autostart is in + * use if there is an nm-applet.desktop in either the system wide or the per-user + * autostart directory and it has "X-GNOME-Autostart-enabled" set to "true". To disable + * autostart, we (re)write the autostart file to the per-user location, with the + * autostart option set to "false". + */ + + dir = g_strdup_printf ("%s/.config/autostart", g_get_home_dir ()); + file = g_strdup_printf ("%s/nm-applet.desktop", dir); + + /* + * Figure out what our source file is. Try to use the user's nm-applet.desktop, first. + * If it does not exist, we use the system-wide autostart file. + */ + if (!g_file_get_contents (file, &src, &src_len, NULL)) + if (!g_file_get_contents (AUTOSTARTDIR"/nm-applet.desktop", &src, &src_len, NULL)) + goto out_free_file; + + /* If autostart is explicitly disabled or not explicitly enabled, we are done. */ + if (strstr (src, AUTOSTART_DISABLE_STR)) + goto out_free_src; + sub = strstr (src, AUTOSTART_ENABLE_STR); + if (!sub) + goto out_free_src; + + dialog = gtk_message_dialog_new_with_markup (NULL, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, + "%s\n\n%s", + _("Stop automatically running the networking applet?"), + _("The networking applet will now terminate, but will automatically launch the next time you login. Would you like to stop automatically running the networking applet on login?")); + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_YES) + { + char *dst; + gsize dst_len; + gsize sub_len; + + src_len += 1; + dst_len = src_len + 1; + dst = g_malloc (dst_len); + sub_len = sub - src; + + /* memcpy the first chunk, write in our updated string, and memcpy the remaining bytes */ + memcpy (dst, src, sub_len); + g_strlcpy (dst + sub_len, AUTOSTART_DISABLE_STR, dst_len - sub_len); + memcpy (dst + sub_len + AUTOSTART_DISABLE_STR_LEN, + sub + AUTOSTART_ENABLE_STR_LEN, + src_len - sub_len - AUTOSTART_ENABLE_STR_LEN); + dst[dst_len-1] = '\0'; + + g_mkdir_with_parents (dir, 0750); + g_file_set_contents (file, dst, dst_len, NULL); + + g_free (dst); + } + + gtk_widget_destroy (dialog); + +out_free_src: + g_free (src); +out_free_file: + g_free (file); + g_free (dir); + + nma_destroy (applet); +} + + #ifndef ENABLE_NOTIFY /* * nma_show_vpn_failure_dialog @@ -2202,6 +2283,13 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + /* Quit */ + menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Remove")); + g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (nma_remove_cb), applet); + image = gtk_image_new_from_stock (GTK_STOCK_QUIT, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + gtk_widget_show_all (menu); return menu; @@ -2440,8 +2528,7 @@ static void nma_gconf_vpn_connections_notify_callback (GConfClient *client, guin * Destroy the applet and clean up its data * */ -static void G_GNUC_NORETURN -nma_destroy (NMApplet *applet, gpointer user_data) +static void G_GNUC_NORETURN nma_destroy (NMApplet *applet) { if (applet->dropdown_menu) nma_dropdown_menu_clear (applet->dropdown_menu);