Upstream-Status: Inappropriate [enable feature] Index: gtk+-2.12.3/gtk/gtkfilesystemunix.c =================================================================== --- gtk+-2.12.3.orig/gtk/gtkfilesystemunix.c 2007-12-04 16:52:08.000000000 +0000 +++ gtk+-2.12.3/gtk/gtkfilesystemunix.c 2008-01-02 13:15:02.000000000 +0000 @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #ifdef HAVE_UNISTD_H @@ -474,7 +475,55 @@ static GSList * gtk_file_system_unix_list_volumes (GtkFileSystem *file_system) { - return g_slist_append (NULL, get_root_volume ()); + struct statvfs stv; + struct stat st; + GSList * l = g_slist_append (NULL, get_root_volume ()); + + if (!statvfs ("/.", &stv)) + { + fsblkcnt_t root_blocks = stv.f_blocks; + fsfilcnt_t root_files = stv.f_files; + + GDir * dir; + if ((dir = g_dir_open ("/media", 0, NULL)) != NULL) + { + const gchar * name; + while ((name = g_dir_read_name (dir)) != NULL) + { + gchar * abs_name; + + /* Skip ram disks */ + if (!strcmp (name, "ram")) + continue; + + abs_name = g_strconcat ("/media/", name, NULL); + + if (!stat (abs_name, &st) && S_ISDIR (st.st_mode)) + { + gchar * dot = g_strconcat (abs_name, "/.", NULL); + if (!statvfs (dot, &stv) && + (stv.f_blocks != root_blocks || + stv.f_files != root_files)) + { + GtkFilePath * path = + gtk_file_system_filename_to_path (file_system, + abs_name); + + if (path) + l = g_slist_append (l, path); + } + + g_free (dot); + } + + g_free (abs_name); + } + + g_dir_close (dir); + } + } + + return l; } static GtkFileSystemVolume * @@ -488,13 +537,18 @@ remove_trailing_slash (const char *filename) { int len; - + len = strlen (filename); - if (len > 1 && filename[len - 1] == '/') - return g_strndup (filename, len - 1); - else - return g_memdup (filename, len + 1); + if (len > 1) + { + gchar *c = g_utf8_prev_char (filename + len); + + if (c && *c == '/') + return g_strndup (filename, len - 1); + } + + return g_memdup (filename, len + 1); } /* Delay callback dispatching @@ -1128,7 +1182,7 @@ gtk_file_system_unix_volume_get_base_path (GtkFileSystem *file_system, GtkFileSystemVolume *volume) { - return gtk_file_path_new_dup ("/"); + return gtk_file_path_copy ((GtkFilePath*)volume); } static gboolean @@ -1162,7 +1216,32 @@ gtk_file_system_unix_volume_get_display_name (GtkFileSystem *file_system, GtkFileSystemVolume *volume) { - return g_strdup (_("File System")); /* Same as Nautilus */ + gchar * slash; + gchar * path; + gchar * c; + + g_return_val_if_fail (file_system && volume, NULL); + + path = gtk_file_system_path_to_filename (file_system, (GtkFilePath*) volume); + + g_return_val_if_fail (path && *path, NULL); + + if (path[0] == '/' && !path[1]) + return g_strdup (_("Filesystem")); /* Same as Nautilus */ + + /* Now the media volumes */ + /* strip trailing / if any */ + c = g_utf8_prev_char (path + strlen(path)); + + if (*c == '/') + *c = 0; + + slash = g_utf8_strrchr (path, -1, '/'); + + if (!slash) + return g_strdup (path); + + return g_strdup (slash + 1); } static IconType @@ -1250,10 +1329,57 @@ GtkFileSystemVolume *volume, GError **error) { - /* FIXME: maybe we just always want to return GTK_STOCK_HARDDISK here? - * or the new tango icon name? - */ - return g_strdup ("gnome-dev-harddisk"); + gchar * c; + gchar * slash; + gchar * path = NULL; + GtkFilePath * fpath; + const gchar * id = NULL; + + g_return_val_if_fail (file_system && volume, NULL); + + fpath = gtk_file_system_volume_get_base_path (file_system, volume); + + if (!fpath) + goto out; + + path = gtk_file_system_path_to_filename (file_system, fpath); + gtk_file_path_free (fpath); + + if (!path || !*path || (*path == '/' && !path[1])) + goto out; + + /* Now the media volumes */ + /* strip trailing / if any */ + c = g_utf8_prev_char (path + strlen(path)); + + if (*c == '/') + *c = 0; + + slash = g_utf8_strrchr (path, -1, '/'); + + if (slash) + { + slash++; + + if (!strcmp (slash, "card")) + id = "gnome-dev-media-sdmmc"; + else if (!strcmp (slash, "cf")) + id = "gnome-dev-media-cf"; + else if (!strncmp (slash, "mmc", 3)) + id = "gnome-dev-media-sdmmc"; + else if (!strcmp (slash, "usbhdd")) + id = "gnome-dev-removable-usb"; + else + id = "gnome-dev-removable"; + } + + out: + g_free (path); + + if (!id) + id = "gnome-fs-blockdev"; + + return g_strdup (id); } static char *