anjuta r4421 - in trunk: . plugins/file-manager



Author: sgranjoux
Date: Sat Dec  6 20:35:08 2008
New Revision: 4421
URL: http://svn.gnome.org/viewvc/anjuta?rev=4421&view=rev

Log:
	* plugins/file-manager/plugin.c,
	plugins/file-manager/file-model.c:
	Fix #560284: Crash when deleting a folder outside Anjuta


Modified:
   trunk/ChangeLog
   trunk/plugins/file-manager/file-model.c
   trunk/plugins/file-manager/plugin.c

Modified: trunk/plugins/file-manager/file-model.c
==============================================================================
--- trunk/plugins/file-manager/file-model.c	(original)
+++ trunk/plugins/file-manager/file-model.c	Sat Dec  6 20:35:08 2008
@@ -113,28 +113,6 @@
 }
 
 static void
-file_model_remove_file (FileModel* model, 
-						GtkTreeIter* iter)
-{
-	GFile* file;
-	GtkTreeRowReference* reference;
-	GFileMonitor* monitor;
-	
-	gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
-						COLUMN_FILE, &file, -1);
-	
-	monitor = g_object_get_data (G_OBJECT(file), "file-monitor");
-	if (monitor)
-		g_object_unref (monitor);
-	
-	reference = g_object_get_data (G_OBJECT(file), "reference");
-	if (reference)
-		gtk_tree_row_reference_free(reference);
-	
-	gtk_tree_store_remove (GTK_TREE_STORE (model), iter);	
-}
-
-static void
 file_model_update_file (FileModel* model,
 						GtkTreeIter* iter,
 						GFile* file,
@@ -208,6 +186,7 @@
 	GtkTreeIter file_iter;
 	gboolean found = FALSE;
 	
+	/* reference could be invalid if the file has already been destroyed */
 	if (!gtk_tree_row_reference_valid(reference))
 		return;
 	
@@ -262,7 +241,7 @@
 		}
 		case G_FILE_MONITOR_EVENT_DELETED:
 		{
-			file_model_remove_file (model, &file_iter);
+			gtk_tree_store_remove (GTK_TREE_STORE (model), &file_iter);			
 			break;
 		}
 		default:
@@ -292,8 +271,9 @@
 	g_signal_connect (monitor, "changed", G_CALLBACK(on_file_model_changed),
 					  reference);
 	
-	g_object_set_data (G_OBJECT(file), "file-monitor", monitor);
-	g_object_set_data (G_OBJECT(file), "reference", reference);	
+	g_object_set_data_full (G_OBJECT(file), "file-monitor", monitor, (GDestroyNotify)g_object_unref);
+	/* Reference is used by monitor, should be kept it until the monitor is destroyed */
+	g_object_set_data_full (G_OBJECT(monitor), "reference", reference, (GDestroyNotify)gtk_tree_row_reference_free);
 	g_object_unref (file);
 }
 
@@ -319,14 +299,12 @@
 	if (!path)
 	{
 		gtk_tree_row_reference_free (ref);
-		g_object_unref (dir);
 		g_object_unref (files);
 		return;
 	}
 	
 	if (err)
 	{
-		g_object_unref (dir);
 		DEBUG_PRINT ("GIO-Error: %s", err->message);
 		g_error_free (err);
 		// TODO: Collapse row
@@ -349,7 +327,6 @@
 	gtk_tree_path_free (path);
 	gtk_tree_row_reference_free (ref);
 	g_object_unref(files);
-	g_object_unref(dir);
 }
 
 static void
@@ -388,6 +365,7 @@
 									 cancel,
 									 on_row_expanded_async,
 									 data);
+	g_object_unref (dir);
 }
 
 static void
@@ -417,7 +395,7 @@
 	
 	while (gtk_tree_model_iter_children (GTK_TREE_MODEL(model), &child, &real_iter))
 	{
-		file_model_remove_file (model, &child);
+		gtk_tree_store_remove (GTK_TREE_STORE (model), &child);		
 	}
 	
 	file_model_add_dummy (model, &real_iter);

Modified: trunk/plugins/file-manager/plugin.c
==============================================================================
--- trunk/plugins/file-manager/plugin.c	(original)
+++ trunk/plugins/file-manager/plugin.c	Sat Dec  6 20:35:08 2008
@@ -131,6 +131,7 @@
 		g_value_set_object (value, file);
 		anjuta_shell_add_value (ANJUTA_PLUGIN (file_manager)->shell,
 								IANJUTA_FILE_MANAGER_SELECTED_FILE, value, NULL);
+		g_value_unset (value);
 	}
 	else
 	{



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]