Updating branch refs/heads/master to 56bb0025b40cea452511d2c14c1f6eff893b4c91 (commit) from 7c5ae37a16eac3f16925ce6e043e41eb498c357e (commit)
commit 56bb0025b40cea452511d2c14c1f6eff893b4c91 Author: Jannis Pohlmann <jan...@xfce.org> Date: Wed Jul 21 18:21:11 2010 +0200 Copy exo-mount-notify-1 over to thunar (as thunar-mount-notify-1). Now all we need to do is integrate it into Thunar and thunar-volman. Makefile.am | 26 ++++- configure.in.in | 20 +++- thunar-mount-notify/Makefile.am | 46 +++++++ thunar-mount-notify/main.c | 269 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 354 insertions(+), 7 deletions(-) diff --git a/Makefile.am b/Makefile.am index dce959c..64a54ed 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,25 @@ -# $Id$ +# vi:set ts=8 sw=8 noet ai nocindent syntax=automake: +# - +# Copyright (c) 2010 Jannis Pohlmann <jan...@xfce.org> +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY 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, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +if HAVE_LIBNOTIFY +THUNAR_MOUNT_NOTIFY_SUBDIR=thunar-mount-notify +endif SUBDIRS = \ icons \ @@ -8,6 +29,7 @@ SUBDIRS = \ tdb \ thunarx \ thunar \ + $(THUNAR_MOUNT_NOTIFY_SUBDIR) \ docs \ examples \ plugins @@ -95,5 +117,3 @@ DISTCLEANFILES = \ DISTCHECK_CONFIGURE_FLAGS = \ --enable-gtk-doc \ --enable-gen-doc - -# vi:set ts=8 sw=8 noet ai nocindent syntax=automake: diff --git a/configure.in.in b/configure.in.in index 6892334..f7ae8d6 100644 --- a/configure.in.in +++ b/configure.in.in @@ -177,6 +177,12 @@ dnl *************************************************************** XDT_CHECK_OPTIONAL_PACKAGE([GUDEV], [gudev-1.0], [145], [gudev], [GUDev (required for thunar-volman)]) +dnl ************************************** +dnl *** Optional support for libnotify *** +dnl ************************************** +XDT_CHECK_OPTIONAL_PACKAGE([LIBNOTIFY], [libnotify], [0.4.0], [notifications], + [Mount notification support], [yes]) + dnl ************************* dnl *** Check for gtk-doc *** dnl ************************* @@ -289,6 +295,7 @@ thunar/Makefile thunarx/Makefile thunarx/thunarx-2.pc thunarx/thunarx-config.h +thunar-mount-notify/Makefile ]) dnl *************************** @@ -317,13 +324,18 @@ echo "* GUDev (required for thunar-volman): yes" else echo "* GUDev (required for thunar-volman): no" fi -echo "* Debug Support: $enable_debug" +if test x"$LIBNOTIFY_FOUND" = x"yes"; then +echo "* Mount notification support: yes" +else +echo "* Mount notification support: no" +fi +echo "* Debug Support: $enable_debug" if test x"$enable_gen_doc" = x"yes"; then -echo "* Documentation: yes (generate)" +echo "* Documentation: yes (generate)" elif test -d "${srcdir}/docs/manual/html"; then -echo "* Documentation: yes (in tarball)" +echo "* Documentation: yes (in tarball)" else -echo "* Documentation: no" +echo "* Documentation: no" fi echo echo "Additional Plugins:" diff --git a/thunar-mount-notify/Makefile.am b/thunar-mount-notify/Makefile.am new file mode 100644 index 0000000..1e72f22 --- /dev/null +++ b/thunar-mount-notify/Makefile.am @@ -0,0 +1,46 @@ +# vi:set ts=8 sw=8 noet ai nocindent syntax=automake: +# - +# Copyright (c) 2010 Jannis Pohlmann <jan...@xfce.org> +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY 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, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +INCLUDES = \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -DG_LOG_DOMAIN=\"thunar-mount-notify\" \ + -DPACKAGE_LOCALE_DIR=\"$(localedir)\" \ + $(PLATFORM_CPPFLAGS) + +libexec_PROGRAMS = \ + thunar-mount-notify-1 + +thunar_mount_notify_1_SOURCES = \ + main.c + +thunar_mount_notify_1_CFLAGS = \ + $(GTK_CFLAGS) \ + $(LIBNOTIFY_CFLAGS) \ + $(LIBXFCE4UTIL_CFLAGS) \ + $(PLATFORM_CFLAGS) + +thunar_mount_notify_1_LDFLAGS = \ + -no-undefined \ + $(PLATFORM_LDFLAGS) + +thunar_mount_notify_1_LDADD = \ + $(GTK_LIBS) \ + $(LIBNOTIFY_LIBS) \ + $(LIBXFCE4UTIL_LIBS) diff --git a/thunar-mount-notify/main.c b/thunar-mount-notify/main.c new file mode 100644 index 0000000..c7cf8f8 --- /dev/null +++ b/thunar-mount-notify/main.c @@ -0,0 +1,269 @@ +/* vi:set et ai sw=2 sts=2 ts=2: */ +/*- + * Copyright (c) 2006-2007 Benedikt Meurer <be...@xfce.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY 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, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif + +#ifdef HAVE_ERRNO_H +#include <errno.h> +#endif +#ifdef HAVE_SIGNAL_H +#include <signal.h> +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#include <glib/gstdio.h> + +#include <gtk/gtk.h> + +#include <libnotify/notify.h> + +#include <libxfce4util/libxfce4util.h> + + + +/* make sure all defines are present */ +#ifndef NOTIFY_EXPIRES_NEVER +#define NOTIFY_EXPIRES_NEVER 0 +#endif +#ifndef NOTIFY_EXPIRES_DEFAULT +#define NOTIFY_EXPIRES_DEFAULT -1 +#endif + + + +/* --- globals --- */ +static gboolean opt_eject = FALSE; +static gchar *opt_icon = NULL; +static gchar *opt_name = NULL; +static gboolean opt_readonly = FALSE; +static gboolean opt_version = FALSE; +static gint signal_fds[2]; +static NotifyNotification *notification = NULL; + + + +/* --- command line options --- */ +static GOptionEntry entries[] = +{ + { "eject", 'e', 0, G_OPTION_ARG_NONE, &opt_eject, NULL, NULL, }, + { "icon", 'i', 0, G_OPTION_ARG_STRING, &opt_icon, NULL, NULL, }, + { "name", 'n', 0, G_OPTION_ARG_STRING, &opt_name, NULL, NULL, }, + { "readonly", 'r', 0, G_OPTION_ARG_NONE, &opt_readonly, NULL, NULL, }, + { "version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, N_ ("Print version information and exit"), NULL, }, + { NULL, }, +}; + + + +static void +signal_func (int signo) +{ + gint ignore; + + /* SIGUSR1 means success */ + ignore = write (signal_fds[1], (signo == SIGUSR1) ? "U" : "K", 1); +} + + + +static gboolean +signal_io_func (GIOChannel *channel, + GIOCondition condition, + gpointer user_data) +{ + gchar *message; + gchar c; + + /* read the first character from signal pipe */ + if (read (signal_fds[0], &c, 1) < 1) + return TRUE; + + /* perform the appropriate operation */ + if (c == 'U') /* SIGUSR1 */ + { + /* the operation succeed */ + if (G_LIKELY (!opt_eject)) + { + /* tell the user that the device can be removed now */ + message = g_strdup_printf (_("The device \"%s\" is now safe to remove."), opt_name); + notify_notification_update (notification, _("Device is now safe to remove"), message, opt_icon); + notify_notification_set_timeout (notification, NOTIFY_EXPIRES_DEFAULT); + notify_notification_set_urgency (notification, NOTIFY_URGENCY_LOW); + notify_notification_show (notification, NULL); + g_free (message); + + /* release the notification, so it stays active even + * after the process exits, otherwise we'll block + * Thunar's unmount operations... + */ + g_object_unref (G_OBJECT (notification)); + } + } + + /* terminate the process */ + gtk_main_quit (); + + return TRUE; +} + + + +int +main (int argc, char **argv) +{ + const gchar *summary; + GIOChannel *channel; + GError *err = NULL; + gchar *message; + const gchar *display_name; + + /* initialize the i18n support */ + xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8"); + + /* initialize GTK+ */ + if (!gtk_init_with_args (&argc, &argv, "Xfce Mount Notify", entries, GETTEXT_PACKAGE, &err)) + { + /* check if we have an error message */ + if (G_LIKELY (err == NULL)) + { + /* no error message, the GUI initialization failed */ + display_name = gdk_get_display_arg_name (); + g_fprintf (stderr, "exo-mount-notify: %s: %s\n", _("Failed to open display"), (display_name != NULL) ? display_name : " "); + } + else + { + /* yep, there's an error, so print it */ + g_fprintf (stderr, "exo-mount-notify: %s\n", err->message); + } + return EXIT_FAILURE; + } + + /* check if we should print version */ + if (G_UNLIKELY (opt_version)) + { + g_print ("%s %s\n\n", g_get_prgname (), PACKAGE_VERSION); + g_print (_("Copyright (c) %s\n" + " os-cillation e.K. All rights reserved.\n\n" + "Written by Benedikt Meurer <be...@xfce.org>.\n\n"), + "2006-2007"); + g_print (_("%s comes with ABSOLUTELY NO WARRANTY,\n" + "You may redistribute copies of %s under the terms of\n" + "the GNU Lesser General Public License which can be found in the\n" + "%s source package.\n\n"), g_get_prgname (), g_get_prgname (), PACKAGE_TARNAME); + g_print (_("Please report bugs to <%s>.\n"), PACKAGE_BUGREPORT); + return EXIT_SUCCESS; + } + + /* icon defaults to "gnome-dev-harddisk" */ + if (G_UNLIKELY (opt_icon == NULL || *opt_icon == '\0')) + opt_icon = "gnome-dev-harddisk"; + + /* make sure that a device name was specified */ + if (G_UNLIKELY (opt_name == NULL || *opt_icon == '\0')) + { + /* the caller must specify a usable device name */ + g_printerr ("%s: %s.\n", g_get_prgname (), "Must specify a device name"); + return EXIT_FAILURE; + } + + /* try to initialize libnotify */ + if (!notify_init ("exo-mount")) + { + /* it doesn't make sense to continue from here on */ + g_printerr ("%s: %s.\n", g_get_prgname (), "Failed to initialize libnotify"); + return EXIT_FAILURE; + } + + /* setup the signal pipe */ + if (pipe (signal_fds) < 0) + { + g_printerr ("%s: Failed to setup signal pipe: %s.\n", g_get_prgname (), g_strerror (errno)); + return EXIT_FAILURE; + } + + /* register the appropriate signal handlers */ + signal (SIGTERM, signal_func); + signal (SIGHUP, signal_func); + signal (SIGINT, signal_func); + signal (SIGUSR1, signal_func); + + /* watch the read side of the signal pipe */ + channel = g_io_channel_unix_new (signal_fds[0]); + g_io_add_watch (channel, G_IO_IN, signal_io_func, NULL); + g_io_channel_unref (channel); + + /* different summary/message based on whether it's readonly */ + if (G_UNLIKELY (opt_readonly)) + { + /* check if we eject */ + if (G_LIKELY (opt_eject)) + { + /* read-only, just ejecting */ + summary = _("Ejecting device"); + message = g_strdup_printf (_("The device \"%s\" is being ejected. This may take some time."), opt_name); + } + else + { + /* read-only, just unmounting */ + summary = _("Unmounting device"); + message = g_strdup_printf (_("The device \"%s\" is being unmounted by the system. Please do " + "not remove the media or disconnect the drive."), opt_name); + } + } + else + { + /* not read-only, writing back data */ + summary = _("Writing data to device"); + message = g_strdup_printf (_("There is data that needs to be written to the device \"%s\" before it can be " + "removed. Please do not remove the media or disconnect the drive."), opt_name); + } + + /* setup the notification */ + notification = notify_notification_new (summary, message, opt_icon, NULL); + g_signal_connect (G_OBJECT (notification), "closed", G_CALLBACK (gtk_main_quit), NULL); + g_object_add_weak_pointer (G_OBJECT (notification), (gpointer) ¬ification); + notify_notification_set_urgency (notification, NOTIFY_URGENCY_CRITICAL); + notify_notification_set_timeout (notification, NOTIFY_EXPIRES_NEVER); + notify_notification_show (notification, NULL); + g_free (message); + + /* enter the main loop */ + gtk_main (); + + /* release the notification */ + if (G_LIKELY (notification != NULL)) + { + notify_notification_close (notification, NULL); + g_object_unref (G_OBJECT (notification)); + } + + return EXIT_SUCCESS; +} _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits