diff -p -up nautilus-2.22.1/libnautilus-private/nautilus-desktop-link-monitor.c.orig nautilus-2.22.1/libnautilus-private/nautilus-desktop-link-monitor.c --- nautilus-2.22.1/libnautilus-private/nautilus-desktop-link-monitor.c.orig 2008-05-19 06:18:46.000000000 -0400 +++ nautilus-2.22.1/libnautilus-private/nautilus-desktop-link-monitor.c 2008-05-20 12:39:57.000000000 -0400 @@ -55,6 +55,7 @@ struct NautilusDesktopLinkMonitorDetails gulong mount_id; gulong unmount_id; gulong changed_id; + gulong volume_removed_id; GList *mount_links; }; @@ -243,6 +244,43 @@ mount_changed_callback (GVolumeMonitor * /* TODO: update the mount */ } +static gboolean clean_leftover_mount (gpointer data) +{ + GVolume *volume; + NautilusDesktopLinkMonitor *monitor; + GList *l; + GMount *mount; + char *volume_uuid, *mount_uuid; + + volume = G_VOLUME (data); + + monitor = nautilus_desktop_link_monitor_get (); + volume_uuid = g_volume_get_uuid (volume); + for (l = monitor->details->mount_links; l != NULL; l = l->next) { + if (l->data) { + mount = nautilus_desktop_link_get_mount(l->data); + mount_uuid = g_mount_get_uuid (mount); + + if (g_mount_get_volume (mount) == NULL + && eel_strcmp (volume_uuid, mount_uuid) == 0) { + g_mount_unmount (mount, G_MOUNT_UNMOUNT_NONE, NULL, NULL, NULL); + } + } + } + g_free (volume_uuid); + g_object_unref (volume); + + return FALSE; +} + +static void +volume_removed_callback (GVolumeMonitor *volume_monitor, + GVolume *volume, + NautilusDesktopLinkMonitor *monitor) +{ + g_idle_add (clean_leftover_mount, g_object_ref (volume)); +} + static void update_link_visibility (NautilusDesktopLinkMonitor *monitor, NautilusDesktopLink **link_ref, @@ -418,6 +456,9 @@ nautilus_desktop_link_monitor_init (gpoi monitor->details->changed_id = g_signal_connect_object (monitor->details->volume_monitor, "mount_changed", G_CALLBACK (mount_changed_callback), monitor, 0); + monitor->details->volume_removed_id = + g_signal_connect_object (monitor->details->volume_monitor, "volume_removed", + G_CALLBACK (volume_removed_callback), monitor, 0); } @@ -471,7 +512,7 @@ desktop_link_monitor_finalize (GObject * g_list_foreach (monitor->details->mount_links, (GFunc)g_object_unref, NULL); g_list_free (monitor->details->mount_links); monitor->details->mount_links = NULL; - + nautilus_directory_unref (monitor->details->desktop_dir); monitor->details->desktop_dir = NULL; @@ -488,6 +529,9 @@ desktop_link_monitor_finalize (GObject * if (monitor->details->changed_id != 0) { g_source_remove (monitor->details->changed_id); } + if (monitor->details->volume_removed_id != 0) { + g_source_remove (monitor->details->volume_removed_id); + } g_free (monitor->details);