Fixed bug with "Disks" submenu in desktop context menu where

the volume-mounting behavior would sometimes run when the
	context menu appeared.

	* libnautilus-extensions/nautilus-volume-monitor.h:
	* libnautilus-extensions/nautilus-volume-monitor.c:
	(nautilus_volume_monitor_mount_unmount_removable):
	Added boolean parameter to specify whether to mount or
	unmount; previously it always toggled the current state.

	* src/file-manager/fm-desktop-icon-view.c:
	(mount_parameters_new),	(mount_parameters_free),
	(mount_parameters_free_wrapper): New little helper functions
	for dealing with the parameters to the mount_or_unmount callback.
	(mount_or_unmount_removable_volume): Now specifies whether to
	mount or unmount based on command state, rather than always
	toggling; also updates the menu state after the mount/unmount.
	(update_disks_menu): Pass view as well as mount_path for
	callback data, using mount_parameters_new & _free.
This commit is contained in:
John Sullivan 2000-11-17 17:08:22 +00:00
parent 9e7f5397c3
commit a930796519
6 changed files with 91 additions and 21 deletions

View file

@ -1,3 +1,25 @@
2000-11-17 John Sullivan <sullivan@eazel.com>
Fixed bug with "Disks" submenu in desktop context menu where
the volume-mounting behavior would sometimes run when the
context menu appeared.
* libnautilus-extensions/nautilus-volume-monitor.h:
* libnautilus-extensions/nautilus-volume-monitor.c:
(nautilus_volume_monitor_mount_unmount_removable):
Added boolean parameter to specify whether to mount or
unmount; previously it always toggled the current state.
* src/file-manager/fm-desktop-icon-view.c:
(mount_parameters_new), (mount_parameters_free),
(mount_parameters_free_wrapper): New little helper functions
for dealing with the parameters to the mount_or_unmount callback.
(mount_or_unmount_removable_volume): Now specifies whether to
mount or unmount based on command state, rather than always
toggling; also updates the menu state after the mount/unmount.
(update_disks_menu): Pass view as well as mount_path for
callback data, using mount_parameters_new & _free.
2000-11-16 Pavel Cisler <pavel@eazel.com>
reviewed by: Mathieu Lacage <mathieu@eazel.com>

View file

@ -1105,7 +1105,8 @@ nautilus_volume_monitor_each_mounted_volume (NautilusVolumeMonitor *monitor,
gboolean
nautilus_volume_monitor_mount_unmount_removable (NautilusVolumeMonitor *monitor,
const char *mount_point)
const char *mount_point,
gboolean should_mount)
{
gboolean is_mounted, found_volume;
char *argv[3];
@ -1130,14 +1131,15 @@ nautilus_volume_monitor_mount_unmount_removable (NautilusVolumeMonitor *monitor,
/* Get mount state and then decide to mount/unmount the volume */
if (found_volume) {
is_mounted = nautilus_volume_monitor_volume_is_mounted (volume);
if (should_mount != is_mounted) {
argv[0] = is_mounted ? "/bin/umount" : "/bin/mount";
argv[1] = (char *) mount_point;
argv[2] = NULL;
argv[0] = is_mounted ? "/bin/umount" : "/bin/mount";
argv[1] = (char *) mount_point;
argv[2] = NULL;
exec_err = gnome_execute_async (g_get_home_dir(), 2, argv);
if (exec_err == -1) {
is_mounted = !is_mounted;
exec_err = gnome_execute_async (g_get_home_dir(), 2, argv);
if (exec_err == -1) {
is_mounted = !is_mounted;
}
}
}

View file

@ -103,7 +103,8 @@ char *nautilus_volume_monitor_get_volume_name (const NautilusVolume *volu
gboolean nautilus_volume_monitor_volume_is_mounted (const NautilusVolume *volume);
gboolean nautilus_volume_monitor_mount_unmount_removable (NautilusVolumeMonitor *monitor,
const char *mount_point);
const char *mount_point,
gboolean should_mount);
gboolean nautilus_volume_monitor_volume_is_removable (NautilusVolume *volume);
gboolean nautilus_volume_monitor_is_volume_link (const char *path);
void nautilus_volume_monitor_each_volume (NautilusVolumeMonitor *monitor,

View file

@ -1105,7 +1105,8 @@ nautilus_volume_monitor_each_mounted_volume (NautilusVolumeMonitor *monitor,
gboolean
nautilus_volume_monitor_mount_unmount_removable (NautilusVolumeMonitor *monitor,
const char *mount_point)
const char *mount_point,
gboolean should_mount)
{
gboolean is_mounted, found_volume;
char *argv[3];
@ -1130,14 +1131,15 @@ nautilus_volume_monitor_mount_unmount_removable (NautilusVolumeMonitor *monitor,
/* Get mount state and then decide to mount/unmount the volume */
if (found_volume) {
is_mounted = nautilus_volume_monitor_volume_is_mounted (volume);
if (should_mount != is_mounted) {
argv[0] = is_mounted ? "/bin/umount" : "/bin/mount";
argv[1] = (char *) mount_point;
argv[2] = NULL;
argv[0] = is_mounted ? "/bin/umount" : "/bin/mount";
argv[1] = (char *) mount_point;
argv[2] = NULL;
exec_err = gnome_execute_async (g_get_home_dir(), 2, argv);
if (exec_err == -1) {
is_mounted = !is_mounted;
exec_err = gnome_execute_async (g_get_home_dir(), 2, argv);
if (exec_err == -1) {
is_mounted = !is_mounted;
}
}
}

View file

@ -103,7 +103,8 @@ char *nautilus_volume_monitor_get_volume_name (const NautilusVolume *volu
gboolean nautilus_volume_monitor_volume_is_mounted (const NautilusVolume *volume);
gboolean nautilus_volume_monitor_mount_unmount_removable (NautilusVolumeMonitor *monitor,
const char *mount_point);
const char *mount_point,
gboolean should_mount);
gboolean nautilus_volume_monitor_volume_is_removable (NautilusVolume *volume);
gboolean nautilus_volume_monitor_is_volume_link (const char *path);
void nautilus_volume_monitor_each_volume (NautilusVolumeMonitor *monitor,

View file

@ -51,6 +51,7 @@
#include <libnautilus-extensions/nautilus-link.h>
#include <libnautilus-extensions/nautilus-metadata.h>
#include <libnautilus-extensions/nautilus-program-choosing.h>
#include <libnautilus-extensions/nautilus-string.h>
#include <libnautilus-extensions/nautilus-volume-monitor.h>
#include <src/nautilus-application.h>
#include <limits.h>
@ -80,6 +81,10 @@ typedef struct {
GnomeDesktopEntry *entry;
} CallbackData;
typedef struct {
FMDesktopIconView *view;
char *mount_path;
} MountParameters;
static void fm_desktop_icon_view_initialize (FMDesktopIconView *desktop_icon_view);
static void fm_desktop_icon_view_initialize_class (FMDesktopIconViewClass *klass);
@ -109,6 +114,7 @@ static gboolean real_supports_auto_layout (FMIconView *view);
static void real_merge_menus (FMDirectoryView *view);
static void real_update_menus (FMDirectoryView *view);
static gboolean real_supports_zooming (FMDirectoryView *view);
static void update_disks_menu (FMDesktopIconView *view);
NAUTILUS_DEFINE_CLASS_BOILERPLATE (FMDesktopIconView,
@ -929,6 +935,38 @@ desktop_icons_compare_callback (NautilusIconContainer *container,
}
}
static MountParameters *
mount_parameters_new (FMDesktopIconView *view, const char *mount_path)
{
MountParameters *new_parameters;
g_assert (FM_IS_DESKTOP_ICON_VIEW (view));
g_assert (!nautilus_str_is_empty (mount_path));
new_parameters = g_new (MountParameters, 1);
gtk_object_ref (GTK_OBJECT (view));
new_parameters->view = view;
new_parameters->mount_path = g_strdup (mount_path);
return new_parameters;
}
static void
mount_parameters_free (MountParameters *parameters)
{
g_assert (parameters != NULL);
gtk_object_unref (GTK_OBJECT (parameters->view));
g_free (parameters->mount_path);
g_free (parameters);
}
static void
mount_parameters_free_wrapper (gpointer user_data)
{
mount_parameters_free ((MountParameters *)user_data);
}
static void
mount_or_unmount_removable_volume (BonoboUIComponent *component,
const char *path,
@ -936,6 +974,8 @@ mount_or_unmount_removable_volume (BonoboUIComponent *component,
const char *state,
gpointer user_data)
{
MountParameters *parameters;
g_assert (BONOBO_IS_UI_COMPONENT (component));
if (strcmp (state, "") == 0) {
@ -943,8 +983,10 @@ mount_or_unmount_removable_volume (BonoboUIComponent *component,
return;
}
parameters = (MountParameters *)user_data;
nautilus_volume_monitor_mount_unmount_removable
(nautilus_volume_monitor_get (), (char *)user_data);
(nautilus_volume_monitor_get (), parameters->mount_path, strcmp (state, "1") == 0);
update_disks_menu (parameters->view);
}
/* Fill in the context menu with an item for each disk that is or could be mounted */
@ -1002,8 +1044,8 @@ update_disks_menu (FMDesktopIconView *view)
(view->details->ui,
command_name,
mount_or_unmount_removable_volume,
g_strdup (volume->mount_path),
g_free);
mount_parameters_new (view, volume->mount_path),
mount_parameters_free_wrapper);
g_free (command_name);
}