diff --git a/libcaja-private/caja-desktop-link-monitor.c b/libcaja-private/caja-desktop-link-monitor.c index ee5d85d..01c50cc 100644 --- a/libcaja-private/caja-desktop-link-monitor.c +++ b/libcaja-private/caja-desktop-link-monitor.c @@ -54,6 +54,7 @@ struct CajaDesktopLinkMonitorDetails gulong mount_id; gulong unmount_id; gulong changed_id; + gulong volume_removed_id; GList *mount_links; }; @@ -232,6 +233,43 @@ mount_changed_callback (GVolumeMonitor *volume_monitor, } } +static gboolean clean_leftover_mount (gpointer data) +{ + GVolume *volume; + CajaDesktopLinkMonitor *monitor; + GList *l; + GMount *mount; + char *volume_uuid, *mount_uuid; + + volume = G_VOLUME (data); + + monitor = caja_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 = caja_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, + CajaDesktopLinkMonitor *monitor) +{ + g_idle_add (clean_leftover_mount, g_object_ref (volume)); +} + static void update_link_visibility (CajaDesktopLinkMonitor *monitor, CajaDesktopLink **link_ref, @@ -425,6 +463,9 @@ caja_desktop_link_monitor_init (gpointer object, gpointer klass) 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); } @@ -501,6 +542,9 @@ desktop_link_monitor_finalize (GObject *object) { 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); -- 2.10.4