[geany/geany-plugins] a63b12: TreeBrowser: Don't leak name and URI upon right click

Colomban Wendling git-noreply at xxxxx
Mon Mar 4 16:49:52 UTC 2013


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Mon, 04 Mar 2013 16:49:52 UTC
Commit:      a63b12f7c4739bd28cd22c430fa0bb96b88181ca
             https://github.com/geany/geany-plugins/commit/a63b12f7c4739bd28cd22c430fa0bb96b88181ca

Log Message:
-----------
TreeBrowser: Don't leak name and URI upon right click


Modified Paths:
--------------
    treebrowser/src/treebrowser.c

Modified: treebrowser/src/treebrowser.c
46 files changed, 24 insertions(+), 22 deletions(-)
===================================================================
@@ -1224,16 +1224,16 @@ enum
 
 	item = ui_image_menu_item_new(GTK_STOCK_OPEN, _("Open externally"));
 	gtk_container_add(GTK_CONTAINER(menu), item);
-	g_signal_connect(item, "activate", G_CALLBACK(on_menu_open_externally), (gpointer)uri);
+	g_signal_connect_data(item, "activate", G_CALLBACK(on_menu_open_externally), g_strdup(uri), (GClosureNotify)g_free, 0);
 	gtk_widget_set_sensitive(item, is_exists);
 
 	item = ui_image_menu_item_new("utilities-terminal", _("Open Terminal"));
 	gtk_container_add(GTK_CONTAINER(menu), item);
-	g_signal_connect(item, "activate", G_CALLBACK(on_menu_open_terminal), (gpointer)uri);
+	g_signal_connect_data(item, "activate", G_CALLBACK(on_menu_open_terminal), g_strdup(uri), (GClosureNotify)g_free, 0);
 
 	item = ui_image_menu_item_new(GTK_STOCK_GOTO_TOP, _("Set as root"));
 	gtk_container_add(GTK_CONTAINER(menu), item);
-	g_signal_connect(item, "activate", G_CALLBACK(on_menu_set_as_root), (gpointer)uri);
+	g_signal_connect_data(item, "activate", G_CALLBACK(on_menu_set_as_root), g_strdup(uri), (GClosureNotify)g_free, 0);
 	gtk_widget_set_sensitive(item, is_dir);
 
 	item = ui_image_menu_item_new(GTK_STOCK_REFRESH, _("Refresh"));
@@ -1242,7 +1242,7 @@ enum
 
 	item = ui_image_menu_item_new(GTK_STOCK_FIND, _("Find in Files"));
 	gtk_container_add(GTK_CONTAINER(menu), item);
-	g_signal_connect(item, "activate", G_CALLBACK(on_menu_find_in_files), (gpointer)uri);
+	g_signal_connect_data(item, "activate", G_CALLBACK(on_menu_find_in_files), g_strdup(uri), (GClosureNotify)g_free, 0);
 	gtk_widget_set_sensitive(item, is_dir);
 
 	item = gtk_separator_menu_item_new();
@@ -1271,17 +1271,17 @@ enum
 
 	item = ui_image_menu_item_new(GTK_STOCK_CLOSE, g_strdup_printf(_("Close: %s"), name));
 	gtk_container_add(GTK_CONTAINER(menu), item);
-	g_signal_connect(item, "activate", G_CALLBACK(on_menu_close), (gpointer)uri);
+	g_signal_connect_data(item, "activate", G_CALLBACK(on_menu_close), g_strdup(uri), (GClosureNotify)g_free, 0);
 	gtk_widget_set_sensitive(item, is_document);
 
 	item = ui_image_menu_item_new(GTK_STOCK_CLOSE, g_strdup_printf(_("Close Child Documents ")));
 	gtk_container_add(GTK_CONTAINER(menu), item);
-	g_signal_connect(item, "activate", G_CALLBACK(on_menu_close_children), (gpointer)uri);
+	g_signal_connect_data(item, "activate", G_CALLBACK(on_menu_close_children), g_strdup(uri), (GClosureNotify)g_free, 0);
 	gtk_widget_set_sensitive(item, is_dir);
 
 	item = ui_image_menu_item_new(GTK_STOCK_COPY, _("Copy full path to clipboard"));
 	gtk_container_add(GTK_CONTAINER(menu), item);
-	g_signal_connect(item, "activate", G_CALLBACK(on_menu_copy_uri), (gpointer)uri);
+	g_signal_connect_data(item, "activate", G_CALLBACK(on_menu_copy_uri), g_strdup(uri), (GClosureNotify)g_free, 0);
 	gtk_widget_set_sensitive(item, is_exists);
 
 	item = gtk_separator_menu_item_new();
@@ -1394,22 +1394,20 @@ enum
 static gboolean
 on_treeview_mouseclick(GtkWidget *widget, GdkEventButton *event, GtkTreeSelection *selection)
 {
-	GtkTreeIter 	iter;
-	GtkTreeModel 	*model;
-	GtkTreePath *path;
-	const gchar 			*name = "", *uri = "";
-
-	if (gtk_tree_selection_get_selected(selection, &model, &iter))
-		/* FIXME: name and uri should be freed, but they are passed to create_popup_menu()
-		 * that pass them directly to some callbacks, so we can't free them here for now.
-		 * Gotta find a way out... */
-		gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter,
-							TREEBROWSER_COLUMN_NAME, &name,
-							TREEBROWSER_COLUMN_URI, &uri,
-							-1);
-
 	if (event->button == 3)
 	{
+		GtkTreeIter 	iter;
+		GtkTreeModel 	*model;
+		GtkTreePath *path;
+		GtkWidget *menu;
+		gchar *name = NULL, *uri = NULL;
+
+		if (gtk_tree_selection_get_selected(selection, &model, &iter))
+			gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter,
+								TREEBROWSER_COLUMN_NAME, &name,
+								TREEBROWSER_COLUMN_URI, &uri,
+								-1);
+
 		/* Get tree path for row that was clicked */
 		if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview),
 																		 (gint) event->x,
@@ -1421,7 +1419,11 @@ enum
 			gtk_tree_selection_select_path(selection, path);
 			gtk_tree_path_free(path);
 		}
-		gtk_menu_popup(GTK_MENU(create_popup_menu(name, uri)), NULL, NULL, NULL, NULL, event->button, event->time);
+		menu = create_popup_menu(name != NULL ? name : "", uri != NULL ? uri : "");
+		gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time);
+
+		g_free(name);
+		g_free(uri);
 		return TRUE;
 	}
 



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list