Re: Patch: copy path to clipboard

Carles Pina i Estany <[email protected]> Thu, 13 Apr 2006 17:12:31 +0200
Newsgroups gmane.comp.gnome.apps.gqview.devel
Message-ID <[email protected]>
Hi,

I attach a new version, with g_free... there was a memory leak in other
one...

Excuse me,

-- 
Carles Pina i Estany		GPG id: 0x8CBDAE64
	http://pinux.info	Manresa - Barcelona
gqview-copy-path2-2.0.1.patch (text/plain, 4.9 KB)
Only in gqview-2.0.1: gqview.spec
Only in gqview-2.0.1-carles2/src: core
diff -ur gqview-2.0.1/src/layout_image.c gqview-2.0.1-carles2/src/layout_image.c
--- gqview-2.0.1/src/layout_image.c	2005-03-01 17:00:03.000000000 +0100
+++ gqview-2.0.1-carles2/src/layout_image.c	2006-04-13 10:14:29.000000000 +0200
@@ -631,6 +631,12 @@
 		       li_pop_menu_click_parent(widget, lw));
 }
 
+static void li_pop_menu_copy_path_cb(GtkWidget *widget, gpointer data)
+{
+	LayoutWindow *lw = data;
+	file_util_copy_path(layout_image_get_path(lw));
+}
+
 static void li_pop_menu_move_cb(GtkWidget *widget, gpointer data)
 {
 	LayoutWindow *lw = data;
@@ -725,6 +731,7 @@
 	menu_item_add_divider(menu);
 
 	item = menu_item_add_stock(menu, _("_Copy..."), GTK_STOCK_COPY, G_CALLBACK(li_pop_menu_copy_cb), lw);
+	item = menu_item_add(menu, _("_Copy path"), G_CALLBACK(li_pop_menu_copy_path_cb), lw);
 	if (!path) gtk_widget_set_sensitive(item, FALSE);
 	item = menu_item_add(menu, _("_Move..."), G_CALLBACK(li_pop_menu_move_cb), lw);
 	if (!path) gtk_widget_set_sensitive(item, FALSE);
diff -ur gqview-2.0.1/src/layout_util.c gqview-2.0.1-carles2/src/layout_util.c
--- gqview-2.0.1/src/layout_util.c	2005-03-01 17:00:03.000000000 +0100
+++ gqview-2.0.1-carles2/src/layout_util.c	2006-04-13 10:31:46.000000000 +0200
@@ -310,6 +310,12 @@
 	file_util_copy(NULL, layout_selection_list(lw), NULL, lw->window);
 }
 
+static void layout_menu_copy_path_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+	file_util_copy_path_list(layout_selection_list(lw));
+}
+
 static void layout_menu_move_cb(GtkAction *action, gpointer data)
 {
 	LayoutWindow *lw = data;
@@ -759,7 +765,8 @@
   { "FindDupes",	GTK_STOCK_FIND,	N_("_Find duplicates..."),"D",		NULL,	CB(layout_menu_dupes_cb) },
   { "Print",		GTK_STOCK_PRINT,N_("_Print..."),	"<shift>P",	NULL,	CB(layout_menu_print_cb) },
   { "NewFolder",	NULL,		N_("N_ew folder..."),	"<control>F",	NULL,	CB(layout_menu_dir_cb) },
-  { "Copy",		NULL,		N_("_Copy..."),		"<control>C",	NULL,	CB(layout_menu_copy_cb) },
+  { "Copy",		GTK_STOCK_COPY,	N_("_Copy..."),		"<control>C",	NULL,	CB(layout_menu_copy_cb) },
+  { "Copy path",	NULL,		N_("_Copy path"),		NULL,	NULL,	CB(layout_menu_copy_path_cb) },
   { "Move",		NULL,		N_("_Move..."),		"<control>M",	NULL,	CB(layout_menu_move_cb) },
   { "Rename",		NULL,		N_("_Rename..."),	"<control>R",	NULL,	CB(layout_menu_rename_cb) },
   { "Delete",	GTK_STOCK_DELETE,	N_("_Delete..."),	"<control>D",	NULL,	CB(layout_menu_delete_cb) },
@@ -836,6 +843,7 @@
 "      <menuitem action='NewFolder'/>"
 "      <separator/>"
 "      <menuitem action='Copy'/>"
+"      <menuitem action='Copy path'/>"
 "      <menuitem action='Move'/>"
 "      <menuitem action='Rename'/>"
 "      <menuitem action='Delete'/>"
diff -ur gqview-2.0.1/src/utilops.c gqview-2.0.1-carles2/src/utilops.c
--- gqview-2.0.1/src/utilops.c	2005-05-14 18:23:05.000000000 +0200
+++ gqview-2.0.1-carles2/src/utilops.c	2006-04-13 17:10:13.000000000 +0200
@@ -1078,6 +1078,44 @@
 	real_file_util_move(source_path, source_list, dest_path, TRUE, parent);
 }
 
+void file_util_copy_path(const gchar *path)
+{
+	static GtkClipboard *clipboard;
+	clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+	
+	gtk_clipboard_set_text(clipboard,g_shell_quote(path),-1);
+}
+
+void file_util_copy_path_list(GList *list)
+{
+	static GtkClipboard *clipboard;
+	gchar *dest, *temp;
+	gchar *t2;
+	GList *l = list;
+	
+	clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+
+	dest = g_new(gchar,1); g_sprintf(dest,"");
+
+	while (l) {
+		temp = g_shell_quote(l->data);
+	
+		//we save dest buffer to request more memory...
+		t2 = g_strdup(dest);
+		
+		//we request more memory
+		dest = g_renew(gchar,dest,strlen(dest)+strlen(temp)+2);
+
+		g_sprintf(dest,"%s %s",temp,t2);
+		g_free(t2);
+		
+		l=l->next;
+		
+	}
+	gtk_clipboard_set_text(clipboard,dest,-1);
+	g_free(dest);
+}
+
 void file_util_move_simple(GList *list, const gchar *dest_path)
 {
 	if (!list) return;
diff -ur gqview-2.0.1/src/view_file_list.c gqview-2.0.1-carles2/src/view_file_list.c
--- gqview-2.0.1/src/view_file_list.c	2005-03-01 17:00:03.000000000 +0100
+++ gqview-2.0.1-carles2/src/view_file_list.c	2006-04-13 12:54:27.000000000 +0200
@@ -256,6 +256,13 @@
 	file_util_copy(NULL, vflist_pop_menu_file_list(vfl), NULL, vfl->listview);
 }
 
+static void vflist_pop_menu_copy_path_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFileList *vfl = data;
+
+	file_util_copy_path_list(vflist_pop_menu_file_list(vfl));
+}
+
 static void vflist_pop_menu_move_cb(GtkWidget *widget, gpointer data)
 {
 	ViewFileList *vfl = data;
@@ -398,6 +405,8 @@
 	menu_item_add_divider(menu);
 	menu_item_add_stock_sensitive(menu, _("_Copy..."), GTK_STOCK_COPY, active,
 				      G_CALLBACK(vflist_pop_menu_copy_cb), vfl);
+	menu_item_add_sensitive(menu, _("_Copy path"), active,
+				      G_CALLBACK(vflist_pop_menu_copy_path_cb), vfl);
 	menu_item_add_sensitive(menu, _("_Move..."), active,
 				G_CALLBACK(vflist_pop_menu_move_cb), vfl);
 	menu_item_add_sensitive(menu, _("_Rename..."), active,