[Xfce4-commits] <thunar-volman:jannis/port-to-udev> Add support for blank CDs and DVDs by launching the burn software.

Jannis Pohlmann noreply at xfce.org
Tue Jul 20 11:44:01 CEST 2010


Updating branch refs/heads/jannis/port-to-udev
         to 5a7a1d542bad6d617bc5b563799e8d4e7f9ccfd2 (commit)
       from 913ed6930c389a339e02baac960bb3c28e4e9f21 (commit)

commit 5a7a1d542bad6d617bc5b563799e8d4e7f9ccfd2
Author: Jannis Pohlmann <jannis at xfce.org>
Date:   Tue Jul 20 11:42:45 2010 +0200

    Add support for blank CDs and DVDs by launching the burn software.

 configure.in.in                                    |    1 +
 thunar-volman/Makefile.am                          |    6 +
 thunar-volman/tvm-block-device.c                   |   11 +-
 thunar-volman/tvm-pango-extensions.c               |  178 ++++++++++++++++++++
 .../{tvm-run.h => tvm-pango-extensions.h}          |   22 ++--
 thunar-volman/tvm-prompt.c                         |  175 +++++++++++++++++++
 thunar-volman/{tvm-block-device.h => tvm-prompt.h} |   28 +++-
 thunar-volman/tvm-run.c                            |  138 ++++++++++++++-
 thunar-volman/tvm-run.h                            |   10 +-
 9 files changed, 536 insertions(+), 33 deletions(-)

diff --git a/configure.in.in b/configure.in.in
index 439e9ad..1a40559 100644
--- a/configure.in.in
+++ b/configure.in.in
@@ -86,6 +86,7 @@ XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.18.0])
 XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.18.0])
 XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.14.0])
 XDT_CHECK_PACKAGE([GUDEV], [gudev-1.0], [145])
+XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.7.0])
 XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.7.0])
 XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.7.0])
 
diff --git a/thunar-volman/Makefile.am b/thunar-volman/Makefile.am
index 66aa8e9..72d6a5f 100644
--- a/thunar-volman/Makefile.am
+++ b/thunar-volman/Makefile.am
@@ -40,6 +40,10 @@ thunar_volman_SOURCES =							\
 	tvm-device.h							\
 	tvm-gio-extensions.c						\
 	tvm-gio-extensions.h						\
+	tvm-pango-extensions.c						\
+	tvm-pango-extensions.h						\
+	tvm-prompt.c							\
+	tvm-prompt.h							\
 	tvm-run.c							\
 	tvm-run.h
 
@@ -50,6 +54,7 @@ thunar_volman_CFLAGS =							\
 	$(GTHREAD_CFLAGS)						\
 	$(GTK_CFLAGS)							\
 	$(GUDEV_CFLAGS)							\
+	$(LIBXFCE4UI_CFLAGS)						\
 	$(LIBXFCE4UTIL_CFLAGS)						\
 	$(XFCONF_CFLAGS)						\
 	$(PLATFORM_CFLAGS)
@@ -65,5 +70,6 @@ thunar_volman_LDADD =							\
 	$(GTHREAD_LIBS)							\
 	$(GTK_LIBS)							\
 	$(GUDEV_LIBS)							\
+	$(LIBXFCE4UI_LIBS)						\
 	$(LIBXFCE4UTIL_LIBS)						\
 	$(XFCONF_LIBS)
diff --git a/thunar-volman/tvm-block-device.c b/thunar-volman/tvm-block-device.c
index d111884..42ed5f4 100644
--- a/thunar-volman/tvm-block-device.c
+++ b/thunar-volman/tvm-block-device.c
@@ -326,6 +326,7 @@ tvm_block_device_added (TvmContext *context)
   gboolean     is_partition;
   gboolean     is_volume;
   guint64      audio_tracks;
+  GError      *error = NULL;
 
   g_return_if_fail (context != NULL);
 
@@ -352,11 +353,15 @@ tvm_block_device_added (TvmContext *context)
             g_udev_device_get_property_as_uint64 (context->device, 
                                                   "ID_CDROM_MEDIA_TRACK_COUNT_AUDIO");
 
+          /* check if we have a blank CD/DVD here */
           if (g_strcmp0 (media_state, "blank") == 0)
             {
-#if 0
-              tvm_run_burn_software (client, device, channel, &error);
-#endif
+              /* try to run the burn program */
+              if (!tvm_run_burn_software (context, &error))
+                g_propagate_error (context->error, error);
+
+              /* finish processing the device */
+              tvm_device_handler_finished (context);
             }
           else if (audio_tracks > 0)
             {
diff --git a/thunar-volman/tvm-pango-extensions.c b/thunar-volman/tvm-pango-extensions.c
new file mode 100644
index 0000000..d7f68fb
--- /dev/null
+++ b/thunar-volman/tvm-pango-extensions.c
@@ -0,0 +1,178 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2006-2007 Benedikt Meurer <benny at 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_STDARG_H
+#include <stdarg.h>
+#endif
+
+#include <thunar-volman/tvm-pango-extensions.h>
+
+
+
+static PangoAttrList *tvm_pango_attr_list_wrap (PangoAttribute *attribute, ...) G_GNUC_MALLOC;
+
+
+
+static PangoAttrList*
+tvm_pango_attr_list_wrap (PangoAttribute *attribute, ...)
+{
+  PangoAttrList *attr_list;
+  va_list        args;
+
+  /* allocate a new attribute list */
+  attr_list = pango_attr_list_new ();
+
+  /* add all specified attributes */
+  va_start (args, attribute);
+  while (attribute != NULL)
+    {
+      attribute->start_index = 0;
+      attribute->end_index = -1;
+      pango_attr_list_insert (attr_list, attribute);
+      attribute = va_arg (args, PangoAttribute *);
+    }
+  va_end (args);
+
+  return attr_list;
+}
+
+
+
+/**
+ * tvm_pango_attr_list_big:
+ *
+ * Returns a #PangoAttrList for rendering big text.
+ * The returned list is owned by the callee and must
+ * not be freed or modified by the caller.
+ *
+ * Return value: a #PangoAttrList for rendering big text.
+ **/
+PangoAttrList*
+tvm_pango_attr_list_big (void)
+{
+  static PangoAttrList *attr_list = NULL;
+  if (G_UNLIKELY (attr_list == NULL))
+    attr_list = tvm_pango_attr_list_wrap (pango_attr_scale_new (PANGO_SCALE_LARGE), NULL);
+  return attr_list;
+}
+
+
+
+/**
+ * tvm_pango_attr_list_big_bold:
+ *
+ * Returns a #PangoAttrList for rendering big bold text.
+ * The returned list is owned by the callee and must
+ * not be freed or modified by the caller.
+ *
+ * Return value: a #PangoAttrList for rendering big bold text.
+ **/
+PangoAttrList*
+tvm_pango_attr_list_big_bold (void)
+{
+  static PangoAttrList *attr_list = NULL;
+  if (G_UNLIKELY (attr_list == NULL))
+    attr_list = tvm_pango_attr_list_wrap (pango_attr_scale_new (PANGO_SCALE_LARGE), pango_attr_weight_new (PANGO_WEIGHT_BOLD), NULL);
+  return attr_list;
+}
+
+
+
+/**
+ * tvm_pango_attr_list_bold:
+ *
+ * Returns a #PangoAttrList for rendering bold text.
+ * The returned list is owned by the callee and must
+ * not be freed or modified by the caller.
+ *
+ * Return value: a #PangoAttrList for rendering bold text.
+ **/
+PangoAttrList*
+tvm_pango_attr_list_bold (void)
+{
+  static PangoAttrList *attr_list = NULL;
+  if (G_UNLIKELY (attr_list == NULL))
+    attr_list = tvm_pango_attr_list_wrap (pango_attr_weight_new (PANGO_WEIGHT_BOLD), NULL);
+  return attr_list;
+}
+
+
+
+/**
+ * tvm_pango_attr_list_italic:
+ *
+ * Returns a #PangoAttrList for rendering italic text.
+ * The returned list is owned by the callee and must
+ * not be freed or modified by the caller.
+ *
+ * Return value: a #PangoAttrList for rendering italic text.
+ **/
+PangoAttrList*
+tvm_pango_attr_list_italic (void)
+{
+  static PangoAttrList *attr_list = NULL;
+  if (G_UNLIKELY (attr_list == NULL))
+    attr_list = tvm_pango_attr_list_wrap (pango_attr_style_new (PANGO_STYLE_ITALIC), NULL);
+  return attr_list;
+}
+
+
+
+/**
+ * tvm_pango_attr_list_small_italic:
+ *
+ * Returns a #PangoAttrList for rendering small italic text.
+ * The returned list is owned by the callee and must
+ * not be freed or modified by the caller.
+ *
+ * Return value: a #PangoAttrList for rendering small italic text.
+ **/
+PangoAttrList*
+tvm_pango_attr_list_small_italic (void)
+{
+  static PangoAttrList *attr_list = NULL;
+  if (G_UNLIKELY (attr_list == NULL))
+    attr_list = tvm_pango_attr_list_wrap (pango_attr_scale_new (PANGO_SCALE_SMALL), pango_attr_style_new (PANGO_STYLE_ITALIC), NULL);
+  return attr_list;
+}
+
+
+
+/**
+ * tvm_pango_attr_list_underline_single:
+ *
+ * Returns a #PangoAttrList for underlining text using a single line.
+ * The returned list is owned by the callee and must not be freed
+ * or modified by the caller.
+ *
+ * Return value: a #PangoAttrList for underlining text using a single line.
+ **/
+PangoAttrList*
+tvm_pango_attr_list_underline_single (void)
+{
+  static PangoAttrList *attr_list = NULL;
+  if (G_UNLIKELY (attr_list == NULL))
+    attr_list = tvm_pango_attr_list_wrap (pango_attr_underline_new (PANGO_UNDERLINE_SINGLE), NULL);
+  return attr_list;
+}
diff --git a/thunar-volman/tvm-run.h b/thunar-volman/tvm-pango-extensions.h
similarity index 52%
copy from thunar-volman/tvm-run.h
copy to thunar-volman/tvm-pango-extensions.h
index cd450db..01446df 100644
--- a/thunar-volman/tvm-run.h
+++ b/thunar-volman/tvm-pango-extensions.h
@@ -1,6 +1,6 @@
 /* vi:set et ai sw=2 sts=2 ts=2: */
 /*-
- * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
+ * Copyright (c) 2006-2007 Benedikt Meurer <benny at 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
@@ -18,20 +18,20 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef __TVM_RUN_H__
-#define __TVM_RUN_H__
+#ifndef __TVM_PANGO_EXTENSIONS_H__
+#define __TVM_PANGO_EXTENSIONS_H__
 
-#include <gio/gio.h>
-
-#include <thunar-volman/tvm-context.h>
+#include <pango/pango.h>
 
 G_BEGIN_DECLS
 
-gboolean tvm_run_command (TvmContext  *context,
-                          GMount      *mount,
-                          const gchar *command,
-                          GError     **error);
+PangoAttrList *tvm_pango_attr_list_big               (void) G_GNUC_CONST G_GNUC_INTERNAL;
+PangoAttrList *tvm_pango_attr_list_big_bold          (void) G_GNUC_CONST G_GNUC_INTERNAL;
+PangoAttrList *tvm_pango_attr_list_bold              (void) G_GNUC_CONST G_GNUC_INTERNAL;
+PangoAttrList *tvm_pango_attr_list_italic            (void) G_GNUC_CONST G_GNUC_INTERNAL;
+PangoAttrList *tvm_pango_attr_list_small_italic      (void) G_GNUC_CONST G_GNUC_INTERNAL;
+PangoAttrList *tvm_pango_attr_list_underline_single  (void) G_GNUC_CONST G_GNUC_INTERNAL;
 
 G_END_DECLS
 
-#endif /* !__TVM_RUN_H__ */
+#endif /* !__TVM_PANGO_EXTENSIONS_H__ */
diff --git a/thunar-volman/tvm-prompt.c b/thunar-volman/tvm-prompt.c
new file mode 100644
index 0000000..985cf0c
--- /dev/null
+++ b/thunar-volman/tvm-prompt.c
@@ -0,0 +1,175 @@
+/* vi:set et ai sw=2 sts=2 ts=2: */
+/*-
+ * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>
+ * Copyright (c) 2010 Jannis Pohlmann <jannis at 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_STDARG_H
+#include <stdarg.h>
+#endif
+
+#include <gudev/gudev.h>
+
+#include <gtk/gtk.h>
+
+#include <libxfce4ui/libxfce4ui.h>
+
+#include <thunar-volman/tvm-context.h>
+#include <thunar-volman/tvm-pango-extensions.h>
+#include <thunar-volman/tvm-prompt.h>
+
+
+
+static void
+tvm_prompt_uevent (GUdevClient *client,
+                   const gchar *action,
+                   GUdevDevice *device,
+                   GtkWidget   *dialog)
+{
+  GUdevDevice *dialog_device;
+
+  g_return_if_fail (G_UDEV_IS_CLIENT (client));
+  g_return_if_fail (action != NULL && *action != '\0');
+  g_return_if_fail (G_UDEV_IS_DEVICE (device));
+  g_return_if_fail (GTK_IS_DIALOG (dialog));
+
+  /* ignore "move" and "add" actions, "change" might only be correct 
+   * for CDs/DVDs though */
+  if (g_strcmp0 (action, "remove") != 0 && g_strcmp0 (action, "change") != 0)
+    return;
+
+  /* determine the device belonging to the dialog */
+  dialog_device = g_object_get_data (G_OBJECT (dialog), "device");
+
+  /* the device should be set, otherwise it's a bug in the application */
+  g_assert (dialog_device != NULL);
+
+  /* check if the removed/changed device belongs to the dialog */
+  if (g_strcmp0 (g_udev_device_get_sysfs_path (device),
+                 g_udev_device_get_sysfs_path (dialog_device)) == 0)
+    {
+      /* cancel the dialog */
+      gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
+    }
+}
+
+
+
+gint
+tvm_prompt (TvmContext  *context,
+            const gchar *icon,
+            const gchar *title,
+            const gchar *primary_text,
+            const gchar *secondary_text,
+            const gchar *first_button_text,
+            ...)
+{
+  GtkWidget *dialog;
+  GtkWidget *hbox;
+  GtkWidget *image;
+  GtkWidget *label;
+  GtkWidget *vbox;
+  va_list    args;
+  gint       response;
+
+  g_return_val_if_fail (context != NULL, GTK_RESPONSE_CANCEL);
+  
+  /* create a new dialog */
+  dialog = gtk_dialog_new ();
+  gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+  g_object_set_data_full (G_OBJECT (dialog), "device", g_object_ref (context->device), 
+                          g_object_unref);
+  gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 6);
+  gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 12);
+  gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+
+  /* apply the specified title */
+  if (title != NULL && *title != '\0')
+    gtk_window_set_title (GTK_WINDOW (dialog), title);
+
+  /* create the specified buttons */
+  if (first_button_text != NULL)
+    {
+      va_start (args, first_button_text);
+      for (response = va_arg (args, gint); first_button_text != NULL; )
+        {
+          /* insert the button */
+          gtk_dialog_add_button (GTK_DIALOG (dialog), first_button_text, response);
+          first_button_text = va_arg (args, const gchar *);
+          if (first_button_text == NULL)
+            break;
+          response = va_arg (args, gint);
+        }
+      va_end (args);
+    }
+
+  /* create the hbox */
+  hbox = gtk_hbox_new (FALSE, 12);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE, 0);
+  gtk_widget_show (hbox);
+
+  /* apply the specified icon */
+  if (G_LIKELY (icon != NULL))
+    {
+      gtk_window_set_icon_name (GTK_WINDOW (dialog), icon);
+
+      /* setup an image for the icon */
+      image = gtk_image_new_from_icon_name (icon, GTK_ICON_SIZE_DIALOG);
+      gtk_misc_set_alignment (GTK_MISC (image), 0.0f, 0.0f);
+      gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+      gtk_widget_show (image);
+    }
+
+  /* setup the vbox */
+  vbox = gtk_vbox_new (FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+  gtk_widget_show (vbox);
+
+  /* setup the primary text */
+  label = gtk_label_new (primary_text);
+  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f);
+  gtk_label_set_attributes (GTK_LABEL (label), tvm_pango_attr_list_big_bold ());
+  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+  gtk_widget_show (label);
+
+  /* setup the secondary text */
+  if (G_LIKELY (secondary_text != NULL))
+    {
+      label = gtk_label_new (secondary_text);
+      gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+      gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f);
+      gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+      gtk_widget_show (label);
+    }
+
+  g_signal_connect (context->client, "uevent", G_CALLBACK (tvm_prompt_uevent), dialog);
+
+  /* run the dialog */
+  response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+  /* clean up */
+  gtk_widget_destroy (dialog);
+
+  return response;
+}
diff --git a/thunar-volman/tvm-block-device.h b/thunar-volman/tvm-prompt.h
similarity index 59%
copy from thunar-volman/tvm-block-device.h
copy to thunar-volman/tvm-prompt.h
index 5f6f1d7..886a3e4 100644
--- a/thunar-volman/tvm-block-device.h
+++ b/thunar-volman/tvm-prompt.h
@@ -1,5 +1,6 @@
 /* vi:set et ai sw=2 sts=2 ts=2: */
 /*-
+ * Copyright (c) 2007 Benedikt Meurer <benny at xfce.org>
  * Copyright (c) 2010 Jannis Pohlmann <jannis at xfce.org>
  *
  * This program is free software; you can redistribute it and/or 
@@ -18,18 +19,35 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef __TVM_BLOCK_DEVICE_H__
-#define __TVM_BLOCK_DEVICE_H__
+#ifndef __TVM_PROMPT_H__
+#define __TVM_PROMPT_H__
 
 #include <glib.h>
 
 #include <thunar-volman/tvm-context.h>
-#include <thunar-volman/tvm-device.h>
 
 G_BEGIN_DECLS
 
-void tvm_block_device_added (TvmContext *context);
+enum
+{
+  TVM_RESPONSE_NONE,
+  TVM_RESPONSE_PLAY,
+  TVM_RESPONSE_MUSIC,
+  TVM_RESPONSE_BROWSE,
+  TVM_RESPONSE_PHOTOS,
+  TVM_RESPONSE_AUTORUN,
+  TVM_RESPONSE_BURN_DATA_CD,
+  TVM_RESPONSE_BURN_AUDIO_CD,
+};
+
+gint tvm_prompt (TvmContext  *context,
+                 const gchar *icon,
+                 const gchar *title,
+                 const gchar *primary_text,
+                 const gchar *secondary_text,
+                 const gchar *first_button_text,
+                 ...) G_GNUC_NULL_TERMINATED;
 
 G_END_DECLS
 
-#endif /* !__TVM_BLOCK_DEVICE_H__ */
+#endif /* !__TVM_PROMPT_H__ */
diff --git a/thunar-volman/tvm-run.c b/thunar-volman/tvm-run.c
index 23ea8aa..571047d 100644
--- a/thunar-volman/tvm-run.c
+++ b/thunar-volman/tvm-run.c
@@ -24,7 +24,12 @@
 
 #include <gio/gio.h>
 
+#include <gtk/gtk.h>
+
+#include <libxfce4util/libxfce4util.h>
+
 #include <thunar-volman/tvm-context.h>
+#include <thunar-volman/tvm-prompt.h>
 #include <thunar-volman/tvm-run.h>
 
 
@@ -46,7 +51,7 @@ tvm_run_command (TvmContext  *context,
   gchar       *quoted;
 
   g_return_val_if_fail (context != NULL, FALSE);
-  g_return_val_if_fail (G_IS_MOUNT (mount), FALSE);
+  g_return_val_if_fail (mount == NULL || G_IS_MOUNT (mount), FALSE);
   g_return_val_if_fail (command != NULL && *command != '\0', FALSE);
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
@@ -67,22 +72,30 @@ tvm_run_command (TvmContext  *context,
               break;
 
             case 'm': /* mount point */
-              mount_point = g_mount_get_root (mount);
-              mount_path = g_file_get_path (mount_point);
-              if (G_LIKELY (mount_path != NULL))
+              if (mount != NULL)
                 {
-                  /* substitute mount point quoted */
-                  quoted = g_shell_quote (mount_path);
-                  g_string_append (command_line, quoted);
-                  g_free (quoted);
+                  mount_point = g_mount_get_root (mount);
+                  mount_path = g_file_get_path (mount_point);
+                  if (G_LIKELY (mount_path != NULL))
+                    {
+                      /* substitute mount point quoted */
+                      quoted = g_shell_quote (mount_path);
+                      g_string_append (command_line, quoted);
+                      g_free (quoted);
+                    }
+                  else
+                    {
+                      /* %m must always be substituted */
+                      g_string_append (command_line, "\"\"");
+                    }
+                  g_free (mount_path);
+                  g_object_unref (mount_point);
                 }
               else
                 {
                   /* %m must always be substituted */
                   g_string_append (command_line, "\"\"");
                 }
-              g_free (mount_path);
-              g_object_unref (mount_point);
               break;
               
             case '%':
@@ -124,3 +137,108 @@ tvm_run_command (TvmContext  *context,
 
   return result;
 }
+
+
+
+gboolean 
+tvm_run_burn_software (TvmContext *context,
+                       GError    **error)
+{
+  static const gchar *cd_criteria[] = {
+    "ID_CDROM_MEDIA_CD_R",
+    "ID_CDROM_MEDIA_CD_RW",
+  };
+  
+  static const gchar *dvd_criteria[] = {
+    "ID_CDROM_MEDIA_DVD_R",
+    "ID_CDROM_MEDIA_DVD_RW",
+    "ID_CDROM_MEDIA_DVD_PLUS_R",
+    "ID_CDROM_MEDIA_DVD_PLUS_RW",
+  };
+  gboolean            autoburn;
+  gboolean            is_cd = FALSE;
+  gboolean            is_dvd = FALSE;
+  gboolean            result = FALSE;
+  const gchar        *command_property;
+  gchar              *command;
+  guint               n;
+  gint                response;
+
+  g_return_val_if_fail (context != NULL, FALSE);
+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+  /* abort without error if autoburning is turned off */
+  autoburn = xfconf_channel_get_bool (context->channel, "/autoburn/enabled", FALSE);
+  if (!autoburn)
+    {
+      g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, 
+                   _("Autoburning of blank CDs/DVDs is disabled"));
+      return FALSE;
+    }
+
+  /* check if the disc is a CD */
+  for (n = 0; !is_cd && n < G_N_ELEMENTS (cd_criteria); ++n)
+    if (g_udev_device_get_property_as_boolean (context->device, cd_criteria[n]))
+      is_cd = TRUE;
+
+  /* check if the disc is a DVD */
+  for (n = 0; !is_cd && !is_dvd && n < G_N_ELEMENTS (dvd_criteria); ++n)
+    if (g_udev_device_get_property_as_boolean (context->device, dvd_criteria[n]))
+      is_dvd = TRUE;
+
+  g_debug ("is_cd = %i, is_dvd = %i", is_cd, is_dvd);
+
+  if (is_dvd)
+    {
+      /* ask what to do with the empty DVD */
+      response = tvm_prompt (context, "gnome-dev-disc-dvdr",
+                             _("Blank DVD inserted"),
+                             _("You have inserted a blank DVD."),
+                             _("What would you like to do?"),
+                             _("Ig_nore"), GTK_RESPONSE_CANCEL,
+                             _("Burn _DVD"), TVM_RESPONSE_BURN_DATA_CD, 
+                             NULL);
+    }
+  else
+    {
+      /* ask whether to burn data or audio CD */
+      response = tvm_prompt (context, "gnome-dev-disc-cdr",
+                             _("Blank CD inserted"),
+                             _("You have inserted a blank CD."),
+                             _("What would you like to do?"),
+                             _("Ig_nore"), GTK_RESPONSE_CANCEL,
+                             _("Burn _Data CD"), TVM_RESPONSE_BURN_DATA_CD,
+                             _("Burn _Audio CD"), TVM_RESPONSE_BURN_AUDIO_CD,
+                             NULL);
+    }
+
+  /* determine the autoburn command property */
+  if (response == TVM_RESPONSE_BURN_DATA_CD)
+    command_property = "/autoburn/data-cd-command";
+  else if (response == TVM_RESPONSE_BURN_AUDIO_CD)
+    command_property = "/autoburn/audio-cd-command";
+  else 
+    return TRUE;
+
+  /* determine the command to launch */
+  command = xfconf_channel_get_string (context->channel, command_property, NULL);
+
+  /* only try to launch the command if it is set and non-empty */
+  if (command != NULL && *command != '\0')
+    {
+      /* try to execute the preferred burn software */
+      result = tvm_run_command (context, NULL, command, error);
+    }
+  else
+    {
+      g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+                   _("The burn command may not be empty"));
+      result = FALSE;
+    }
+
+  /* free the burn command */
+  g_free (command);
+
+  return result;
+}
+
diff --git a/thunar-volman/tvm-run.h b/thunar-volman/tvm-run.h
index cd450db..dc67d13 100644
--- a/thunar-volman/tvm-run.h
+++ b/thunar-volman/tvm-run.h
@@ -27,10 +27,12 @@
 
 G_BEGIN_DECLS
 
-gboolean tvm_run_command (TvmContext  *context,
-                          GMount      *mount,
-                          const gchar *command,
-                          GError     **error);
+gboolean tvm_run_command        (TvmContext  *context,
+                                 GMount      *mount,
+                                 const gchar *command,
+                                 GError     **error);
+gboolean  tvm_run_burn_software (TvmContext  *context,
+                                 GError     **error);
 
 G_END_DECLS
 



More information about the Xfce4-commits mailing list