diff -p -up nautilus-2.25.91/libnautilus-private/nautilus-desktop-link-monitor.c.umountfstab nautilus-2.25.91/libnautilus-private/nautilus-desktop-link-monitor.c --- nautilus-2.25.91/libnautilus-private/nautilus-desktop-link-monitor.c.umountfstab 2009-02-16 11:06:49.000000000 +0100 +++ nautilus-2.25.91/libnautilus-private/nautilus-desktop-link-monitor.c 2009-02-16 15:11:41.000000000 +0100 @@ -53,6 +53,7 @@ struct NautilusDesktopLinkMonitorDetails gulong mount_id; gulong unmount_id; gulong changed_id; + gulong volume_removed_id; GList *mount_links; }; @@ -277,6 +278,44 @@ mount_changed_callback (GVolumeMonitor * remove_mount_link (monitor, 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, @@ -452,6 +491,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); } @@ -505,7 +547,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; @@ -522,6 +564,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);