[Xfce4-commits] <thunar-volman:jannis/port-to-udev-etc> Add tvm_run_command() and tvm_run_resolve_mount_point() back.
Jannis Pohlmann
noreply at xfce.org
Wed Jan 20 23:48:01 CET 2010
Updating branch refs/heads/jannis/port-to-udev-etc
to 320cfe46c38b2627262e4144346e3de7fb6b0eec (commit)
from 9a60a05211908bb2a6aa5df7edf309888425095f (commit)
commit 320cfe46c38b2627262e4144346e3de7fb6b0eec
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Wed Jan 20 23:45:15 2010 +0100
Add tvm_run_command() and tvm_run_resolve_mount_point() back.
When the Xfconf properties for autoburn are set, we can now spawn the
user's favorite burn software again when a blank disc is inserted.
Already works with "xfburn -d" and "xfburn -a".
thunar-volman/tvm-run.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++-
thunar-volman/tvm-run.h | 5 ++
2 files changed, 156 insertions(+), 1 deletions(-)
diff --git a/thunar-volman/tvm-run.c b/thunar-volman/tvm-run.c
index 2ce7536..be12501 100644
--- a/thunar-volman/tvm-run.c
+++ b/thunar-volman/tvm-run.c
@@ -34,6 +34,65 @@
+static gchar *
+tvm_run_resolve_mount_point (GUdevDevice *device)
+{
+ GVolumeMonitor *monitor;
+ GMount *mount;
+ GFile *file;
+ GList *volumes;
+ GList *lp;
+ gchar *unix_device;
+ gchar *mount_point = NULL;
+
+ /* get the default GIO volume monitor */
+ monitor = g_volume_monitor_get ();
+
+ /* retrieve the list of available volumes from the monitor */
+ volumes = g_volume_monitor_get_volumes (monitor);
+
+ /* iterate over all volumes */
+ for (lp = volumes; lp != NULL; lp = lp->next)
+ {
+ /* determine the device file corresponding to the volume */
+ unix_device = g_volume_get_identifier (lp->data,
+ G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE);
+
+ /* match the device file of the volume against the device file of our device */
+ if (g_strcmp0 (unix_device, g_udev_device_get_device_file (device)) == 0)
+ {
+ /* found the correct volume, now check if it is mounted */
+ mount = g_volume_get_mount (lp->data);
+ if (mount != NULL)
+ {
+ /* volume is mounted, determine mount point path */
+ file = g_mount_get_root (mount);
+ mount_point = g_file_get_path (file);
+
+ /* clean up */
+ g_object_unref (file);
+ g_object_unref (mount);
+ }
+ }
+
+ /* free the device file string */
+ g_free (unix_device);
+
+ /* release the volume */
+ g_object_unref (lp->data);
+ }
+
+ /* destroy the volume list */
+ g_list_free (volumes);
+
+ /* we no longer need the monitor */
+ g_object_unref (monitor);
+
+ return mount_point;
+}
+
+
+
gboolean
tvm_run_burn_software (GUdevClient *client,
GUdevDevice *device,
@@ -119,7 +178,7 @@ tvm_run_burn_software (GUdevClient *client,
if (command != NULL && *command != '\0')
{
/* try to execute the preferred burn software */
- /* result = tvm_run_command (device, command, NULL, NULL, error); */
+ result = tvm_run_command (client, device, channel, command, NULL, NULL, error);
}
else
{
@@ -132,3 +191,94 @@ tvm_run_burn_software (GUdevClient *client,
return result;
}
+
+
+
+gboolean
+tvm_run_command (GUdevClient *client,
+ GUdevDevice *device,
+ XfconfChannel *channel,
+ const gchar *command,
+ GError **error)
+{
+ const gchar *p;
+ gboolean result;
+ GString *command_line;
+ gchar **argv;
+ gchar *device_file;
+ gchar *mount_point;
+ gchar *quoted;
+
+ g_return_val_if_fail (G_UDEV_IS_CLIENT (client), FALSE);
+ g_return_val_if_fail (G_UDEV_IS_DEVICE (device), FALSE);
+ g_return_val_if_fail (XFCONF_IS_CHANNEL (channel), FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ /* perform the required substitutions */
+ command_line = g_string_new (NULL);
+ for (p = command; *p != '\0'; ++p)
+ {
+ /* check if we should substitute */
+ if (G_UNLIKELY (p[0] == '%' && p[1] != '\0'))
+ {
+ /* check which substitution to perform */
+ switch (*++p)
+ {
+ case 'd': /* device file */
+ device_file = g_udev_device_get_device_file (device);
+ if (G_LIKELY (device_file != NULL))
+ g_string_append (command_line, device_file);
+ break;
+
+ case 'm': /* mount point */
+ mount_point = tvm_run_resolve_mount_point (device);
+ if (G_LIKELY (mount_point != NULL))
+ {
+ /* substitute mount point quoted */
+ quoted = g_shell_quote (mount_point);
+ g_string_append (command_line, quoted);
+ g_free (quoted);
+ }
+ else
+ {
+ /* %m must always be substituted */
+ g_string_append (command_line, "\"\"");
+ }
+ g_free (mount_point);
+ break;
+
+ case '%':
+ g_string_append_c (command_line, '%');
+ break;
+
+ default:
+ g_string_append_c (command_line, '%');
+ g_string_append_c (command_line, *p);
+ break;
+ }
+ }
+ else
+ {
+ /* just append the character */
+ g_string_append_c (command_line, *p);
+ }
+ }
+
+ /* try to parse the command line */
+ result = g_shell_parse_argv (command_line->str, NULL, &argv, error);
+ if (G_LIKELY (result))
+ {
+ g_debug ("%s", command_line->str);
+
+ /* try to spawn the command asynchronously in the users home directory */
+ result = g_spawn_async (g_get_home_dir (), argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, error);
+
+ /* cleanup */
+ g_strfreev (argv);
+ }
+
+ /* cleanup */
+ g_string_free (command_line, TRUE);
+
+ return result;
+}
diff --git a/thunar-volman/tvm-run.h b/thunar-volman/tvm-run.h
index 7b48a5b..64771fb 100644
--- a/thunar-volman/tvm-run.h
+++ b/thunar-volman/tvm-run.h
@@ -31,6 +31,11 @@ gboolean tvm_run_burn_software (GUdevClient *client,
GUdevDevice *device,
XfconfChannel *channel,
GError **error);
+gboolean tvm_run_command (GUdevClient *client,
+ GUdevDevice *device,
+ XfconfChannel *channel,
+ const gchar *command,
+ GError **error);
G_END_DECLS
More information about the Xfce4-commits
mailing list