Sophie

Sophie

distrib > Mageia > 5 > x86_64 > media > core-release-src > by-pkgid > d951c9cf0cb0a1339c22e98d1e4186b4 > files > 11

caja-1.8.2-4.mga5.src.rpm

diff -up mate-file-manager-1.5.2/libcaja-private/caja-desktop-link-monitor.c.umountfstab mate-file-manager-1.5.2/libcaja-private/caja-desktop-link-monitor.c
--- mate-file-manager-1.5.2/libcaja-private/caja-desktop-link-monitor.c.umountfstab	2012-12-03 23:32:32.000000000 +0100
+++ mate-file-manager-1.5.2/libcaja-private/caja-desktop-link-monitor.c	2013-01-19 04:06:55.540182711 +0100
@@ -54,6 +54,7 @@ struct CajaDesktopLinkMonitorDetails
     gulong mount_id;
     gulong unmount_id;
     gulong changed_id;
+    gulong volume_removed_id;
 
     GList *mount_links;
 };
@@ -274,6 +275,44 @@ mount_added_callback (GVolumeMonitor *vo
 }
 
 
+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
 mount_removed_callback (GVolumeMonitor *volume_monitor,
                         GMount *mount,
@@ -490,6 +529,9 @@ caja_desktop_link_monitor_init (gpointer
         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);
 }
 
 static void
@@ -564,6 +606,10 @@ desktop_link_monitor_finalize (GObject *
     {
         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);