changeset 2663:3e6d26094fb4

Fix #520: copy path inserts quotes around path https://github.com/BestImageViewer/geeqie/issues/520 Additional menu item: Copy path unquoted DnD still uses quotes
author Colin Clark <colin.clark@cclark.uk>
date Thu, 09 Nov 2017 15:52:54 +0000
parents 08d2547d72ea
children 5f6be8251b96
files doc/docbook/GuideMainWindowFolderPane.xml doc/docbook/GuideMainWindowMenus.xml src/collect-table.c src/dupe.c src/img-view.c src/layout_image.c src/layout_util.c src/pan-view/pan-view.c src/search.c src/utilops.c src/utilops.h src/view_dir.c src/view_file/view_file.c
diffstat 13 files changed, 148 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/doc/docbook/GuideMainWindowFolderPane.xml	Wed Nov 08 17:06:50 2017 +0000
+++ b/doc/docbook/GuideMainWindowFolderPane.xml	Thu Nov 09 15:52:54 2017 +0000
@@ -390,7 +390,21 @@
             <entry />
             <entry>Copy path</entry>
             <entry>
-              <para>Copy sjkhsdlfjhvfljhDelete file or folder</para>
+              <para>
+                Copy selected item-path(s) to clipboard
+                <footnote id='ref1'>
+                  The clipboard used is selected
+                  <link linkend="Behaviour">here.</link>
+                </footnote>
+                . Each data item copied will be enclosed in quotes.
+              </para>
+            </entry>
+          </row>
+          <row>
+            <entry />
+            <entry>Copy path unquoted</entry>
+            <entry>
+              <para>Copy selected item-path(s) to clipboard. The data will not be enclosed in quotes.</para>
             </entry>
           </row>
           <row>
--- a/doc/docbook/GuideMainWindowMenus.xml	Wed Nov 08 17:06:50 2017 +0000
+++ b/doc/docbook/GuideMainWindowMenus.xml	Thu Nov 09 15:52:54 2017 +0000
@@ -407,7 +407,24 @@
           </menuchoice>
         </term>
         <listitem>
-          <para>Copy selected item path to clipboard.</para>
+          <para>
+            Copy selected item-path(s) to clipboard
+            <footnote id='ref1'>
+              The clipboard used is selected
+              <link linkend="Behaviour">here.</link>
+            </footnote>
+            . Each data item copied will be enclosed in quotes.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>
+          <menuchoice>
+            <guimenu>Copy path unquoted</guimenu>
+          </menuchoice>
+        </term>
+        <listitem>
+          <para>Copy selected item-path(s) to clipboard. The data will not be enclosed in quotes.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
--- a/src/collect-table.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/collect-table.c	Thu Nov 09 15:52:54 2017 +0000
@@ -729,7 +729,14 @@
 {
 	CollectTable *ct = data;
 
-	file_util_copy_path_list_to_clipboard(collection_table_popup_file_list(ct));
+	file_util_copy_path_list_to_clipboard(collection_table_popup_file_list(ct), TRUE);
+}
+
+static void collection_table_popup_copy_path_unquoted_cb(GtkWidget *widget, gpointer data)
+{
+	CollectTable *ct = data;
+
+	file_util_copy_path_list_to_clipboard(collection_table_popup_file_list(ct), FALSE);
 }
 
 static void collection_table_popup_sort_cb(GtkWidget *widget, gpointer data)
@@ -945,6 +952,8 @@
 			G_CALLBACK(collection_table_popup_rename_cb), ct);
 	menu_item_add_sensitive(menu, _("_Copy path"), over_icon,
 				G_CALLBACK(collection_table_popup_copy_path_cb), ct);
+	menu_item_add_sensitive(menu, _("_Copy path unquoted"), over_icon,
+				G_CALLBACK(collection_table_popup_copy_path_unquoted_cb), ct);
 	menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, over_icon,
 			G_CALLBACK(collection_table_popup_delete_cb), ct);
 	menu_item_add_divider(menu);
--- a/src/dupe.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/dupe.c	Thu Nov 09 15:52:54 2017 +0000
@@ -2255,7 +2255,14 @@
 {
 	DupeWindow *dw = data;
 
-	file_util_copy_path_list_to_clipboard(dupe_listview_get_selection(dw, dw->listview));
+	file_util_copy_path_list_to_clipboard(dupe_listview_get_selection(dw, dw->listview), TRUE);
+}
+
+static void dupe_menu_copy_path_unquoted_cb(GtkWidget *widget, gpointer data)
+{
+	DupeWindow *dw = data;
+
+	file_util_copy_path_list_to_clipboard(dupe_listview_get_selection(dw, dw->listview), FALSE);
 }
 
 static void dupe_menu_remove_cb(GtkWidget *widget, gpointer data)
@@ -2369,6 +2376,8 @@
 				G_CALLBACK(dupe_menu_rename_cb), dw);
 	menu_item_add_sensitive(menu, _("_Copy path"), on_row,
 				G_CALLBACK(dupe_menu_copy_path_cb), dw);
+	menu_item_add_sensitive(menu, _("_Copy path unquoted"), on_row,
+				G_CALLBACK(dupe_menu_copy_path_unquoted_cb), dw);
 	menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, on_row,
 				G_CALLBACK(dupe_menu_delete_cb), dw);
 	menu_item_add_divider(menu);
--- a/src/img-view.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/img-view.c	Thu Nov 09 15:52:54 2017 +0000
@@ -1170,7 +1170,16 @@
 	ImageWindow *imd;
 
 	imd = view_window_active_image(vw);
-	file_util_copy_path_to_clipboard(image_get_fd(imd));
+	file_util_copy_path_to_clipboard(image_get_fd(imd), TRUE);
+}
+
+static void view_copy_path_unquoted_cb(GtkWidget *widget, gpointer data)
+{
+	ViewWindow *vw = data;
+	ImageWindow *imd;
+
+	imd = view_window_active_image(vw);
+	file_util_copy_path_to_clipboard(image_get_fd(imd), FALSE);
 }
 
 static void view_fullscreen_cb(GtkWidget *widget, gpointer data)
@@ -1315,6 +1324,7 @@
 	menu_item_add(menu, _("_Move..."), G_CALLBACK(view_move_cb), vw);
 	menu_item_add(menu, _("_Rename..."), G_CALLBACK(view_rename_cb), vw);
 	menu_item_add(menu, _("_Copy path"), G_CALLBACK(view_copy_path_cb), vw);
+	menu_item_add(menu, _("_Copy path unquoted"), G_CALLBACK(view_copy_path_unquoted_cb), vw);
 	menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(view_delete_cb), vw);
 
 	menu_item_add_divider(menu);
--- a/src/layout_image.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/layout_image.c	Thu Nov 09 15:52:54 2017 +0000
@@ -514,7 +514,14 @@
 {
 	LayoutWindow *lw = data;
 
-	file_util_copy_path_to_clipboard(layout_image_get_fd(lw));
+	file_util_copy_path_to_clipboard(layout_image_get_fd(lw), TRUE);
+}
+
+static void li_pop_menu_copy_path_unquoted_cb(GtkWidget *widget, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	file_util_copy_path_to_clipboard(layout_image_get_fd(lw), FALSE);
 }
 
 static void li_pop_menu_move_cb(GtkWidget *widget, gpointer data)
@@ -696,6 +703,7 @@
 	item = menu_item_add(menu, _("_Rename..."), G_CALLBACK(li_pop_menu_rename_cb), lw);
 	if (!path) gtk_widget_set_sensitive(item, FALSE);
 	item = menu_item_add(menu, _("_Copy path"), G_CALLBACK(li_pop_menu_copy_path_cb), lw);
+	item = menu_item_add(menu, _("_Copy path unquoted"), G_CALLBACK(li_pop_menu_copy_path_unquoted_cb), lw);
 	if (!path) gtk_widget_set_sensitive(item, FALSE);
 	item = menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(li_pop_menu_delete_cb), lw);
 	if (!path) gtk_widget_set_sensitive(item, FALSE);
--- a/src/layout_util.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/layout_util.c	Thu Nov 09 15:52:54 2017 +0000
@@ -289,7 +289,14 @@
 {
 	LayoutWindow *lw = data;
 
-	file_util_copy_path_list_to_clipboard(layout_selection_list(lw));
+	file_util_copy_path_list_to_clipboard(layout_selection_list(lw), TRUE);
+}
+
+static void layout_menu_copy_path_unquoted_cb(GtkAction *action, gpointer data)
+{
+	LayoutWindow *lw = data;
+
+	file_util_copy_path_list_to_clipboard(layout_selection_list(lw), FALSE);
 }
 
 static void layout_menu_move_cb(GtkAction *action, gpointer data)
@@ -1754,6 +1761,7 @@
   { "EnableGrouping",	NULL,			N_("Enable file _grouping"),		NULL,			N_("Enable file grouping"),		CB(layout_menu_enable_grouping_cb) },
   { "DisableGrouping",	NULL,			N_("Disable file groupi_ng"),		NULL,			N_("Disable file grouping"),		CB(layout_menu_disable_grouping_cb) },
   { "CopyPath",		NULL,			N_("_Copy path to clipboard"),		NULL,			N_("Copy path to clipboard"),		CB(layout_menu_copy_path_cb) },
+  { "CopyPathUnquoted",		NULL,			N_("_Copy path unquoted to clipboard"),		NULL,			N_("Copy path unquoted to clipboard"),		CB(layout_menu_copy_path_unquoted_cb) },
   { "CloseWindow",	GTK_STOCK_CLOSE,	N_("C_lose window"),			"<control>W",		N_("Close window"),			CB(layout_menu_close_cb) },
   { "Quit",		GTK_STOCK_QUIT, 	N_("_Quit"),				"<control>Q",		N_("Quit"),				CB(layout_menu_exit_cb) },
   { "RotateCW",		NULL,			N_("_Rotate clockwise"),		"bracketright",		N_("Rotate clockwise"),			CB(layout_menu_alter_90_cb) },
@@ -1959,6 +1967,7 @@
 "      <placeholder name='SelectSection'/>"
 "      <separator/>"
 "      <menuitem action='CopyPath'/>"
+"      <menuitem action='CopyPathUnquoted'/>"
 "      <placeholder name='ClipboardSection'/>"
 "      <separator/>"
 "      <menuitem action='ShowMarks'/>"
--- a/src/pan-view/pan-view.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/pan-view/pan-view.c	Thu Nov 09 15:52:54 2017 +0000
@@ -2138,7 +2138,16 @@
 	FileData *fd;
 
 	fd = pan_menu_click_fd(pw);
-	if (fd) file_util_copy_path_to_clipboard(fd);
+	if (fd) file_util_copy_path_to_clipboard(fd, TRUE);
+}
+
+static void pan_copy_path_unquoted_cb(GtkWidget *widget, gpointer data)
+{
+	PanWindow *pw = data;
+	FileData *fd;
+
+	fd = pan_menu_click_fd(pw);
+	if (fd) file_util_copy_path_to_clipboard(fd, FALSE);
 }
 
 static void pan_exif_date_toggle_cb(GtkWidget *widget, gpointer data)
@@ -2254,6 +2263,8 @@
 				G_CALLBACK(pan_rename_cb), pw);
 	menu_item_add_sensitive(menu, _("_Copy path"), active,
 				G_CALLBACK(pan_copy_path_cb), pw);
+	menu_item_add_sensitive(menu, _("_Copy path unquoted"), active,
+				G_CALLBACK(pan_copy_path_unquoted_cb), pw);
 	menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, active,
 				      G_CALLBACK(pan_delete_cb), pw);
 
--- a/src/search.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/search.c	Thu Nov 09 15:52:54 2017 +0000
@@ -999,7 +999,14 @@
 {
 	SearchData *sd = data;
 
-	file_util_copy_path_list_to_clipboard(search_result_selection_list(sd));
+	file_util_copy_path_list_to_clipboard(search_result_selection_list(sd), TRUE);
+}
+
+static void sr_menu_copy_path_unquoted_cb(GtkWidget *widget, gpointer data)
+{
+	SearchData *sd = data;
+
+	file_util_copy_path_list_to_clipboard(search_result_selection_list(sd), FALSE);
 }
 
 static void sr_menu_remove_cb(GtkWidget *widget, gpointer data)
@@ -1083,6 +1090,8 @@
 				G_CALLBACK(sr_menu_rename_cb), sd);
 	menu_item_add_sensitive(menu, _("_Copy path"), on_row,
 				G_CALLBACK(sr_menu_copy_path_cb), sd);
+	menu_item_add_sensitive(menu, _("_Copy path unquoted"), on_row,
+				G_CALLBACK(sr_menu_copy_path_unquoted_cb), sd);
 	menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, on_row,
 				      G_CALLBACK(sr_menu_delete_cb), sd);
 	menu_item_add_divider(menu);
--- a/src/utilops.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/utilops.c	Thu Nov 09 15:52:54 2017 +0000
@@ -3032,7 +3032,7 @@
 }
 
 
-void file_util_copy_path_to_clipboard(FileData *fd)
+void file_util_copy_path_to_clipboard(FileData *fd, gboolean quoted)
 {
 	GtkClipboard *clipboard;
 
@@ -3046,10 +3046,17 @@
 		{
 		clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
 		}
-	gtk_clipboard_set_text(clipboard, g_shell_quote(fd->path), -1);
+	if (quoted)
+		{
+		gtk_clipboard_set_text(clipboard, g_shell_quote(fd->path), -1);
+		}
+	else
+		{
+		gtk_clipboard_set_text(clipboard, fd->path, -1);
+		}
 }
 
-void file_util_copy_path_list_to_clipboard(GList *list)
+void file_util_copy_path_list_to_clipboard(GList *list, gboolean quoted)
 {
 	GtkClipboard *clipboard;
 	GList *work;
@@ -3072,7 +3079,14 @@
 
 		if (!fd || !*fd->path) continue;
 
-		g_string_append(new, g_shell_quote(fd->path));
+		if (quoted)
+			{
+			g_string_append(new, g_shell_quote(fd->path));
+			}
+		else
+			{
+			g_string_append(new, fd->path);
+			}
 		if (work) g_string_append_c(new, ' ');
 		}
 
--- a/src/utilops.h	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/utilops.h	Thu Nov 09 15:52:54 2017 +0000
@@ -68,8 +68,8 @@
 
 void file_util_delete_dir(FileData *source_fd, GtkWidget *parent);
 
-void file_util_copy_path_to_clipboard(FileData *fd);
-void file_util_copy_path_list_to_clipboard(GList *list);
+void file_util_copy_path_to_clipboard(FileData *fd, gboolean quoted);
+void file_util_copy_path_list_to_clipboard(GList *list, gboolean quoted);
 
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/view_dir.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/view_dir.c	Thu Nov 09 15:52:54 2017 +0000
@@ -528,7 +528,16 @@
 
 	if (!vd->click_fd) return;
 
-	file_util_copy_path_to_clipboard(vd->click_fd);
+	file_util_copy_path_to_clipboard(vd->click_fd, TRUE);
+}
+
+static void vd_pop_menu_copy_path_unquoted_cb(GtkWidget *widget, gpointer data)
+{
+	ViewDir *vd = data;
+
+	if (!vd->click_fd) return;
+
+	file_util_copy_path_to_clipboard(vd->click_fd, FALSE);
 }
 
 static void vd_pop_submenu_dir_view_as_cb(GtkWidget *widget, gpointer data)
@@ -677,6 +686,9 @@
 	menu_item_add(menu, _("_Copy path"),
 		      G_CALLBACK(vd_pop_menu_copy_path_cb), vd);
 
+	menu_item_add(menu, _("_Copy path unquoted"),
+		      G_CALLBACK(vd_pop_menu_copy_path_unquoted_cb), vd);
+
 	menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, rename_delete_active,
 				      G_CALLBACK(vd_pop_menu_delete_cb), vd);
 	menu_item_add_divider(menu);
--- a/src/view_file/view_file.c	Wed Nov 08 17:06:50 2017 +0000
+++ b/src/view_file/view_file.c	Thu Nov 09 15:52:54 2017 +0000
@@ -357,7 +357,14 @@
 {
 	ViewFile *vf = data;
 
-	file_util_copy_path_list_to_clipboard(vf_pop_menu_file_list(vf));
+	file_util_copy_path_list_to_clipboard(vf_pop_menu_file_list(vf), TRUE);
+}
+
+static void vf_pop_menu_copy_path_unquoted_cb(GtkWidget *widget, gpointer data)
+{
+	ViewFile *vf = data;
+
+	file_util_copy_path_list_to_clipboard(vf_pop_menu_file_list(vf), FALSE);
 }
 
 static void vf_pop_menu_enable_grouping_cb(GtkWidget *widget, gpointer data)
@@ -600,6 +607,8 @@
 				G_CALLBACK(vf_pop_menu_rename_cb), vf);
 	menu_item_add_sensitive(menu, _("_Copy path"), active,
 				G_CALLBACK(vf_pop_menu_copy_path_cb), vf);
+	menu_item_add_sensitive(menu, _("_Copy path unquoted"), active,
+				G_CALLBACK(vf_pop_menu_copy_path_unquoted_cb), vf);
 	menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, active,
 				      G_CALLBACK(vf_pop_menu_delete_cb), vf);
 	menu_item_add_divider(menu);