Filed as bug 156169 [1]. Proposed patch attached. [1] http://bugzilla.gnome.org/show_bug.cgi?id=156169 -- Christian Neumair <chris gnome-de org>
Index: src/file-manager/fm-directory-view.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-directory-view.c,v
retrieving revision 1.704
diff -u -p -r1.704 fm-directory-view.c
--- src/file-manager/fm-directory-view.c 22 Aug 2005 21:17:58 -0000 1.704
+++ src/file-manager/fm-directory-view.c 24 Aug 2005 15:19:24 -0000
@@ -5723,28 +5723,23 @@ action_mount_volume_callback (GtkAction
gpointer data)
{
NautilusFile *file;
- GList *selection;
+ GList *selection, *l;
GnomeVFSDrive *drive;
FMDirectoryView *view;
view = FM_DIRECTORY_VIEW (data);
selection = fm_directory_view_get_selection (view);
+ for (l = selection; l != NULL; l = l->next) {
+ file = NAUTILUS_FILE (l->data);
- if (!eel_g_list_exactly_one_item (selection)) {
- nautilus_file_list_free (selection);
- return;
- }
-
- file = NAUTILUS_FILE (selection->data);
-
- if (nautilus_file_has_drive (file)) {
- drive = nautilus_file_get_drive (file);
- if (drive != NULL) {
- gnome_vfs_drive_mount (drive, drive_mounted_callback, NULL);
+ if (nautilus_file_has_drive (file)) {
+ drive = nautilus_file_get_drive (file);
+ if (drive != NULL) {
+ gnome_vfs_drive_mount (drive, drive_mounted_callback, NULL);
+ }
}
}
-
nautilus_file_list_free (selection);
}
@@ -5793,7 +5788,7 @@ action_unmount_volume_callback (GtkActio
gpointer data)
{
NautilusFile *file;
- GList *selection;
+ GList *selection, *l;
GnomeVFSDrive *drive;
GnomeVFSVolume *volume;
FMDirectoryView *view;
@@ -5802,34 +5797,29 @@ action_unmount_volume_callback (GtkActio
selection = fm_directory_view_get_selection (view);
- if (!eel_g_list_exactly_one_item (selection)) {
- nautilus_file_list_free (selection);
- return;
- }
-
- file = NAUTILUS_FILE (selection->data);
-
- if (nautilus_file_has_volume (file)) {
- volume = nautilus_file_get_volume (file);
- if (volume != NULL) {
- gnome_vfs_volume_unmount (volume, volume_or_drive_unmounted_callback, NULL);
- }
- } else if (nautilus_file_has_drive (file)) {
- drive = nautilus_file_get_drive (file);
- if (drive != NULL) {
- gnome_vfs_drive_unmount (drive, volume_or_drive_unmounted_callback, NULL);
+ for (l = selection; l != NULL; l = l->next) {
+ file = NAUTILUS_FILE (l->data);
+ if (nautilus_file_has_volume (file)) {
+ volume = nautilus_file_get_volume (file);
+ if (volume != NULL) {
+ gnome_vfs_volume_unmount (volume, volume_or_drive_unmounted_callback, NULL);
+ }
+ } else if (nautilus_file_has_drive (file)) {
+ drive = nautilus_file_get_drive (file);
+ if (drive != NULL) {
+ gnome_vfs_drive_unmount (drive, volume_or_drive_unmounted_callback, NULL);
+ }
}
}
-
nautilus_file_list_free (selection);
}
static void
action_eject_volume_callback (GtkAction *action,
- gpointer data)
+ gpointer data)
{
NautilusFile *file;
- GList *selection;
+ GList *selection, *l;
GnomeVFSDrive *drive;
GnomeVFSVolume *volume;
FMDirectoryView *view;
@@ -5837,26 +5827,21 @@ action_eject_volume_callback (GtkAction
view = FM_DIRECTORY_VIEW (data);
selection = fm_directory_view_get_selection (view);
-
- if (!eel_g_list_exactly_one_item (selection)) {
- nautilus_file_list_free (selection);
- return;
- }
-
- file = NAUTILUS_FILE (selection->data);
-
- if (nautilus_file_has_volume (file)) {
- volume = nautilus_file_get_volume (file);
- if (volume != NULL) {
- gnome_vfs_volume_eject (volume, volume_or_drive_ejected_callback, NULL);
- }
- } else if (nautilus_file_has_drive (file)) {
- drive = nautilus_file_get_drive (file);
- if (drive != NULL) {
- gnome_vfs_drive_eject (drive, volume_or_drive_ejected_callback, NULL);
+ for (l = selection; l != NULL; l = l->next) {
+ file = NAUTILUS_FILE (l->data);
+
+ if (nautilus_file_has_volume (file)) {
+ volume = nautilus_file_get_volume (file);
+ if (volume != NULL) {
+ gnome_vfs_volume_eject (volume, volume_or_drive_ejected_callback, NULL);
+ }
+ } else if (nautilus_file_has_drive (file)) {
+ drive = nautilus_file_get_drive (file);
+ if (drive != NULL) {
+ gnome_vfs_drive_eject (drive, volume_or_drive_ejected_callback, NULL);
+ }
}
- }
-
+ }
nautilus_file_list_free (selection);
}
@@ -6485,55 +6470,86 @@ file_list_all_are_folders (GList *file_l
}
static void
+file_should_show_foreach (NautilusFile *file,
+ gboolean *show_mount,
+ gboolean *show_unmount,
+ gboolean *show_eject,
+ gboolean *show_connect)
+{
+ GnomeVFSVolume *volume;
+ GnomeVFSDrive *drive;
+ char *uri;
+
+ *show_mount = FALSE;
+ *show_unmount = FALSE;
+ *show_eject = FALSE;
+ *show_connect = FALSE;
+
+ if (nautilus_file_has_volume (file)) {
+ *show_unmount = TRUE;
+
+ volume = nautilus_file_get_volume (file);
+ *show_eject = eject_for_type (gnome_vfs_volume_get_device_type (volume));
+ } else if (nautilus_file_has_drive (file)) {
+ drive = nautilus_file_get_drive (file);
+ *show_eject = eject_for_type (gnome_vfs_drive_get_device_type (drive));
+ if (gnome_vfs_drive_is_mounted (drive)) {
+ *show_unmount = TRUE;
+ } else {
+ *show_mount = TRUE;
+ }
+ } else if (nautilus_file_is_nautilus_link (file)) {
+ uri = nautilus_file_get_activation_uri (file);
+ if (uri != NULL &&
+ (eel_istr_has_prefix (uri, "ftp:") ||
+ eel_istr_has_prefix (uri, "dav:") ||
+ eel_istr_has_prefix (uri, "davs:"))) {
+ *show_connect = TRUE;
+ }
+ g_free (uri);
+ } else if (nautilus_file_is_mime_type (file,
+ "x-directory/smb-share")) {
+ *show_connect = TRUE;
+ }
+}
+
+static void
real_update_menus_volumes (FMDirectoryView *view,
GList *selection,
gint selection_count)
{
+ GList *l;
NautilusFile *file;
gboolean show_mount;
gboolean show_unmount;
gboolean show_eject;
gboolean show_connect;
- GnomeVFSVolume *volume;
- GnomeVFSDrive *drive;
GtkAction *action;
- char *uri;
-
- show_mount = FALSE;
- show_unmount = FALSE;
- show_eject = FALSE;
- show_connect = FALSE;
-
- if (selection_count == 1) {
- file = NAUTILUS_FILE (selection->data);
- if (nautilus_file_has_volume (file)) {
- show_unmount = TRUE;
+ show_mount = (selection != NULL);
+ show_unmount = (selection != NULL);
+ show_eject = (selection != NULL);
+ show_connect = (selection != NULL && selection_count == 1);
+
+ for (l = selection; l != NULL && (show_mount || show_unmount
+ || show_eject || show_connect);
+ l = l->next) {
+ gboolean show_mount_one;
+ gboolean show_unmount_one;
+ gboolean show_eject_one;
+ gboolean show_connect_one;
- volume = nautilus_file_get_volume (file);
- show_eject = eject_for_type (gnome_vfs_volume_get_device_type (volume));
- } else if (nautilus_file_has_drive (file)) {
- drive = nautilus_file_get_drive (file);
- show_eject = eject_for_type (gnome_vfs_drive_get_device_type (drive));
- if (gnome_vfs_drive_is_mounted (drive)) {
- show_unmount = TRUE;
- } else {
- show_mount = TRUE;
- }
- } else if (nautilus_file_is_nautilus_link (file)) {
- uri = nautilus_file_get_activation_uri (file);
- if (uri != NULL &&
- (eel_istr_has_prefix (uri, "ftp:") ||
- eel_istr_has_prefix (uri, "dav:") ||
- eel_istr_has_prefix (uri, "davs:"))) {
- show_connect = TRUE;
- }
- g_free (uri);
- } else if (nautilus_file_is_mime_type (file,
- "x-directory/smb-share")) {
- show_connect = TRUE;
- }
-
+ file = NAUTILUS_FILE (l->data);
+ file_should_show_foreach (file,
+ &show_mount_one,
+ &show_unmount_one,
+ &show_eject_one,
+ &show_connect_one);
+
+ show_mount &= show_mount_one;
+ show_unmount &= show_unmount_one;
+ show_eject &= show_eject_one;
+ show_connect &= show_connect_one;
}
/* We don't want both eject and unmount, since eject
Attachment:
signature.asc
Description: This is a digitally signed message part