The attached patch is meant to allow the user to modify a volume from within its target directory. It's not very well-tested. For instance, I'm not sure whether not setting the volume in libnautilus-private/nautilus-directory-async.c:link_info_done if the volume_id is NULL causes some problems when unmounting a volume. Sorry that I don't have the time to do more extensive testing. -- Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-directory-async.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-directory-async.c,v retrieving revision 1.218 diff -u -p -r1.218 nautilus-directory-async.c --- libnautilus-private/nautilus-directory-async.c 12 Dec 2005 16:59:10 -0000 1.218 +++ libnautilus-private/nautilus-directory-async.c 5 Feb 2006 13:06:34 -0000 @@ -2850,21 +2850,21 @@ link_info_done (NautilusDirectory *direc file->details->custom_icon = g_strdup (icon); nautilus_file_clear_cached_display_name (file); - volume = NULL; if (volume_id != 0) { monitor = gnome_vfs_get_volume_monitor (); + volume = gnome_vfs_volume_monitor_get_volume_by_id (monitor, volume_id); + nautilus_file_set_volume (file, volume); + gnome_vfs_volume_unref (volume); } - nautilus_file_set_volume (file, volume); - gnome_vfs_volume_unref (volume); - drive = NULL; if (drive_id != 0) { monitor = gnome_vfs_get_volume_monitor (); + drive = gnome_vfs_volume_monitor_get_drive_by_id (monitor, drive_id); + nautilus_file_set_drive (file, drive); + gnome_vfs_drive_unref (drive); } - nautilus_file_set_drive (file, drive); - gnome_vfs_drive_unref (drive); nautilus_directory_async_state_changed (directory); } Index: libnautilus-private/nautilus-file.c =================================================================== RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file.c,v retrieving revision 1.380 diff -u -p -r1.380 nautilus-file.c --- libnautilus-private/nautilus-file.c 28 Jan 2006 14:55:08 -0000 1.380 +++ libnautilus-private/nautilus-file.c 5 Feb 2006 13:06:38 -0000 @@ -884,25 +884,72 @@ void nautilus_file_set_volume (NautilusFile *file, GnomeVFSVolume *volume) { + char *activation_uri; + NautilusFile *target_file; + file->details->has_volume = volume != NULL; gnome_vfs_volume_ref (volume); g_object_set_data_full (G_OBJECT (file), "nautilus_file_volume", volume, (GDestroyNotify)gnome_vfs_volume_unref); - + + target_file = NULL; + activation_uri = NULL; + + if (volume != NULL) { + activation_uri = gnome_vfs_volume_get_activation_uri (volume); + } + + if (activation_uri != NULL) { + /* TODO prevent endless loops? */ + target_file = nautilus_file_get (activation_uri); + if (target_file != NULL && target_file != file) { + nautilus_file_set_volume (target_file, volume); + } + g_free (activation_uri); + } + + g_object_set_data_full (G_OBJECT (file), + "nautilus_file_volume_target", + target_file, + (GDestroyNotify) nautilus_file_unref); } void nautilus_file_set_drive (NautilusFile *file, GnomeVFSDrive *drive) { + char *activation_uri; + NautilusFile *target_file; + file->details->has_drive = drive != NULL; gnome_vfs_drive_ref (drive); g_object_set_data_full (G_OBJECT (file), "nautilus_file_drive", drive, (GDestroyNotify)gnome_vfs_drive_unref); + + activation_uri = NULL; + target_file = NULL; + + if (drive != NULL) { + activation_uri = gnome_vfs_drive_get_activation_uri (drive); + } + + if (activation_uri != NULL) { + /* TODO prevent endless loops? */ + target_file = nautilus_file_get (activation_uri); + if (target_file != NULL && target_file != file) { + nautilus_file_set_drive (target_file, drive); + } + g_free (activation_uri); + } + + g_object_set_data_full (G_OBJECT (file), + "nautilus_file_drive_target", + target_file, + (GDestroyNotify) nautilus_file_unref); } Index: src/file-manager/fm-actions.h =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/fm-actions.h,v retrieving revision 1.10 diff -u -p -r1.10 fm-actions.h --- src/file-manager/fm-actions.h 12 Dec 2005 16:59:11 -0000 1.10 +++ src/file-manager/fm-actions.h 5 Feb 2006 13:06:39 -0000 @@ -60,6 +60,10 @@ #define FM_ACTION_UNMOUNT_VOLUME "Unmount Volume" #define FM_ACTION_EJECT_VOLUME "Eject Volume" #define FM_ACTION_FORMAT_VOLUME "Format Volume" +#define FM_ACTION_SELF_MOUNT_VOLUME "Self Mount Volume" +#define FM_ACTION_SELF_UNMOUNT_VOLUME "Self Unmount Volume" +#define FM_ACTION_SELF_EJECT_VOLUME "Self Eject Volume" +#define FM_ACTION_SELF_FORMAT_VOLUME "Self Format Volume" #define FM_ACTION_SCRIPTS "Scripts" #define FM_ACTION_NEW_DOCUMENTS "New Documents" #define FM_ACTION_NEW_EMPTY_FILE "New Empty File" Index: src/file-manager/fm-directory-view.c =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/fm-directory-view.c,v retrieving revision 1.734 diff -u -p -r1.734 fm-directory-view.c --- src/file-manager/fm-directory-view.c 26 Jan 2006 22:20:59 -0000 1.734 +++ src/file-manager/fm-directory-view.c 5 Feb 2006 13:06:45 -0000 @@ -6286,6 +6411,100 @@ action_eject_volume_callback (GtkAction } static void +action_self_mount_volume_callback (GtkAction *action, + gpointer data) +{ + NautilusFile *file; + GnomeVFSDrive *drive; + FMDirectoryView *view; + + view = FM_DIRECTORY_VIEW (data); + + file = fm_directory_view_get_directory_as_file (view); + g_return_if_fail (file != NULL); + + drive = nautilus_file_get_drive (file); + if (drive != NULL) { + gnome_vfs_drive_mount (drive, drive_mounted_callback, NULL); + } +} + +static void +action_self_unmount_volume_callback (GtkAction *action, + gpointer data) +{ + NautilusFile *file; + GnomeVFSDrive *drive; + GnomeVFSVolume *volume; + FMDirectoryView *view; + + view = FM_DIRECTORY_VIEW (data); + + file = fm_directory_view_get_directory_as_file (view); + g_return_if_fail (file != NULL); + + 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); + } + } +} + +static void +action_self_eject_volume_callback (GtkAction *action, + gpointer data) +{ + NautilusFile *file; + GnomeVFSDrive *drive; + GnomeVFSVolume *volume; + FMDirectoryView *view; + + view = FM_DIRECTORY_VIEW (data); + + file = fm_directory_view_get_directory_as_file (view); + g_return_if_fail (file != NULL); + + if (nautilus_file_has_volume (file)) { + volume = nautilus_file_get_volume (file); + if (volume != NULL) { + gnome_vfs_volume_eject (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_eject (drive, volume_or_drive_unmounted_callback, NULL); + } + } +} + +static void +action_self_format_volume_callback (GtkAction *action, + gpointer data) +{ + NautilusFile *file; + GnomeVFSDrive *drive; + FMDirectoryView *view; + + view = FM_DIRECTORY_VIEW (data); + + file = fm_directory_view_get_directory_as_file (view); + g_return_if_fail (file != NULL); + + if (nautilus_file_has_drive (file)) { + drive = nautilus_file_get_drive (file); + if (gnome_vfs_drive_get_device_type (drive) == GNOME_VFS_DEVICE_TYPE_FLOPPY) { + g_spawn_command_line_async ("gfloppy", NULL); + } + } +} + +static void connect_to_server_response_callback (GtkDialog *dialog, int response_id, gpointer data) @@ -6682,6 +6901,22 @@ static const GtkActionEntry directory_vi N_("_Format"), NULL, /* label, accelerator */ N_("Format the selected volume"), /* tooltip */ G_CALLBACK (action_format_volume_callback) }, + { "Self Mount Volume", NULL, /* name, stock id */ + N_("_Mount Volume"), NULL, /* label, accelerator */ + N_("Mount the volume associated with the open folder"), /* tooltip */ + G_CALLBACK (action_self_mount_volume_callback) }, + { "Self Unmount Volume", NULL, /* name, stock id */ + N_("_Unmount Volume"), NULL, /* label, accelerator */ + N_("Unmount the volume associated with the open folder"), /* tooltip */ + G_CALLBACK (action_self_unmount_volume_callback) }, + { "Self Eject Volume", NULL, /* name, stock id */ + N_("_Eject"), NULL, /* label, accelerator */ + N_("Eject the volume associated with the open folder"), /* tooltip */ + G_CALLBACK (action_self_eject_volume_callback) }, + { "Self Format Volume", NULL, /* name, stock id */ + N_("_Format"), NULL, /* label, accelerator */ + N_("Format the volume associated with the open folder"), /* tooltip */ + G_CALLBACK (action_self_format_volume_callback) }, { "OpenCloseParent", NULL, /* name, stock id */ N_("Open File and Close window"), "<alt><shift>Down", /* label, accelerator */ NULL, /* tooltip */ @@ -7026,6 +7261,10 @@ real_update_menus_volumes (FMDirectoryVi gboolean show_eject; gboolean show_connect; gboolean show_format; + gboolean show_self_mount; + gboolean show_self_unmount; + gboolean show_self_eject; + gboolean show_self_format; GtkAction *action; show_mount = (selection != NULL); @@ -7084,6 +7323,36 @@ real_update_menus_volumes (FMDirectoryVi action = gtk_action_group_get_action (view->details->dir_action_group, FM_ACTION_FORMAT_VOLUME); gtk_action_set_visible (action, show_format); + + show_self_mount = show_self_unmount = show_self_eject = show_self_format = FALSE; + + file = fm_directory_view_get_directory_as_file (view); + if (file != NULL) { + gboolean show_self_connect_dummy; + + file_should_show_foreach (file, + &show_self_mount, + &show_self_unmount, + &show_self_eject, + &show_self_connect_dummy, + &show_self_format); + } + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_SELF_MOUNT_VOLUME); + gtk_action_set_visible (action, show_self_mount); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_SELF_UNMOUNT_VOLUME); + gtk_action_set_visible (action, show_self_unmount); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_SELF_EJECT_VOLUME); + gtk_action_set_visible (action, show_self_eject); + + action = gtk_action_group_get_action (view->details->dir_action_group, + FM_ACTION_SELF_FORMAT_VOLUME); + gtk_action_set_visible (action, show_self_format); } static void Index: src/file-manager/nautilus-directory-view-ui.xml =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/nautilus-directory-view-ui.xml,v retrieving revision 1.79 diff -u -p -r1.79 nautilus-directory-view-ui.xml --- src/file-manager/nautilus-directory-view-ui.xml 12 Dec 2005 16:59:11 -0000 1.79 +++ src/file-manager/nautilus-directory-view-ui.xml 5 Feb 2006 13:06:46 -0000 @@ -36,6 +36,11 @@ </placeholder> <placeholder name="File Items Placeholder"> <menuitem name="Properties" action="Properties"/> + + <menuitem name="Self Mount Volume" action="Self Mount Volume"/> + <menuitem name="Self Unmount Volume" action="Self Unmount Volume"/> + <menuitem name="Self Eject Volume" action="Self Eject Volume"/> + <menuitem name="Self Format Volume" action="Self Format Volume"/> </placeholder> <placeholder name="Global File Items Placeholder"> <menuitem name="Empty Trash" action="Empty Trash"/>
Attachment:
signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil