[Xfce4-commits] <thunar:master> Properly hide partitions that are not mountable by the user.
Jannis Pohlmann
noreply at xfce.org
Thu Nov 4 13:54:01 CET 2010
Updating branch refs/heads/master
to f60485387dd06953ecb5e1ec8ccc02dc13f05649 (commit)
from 8ecf66c132373bd762d84e3cd515ddf285892a8e (commit)
commit f60485387dd06953ecb5e1ec8ccc02dc13f05649
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Thu Nov 4 13:52:15 2010 +0100
Properly hide partitions that are not mountable by the user.
This requires a dirty UNIX-only inspection of the mount points. Someone
forgot to make this easy for us.
thunar/thunar-gio-extensions.c | 83 ++++++++++++++++++++++++++++++++++++---
1 files changed, 76 insertions(+), 7 deletions(-)
diff --git a/thunar/thunar-gio-extensions.c b/thunar/thunar-gio-extensions.c
index 7eaf50a..d90df9c 100644
--- a/thunar/thunar-gio-extensions.c
+++ b/thunar/thunar-gio-extensions.c
@@ -23,6 +23,9 @@
#endif
#include <gio/gio.h>
+#ifdef HAVE_GIO_UNIX
+#include <gio/gunixmounts.h>
+#endif
#include <exo/exo.h>
#include <libxfce4util/libxfce4util.h>
@@ -386,15 +389,77 @@ thunar_g_file_list_free (GList *list)
+#ifdef HAVE_GIO_UNIX
+static gboolean
+thunar_g_mount_is_internal (GMount *mount)
+{
+ const gchar *point_mount_path;
+ gboolean is_internal = FALSE;
+ GFile *root;
+ GList *lp;
+ GList *mount_points;
+ gchar *mount_path;
+
+ _thunar_return_val_if_fail (G_IS_MOUNT (mount), FALSE);
+
+ /* determine the mount path */
+ root = g_mount_get_root (mount);
+ mount_path = g_file_get_path (root);
+ g_object_unref (root);
+
+ /* assume non-internal if we cannot determine the path */
+ if (mount_path == NULL)
+ return FALSE;
+
+ if (g_unix_is_mount_path_system_internal (mount_path))
+ {
+ /* mark as internal */
+ is_internal = TRUE;
+ }
+ else
+ {
+ /* get a list of all mount points */
+ mount_points = g_unix_mount_points_get (NULL);
+
+ /* search for the mount point associated with the mount entry */
+ for (lp = mount_points; !is_internal && lp != NULL; lp = lp->next)
+ {
+ point_mount_path = g_unix_mount_point_get_mount_path (lp->data);
+
+ /* check if this is the mount point we are looking for */
+ if (g_strcmp0 (mount_path, point_mount_path) == 0)
+ {
+ /* mark as internal if the user cannot mount this device */
+ if (!g_unix_mount_point_is_user_mountable (lp->data))
+ is_internal = TRUE;
+ }
+
+ /* free the mount point, we no longer need it */
+ g_unix_mount_point_free (lp->data);
+ }
+
+ /* free the mount point list */
+ g_list_free (mount_points);
+ }
+
+ g_free (mount_path);
+
+ return is_internal;
+}
+#endif
+
+
+
gboolean
thunar_g_volume_is_removable (GVolume *volume)
{
- gboolean can_eject = FALSE;
- gboolean can_mount = FALSE;
- gboolean can_unmount = FALSE;
- gboolean is_removable = FALSE;
- GDrive *drive;
- GMount *mount;
+ gboolean can_eject = FALSE;
+ gboolean can_mount = FALSE;
+ gboolean can_unmount = FALSE;
+ gboolean is_removable = FALSE;
+ gboolean is_internal = FALSE;
+ GDrive *drive;
+ GMount *mount;
_thunar_return_val_if_fail (G_IS_VOLUME (volume), FALSE);
@@ -416,6 +481,10 @@ thunar_g_volume_is_removable (GVolume *volume)
mount = g_volume_get_mount (volume);
if (mount != NULL)
{
+#ifdef HAVE_GIO_UNIX
+ is_internal = thunar_g_mount_is_internal (mount);
+#endif
+
/* check if the volume can be unmounted */
can_unmount = g_mount_can_unmount (mount);
@@ -426,7 +495,7 @@ thunar_g_volume_is_removable (GVolume *volume)
/* determine whether the device can be mounted */
can_mount = g_volume_can_mount (volume);
- return can_eject || can_unmount || is_removable || can_mount;
+ return (!is_internal) && (can_eject || can_unmount || is_removable || can_mount);
}
More information about the Xfce4-commits
mailing list