summaryrefslogtreecommitdiff
path: root/thunar-volman
diff options
context:
space:
mode:
authorJannis Pohlmann <jannis@xfce.org>2010-07-22 13:47:49 +0200
committerJannis Pohlmann <jannis@xfce.org>2010-07-25 19:42:30 +0200
commitec4a642dac6bdf799b868daa41a4c9c43aa2adb4 (patch)
treec062f268974b3e41dd5be3c17160d58fc509d450 /thunar-volman
parente6833035f20332b23e4e76f3eb96117680628bb8 (diff)
downloadthunar-volman-ec4a642dac6bdf799b868daa41a4c9c43aa2adb4.tar.gz
Display detection and mount notifications if libnotify is available.
Diffstat (limited to 'thunar-volman')
-rw-r--r--thunar-volman/Makefile.am11
-rw-r--r--thunar-volman/main.c23
-rw-r--r--thunar-volman/tvm-block-device.c62
-rw-r--r--thunar-volman/tvm-input-device.c23
-rw-r--r--thunar-volman/tvm-notify.c83
-rw-r--r--thunar-volman/tvm-notify.h37
-rw-r--r--thunar-volman/tvm-usb-device.c15
7 files changed, 250 insertions, 4 deletions
diff --git a/thunar-volman/Makefile.am b/thunar-volman/Makefile.am
index e64b656..4e9b00b 100644
--- a/thunar-volman/Makefile.am
+++ b/thunar-volman/Makefile.am
@@ -28,6 +28,12 @@ INCLUDES = \
bin_PROGRAMS = \
thunar-volman
+if HAVE_LIBNOTIFY
+tvm_notify_sources = \
+ tvm-notify.c \
+ tvm-notify.h
+endif
+
thunar_volman_SOURCES = \
main.c \
tvm-block-device.c \
@@ -47,7 +53,8 @@ thunar_volman_SOURCES = \
tvm-run.c \
tvm-run.h \
tvm-usb-device.c \
- tvm-usb-device.h
+ tvm-usb-device.h \
+ $(tvm_notify_sources)
thunar_volman_CFLAGS = \
$(DBUS_CFLAGS) \
@@ -56,6 +63,7 @@ thunar_volman_CFLAGS = \
$(GTHREAD_CFLAGS) \
$(GTK_CFLAGS) \
$(GUDEV_CFLAGS) \
+ $(LIBNOTIFY_CFLAGS) \
$(LIBXFCE4UI_CFLAGS) \
$(LIBXFCE4UTIL_CFLAGS) \
$(XFCONF_CFLAGS) \
@@ -72,6 +80,7 @@ thunar_volman_LDADD = \
$(GTHREAD_LIBS) \
$(GTK_LIBS) \
$(GUDEV_LIBS) \
+ $(LIBNOTIFY_LIBS) \
$(LIBXFCE4UI_LIBS) \
$(LIBXFCE4UTIL_LIBS) \
$(XFCONF_LIBS)
diff --git a/thunar-volman/main.c b/thunar-volman/main.c
index 2943c88..b502059 100644
--- a/thunar-volman/main.c
+++ b/thunar-volman/main.c
@@ -33,6 +33,10 @@
#include <gudev/gudev.h>
+#ifdef HAVE_LIBNOTIFY
+#include <libnotify/notify.h>
+#endif
+
#include <libxfce4util/libxfce4util.h>
#include <xfconf/xfconf.h>
@@ -97,6 +101,20 @@ main (int argc,
if (!g_thread_supported ())
g_thread_init (NULL);
+#ifdef HAVE_LIBNOTIFY
+ if (notify_init (PACKAGE_NAME))
+ {
+ /* we do this to work around bugs in libnotify < 0.6.0. Older
+ * versions crash in notify_uninit() when no notifications are
+ * displayed before. These versions also segfault when the
+ * ret_spec_version parameter of notify_get_server_info is
+ * NULL... */
+ gchar *spec_version = NULL;
+ notify_get_server_info (NULL, NULL, NULL, &spec_version);
+ g_free (spec_version);
+ }
+#endif
+
/* initialize GTK+ */
if (!gtk_init_with_args (&argc, &argv, NULL, option_entries, GETTEXT_PACKAGE, &error))
{
@@ -196,6 +214,11 @@ main (int argc,
exit_code = EXIT_FAILURE;
}
+#ifdef HAVE_LIBNOTIFY
+ if (notify_is_initted ())
+ notify_uninit ();
+#endif
+
/* release the device context */
if (context != NULL)
tvm_context_free (context);
diff --git a/thunar-volman/tvm-block-device.c b/thunar-volman/tvm-block-device.c
index b586df1..77fd287 100644
--- a/thunar-volman/tvm-block-device.c
+++ b/thunar-volman/tvm-block-device.c
@@ -33,6 +33,11 @@
#include <gudev/gudev.h>
+#ifdef HAVE_LIBNOTIFY
+#include <libnotify/notify.h>
+#include <thunar-volman/tvm-notify.h>
+#endif
+
#include <libxfce4util/libxfce4util.h>
#include <thunar-volman/tvm-block-device.h>
@@ -584,14 +589,65 @@ tvm_block_device_mounted (TvmContext *context,
GMount *mount,
GError **error)
{
- gboolean success = FALSE;
- GError *err = NULL;
- guint n;
+ const gchar *summary;
+ const gchar *icon;
+ const gchar *volume_name;
+ gboolean is_cdrom;
+ gboolean is_dvd;
+ gboolean success = FALSE;
+ GError *err = NULL;
+ gchar *decoded_name;
+ gchar *message;
+ guint n;
g_return_if_fail (context != NULL);
g_return_if_fail (G_IS_MOUNT (mount));
g_return_if_fail (error == NULL || *error == NULL);
+#ifdef HAVE_LIBNOTIFY
+ /* distinguish between CDs and DVDs */
+ is_cdrom = g_udev_device_get_property_as_boolean (context->device, "ID_CDROM_MEDIA_CD");
+ is_dvd = g_udev_device_get_property_as_boolean (context->device, "ID_CDROM_MEDIA_DVD");
+
+ if (is_cdrom || is_dvd)
+ {
+ /* generate notification info */
+ icon = "drive-optical";
+ summary = is_cdrom ? _("CD mounted") : _("DVD mounted");
+ message = g_strdup (is_cdrom
+ ? _("The CD was mounted automatically")
+ : _("The DVD was mounted automatically"));
+ }
+ else
+ {
+ /* fetch the volume name */
+ volume_name = g_udev_device_get_property (context->device, "ID_FS_LABEL_ENC");
+ decoded_name = tvm_notify_decode (volume_name);
+
+ /* generate notification info */
+ icon = "drive-removable-media";
+ summary = _("Volume mounted");
+ if (decoded_name != NULL)
+ {
+ message = g_strdup_printf (_("The volume \"%s\" was mounted\n"
+ "automatically"), decoded_name);
+ }
+ else
+ {
+ message = g_strdup_printf (_("The inserted volume was mounted\n"
+ "automatically"));
+ }
+
+ g_free (decoded_name);
+ }
+
+ /* display the notification */
+ tvm_notify (icon, summary, message);
+
+ /* clean up */
+ g_free (message);
+#endif
+
/* try block device handlers (iPod, cameras etc.) until one succeeds */
for (n = 0; !success && err == NULL && n < G_N_ELEMENTS (block_device_handlers); ++n)
success = (block_device_handlers[n]) (context, mount, &err);
diff --git a/thunar-volman/tvm-input-device.c b/thunar-volman/tvm-input-device.c
index 2747be1..ef79b15 100644
--- a/thunar-volman/tvm-input-device.c
+++ b/thunar-volman/tvm-input-device.c
@@ -29,6 +29,7 @@
#include <thunar-volman/tvm-input-device.h>
#include <thunar-volman/tvm-context.h>
#include <thunar-volman/tvm-device.h>
+#include <thunar-volman/tvm-notify.h>
#include <thunar-volman/tvm-run.h>
@@ -36,6 +37,9 @@
void
tvm_input_device_added (TvmContext *context)
{
+ const gchar *icon;
+ const gchar *summary;
+ const gchar *message;
const gchar *id_class;
const gchar *id_model;
const gchar *id_usb_driver;
@@ -58,6 +62,10 @@ tvm_input_device_added (TvmContext *context)
/* we have a keyboard */
enabled_property = "/autokeyboard/enabled";
command_property = "/autokeyboard/command";
+
+ icon = _("input-keyboard");
+ summary = _("Keyboard detected");
+ message = _("A keyboard was detected");
}
else if (g_strcmp0 (driver, "wacom") == 0
|| g_strcmp0 (id_usb_driver, "wacom") == 0)
@@ -65,6 +73,10 @@ tvm_input_device_added (TvmContext *context)
/* we have a wacom tablet */
enabled_property = "/autotablet/enabled";
command_property = "/autotablet/command";
+
+ icon = _("input-tablet");
+ summary = _("Tablet detected");
+ message = _("A graphics tablet was detected");
}
else if (g_strcmp0 (id_class, "mouse") == 0)
{
@@ -75,12 +87,20 @@ tvm_input_device_added (TvmContext *context)
/* we have a tablet that can be used as a mouse */
enabled_property = "/autotablet/enabled";
command_property = "/autotablet/command";
+
+ icon = _("input-tablet");
+ summary = _("Tablet detected");
+ message = _("A graphics tablet was detected");
}
else
{
/* we have a normal mouse */
enabled_property = "/automouse/enabled";
command_property = "/automouse/command";
+
+ icon = _("input-mouse");
+ summary = _("Mouse detected");
+ message = _("A mouse was detected");
}
}
@@ -91,6 +111,9 @@ tvm_input_device_added (TvmContext *context)
enabled = xfconf_channel_get_bool (context->channel, enabled_property, FALSE);
if (enabled)
{
+ /* display a detection notification */
+ tvm_notify (icon, summary, message);
+
/* fetch the command for the input device type and try to run it */
command = xfconf_channel_get_string (context->channel, command_property, NULL);
if (command != NULL && *command != '\0')
diff --git a/thunar-volman/tvm-notify.c b/thunar-volman/tvm-notify.c
new file mode 100644
index 0000000..1b30505
--- /dev/null
+++ b/thunar-volman/tvm-notify.c
@@ -0,0 +1,83 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2010 Jannis Pohlmann <jannis@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
+
+#include <glib.h>
+
+#include <libnotify/notify.h>
+
+#include <libxfce4util/libxfce4util.h>
+
+#include <thunar-volman/tvm-notify.h>
+
+
+
+void
+tvm_notify (const gchar *icon,
+ const gchar *summary,
+ const gchar *message)
+{
+ NotifyNotification *notification;
+
+ notification = notify_notification_new (summary, message, icon, NULL);
+ notify_notification_set_urgency (notification, NOTIFY_URGENCY_NORMAL);
+ notify_notification_set_timeout (notification, NOTIFY_EXPIRES_DEFAULT);
+ notify_notification_show (notification, NULL);
+ g_object_unref (notification);
+}
+
+
+
+gchar *
+tvm_notify_decode (const gchar *str)
+{
+ GString *string;
+ const gchar *p;
+ gchar *result;
+ gchar decoded_c;
+
+ if (str == NULL)
+ return NULL;
+
+ if (!g_utf8_validate (str, -1, NULL))
+ return NULL;
+
+ string = g_string_new (NULL);
+
+ for (p = str; p != NULL && *p != '\0'; ++p)
+ {
+ if (*p == '\\' && p[1] == 'x' && g_ascii_isalnum (p[2]) && g_ascii_isalnum (p[3]))
+ {
+ decoded_c = (g_ascii_xdigit_value (p[2]) << 4) | g_ascii_xdigit_value (p[3]);
+ g_string_append_c (string, decoded_c);
+ p = p + 3;
+ }
+ else
+ g_string_append_c (string, *p);
+ }
+
+ result = string->str;
+ g_string_free (string, FALSE);
+
+ return result;
+}
diff --git a/thunar-volman/tvm-notify.h b/thunar-volman/tvm-notify.h
new file mode 100644
index 0000000..9d1c578
--- /dev/null
+++ b/thunar-volman/tvm-notify.h
@@ -0,0 +1,37 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2010 Jannis Pohlmann <jannis@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.
+ */
+
+#ifndef __TVM_NOTIFY_H__
+#define __TVM_NOTIFY_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+void tvm_notify (const gchar *icon,
+ const gchar *summary,
+ const gchar *message);
+
+gchar *tvm_notify_decode (const gchar *str);
+
+G_END_DECLS
+
+#endif /* !__TVM_NOTIFY_H__ */
+
diff --git a/thunar-volman/tvm-usb-device.c b/thunar-volman/tvm-usb-device.c
index 02b1529..3e99f27 100644
--- a/thunar-volman/tvm-usb-device.c
+++ b/thunar-volman/tvm-usb-device.c
@@ -30,12 +30,16 @@
#include <thunar-volman/tvm-device.h>
#include <thunar-volman/tvm-run.h>
#include <thunar-volman/tvm-usb-device.h>
+#include <thunar-volman/tvm-notify.h>
void
tvm_usb_device_added (TvmContext *context)
{
+ const gchar *icon;
+ const gchar *summary;
+ const gchar *message;
const gchar *driver;
const gchar *enabled_property = NULL;
const gchar *command_property = NULL;
@@ -57,6 +61,10 @@ tvm_usb_device_added (TvmContext *context)
enabled_property = "/autophoto/enabled";
command_property = "/autophoto/command";
+
+ icon = "camera-photo";
+ summary = _("Camera detected");
+ message = _("A photo camera was detected");
}
else if (g_strcmp0 (driver, "usblp") == 0)
{
@@ -64,6 +72,10 @@ tvm_usb_device_added (TvmContext *context)
enabled_property = "/autoprinter/enabled";
command_property = "/autoprinter/command";
+
+ icon = "printer";
+ summary = _("Printer detected");
+ message = _("A USB printer was detected");
}
/* check if we have a device that we support */
@@ -73,6 +85,9 @@ tvm_usb_device_added (TvmContext *context)
enabled = xfconf_channel_get_bool (context->channel, enabled_property, FALSE);
if (enabled)
{
+ /* display a detection notification */
+ tvm_notify (icon, summary, message);
+
/* fetch the command for the input device type and try to run it */
command = xfconf_channel_get_string (context->channel, command_property, NULL);
if (command != NULL && *command != '\0')