From b0cb5d8712bb8183429a63a9de46c2b475db368c Mon Sep 17 00:00:00 2001 From: Colin Clark Date: Thu, 9 Nov 2017 15:52:54 +0000 Subject: [PATCH] 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 --- doc/docbook/GuideMainWindowFolderPane.xml | 16 +++++++++++++++- doc/docbook/GuideMainWindowMenus.xml | 19 ++++++++++++++++++- src/collect-table.c | 11 ++++++++++- src/dupe.c | 11 ++++++++++- src/img-view.c | 12 +++++++++++- src/layout_image.c | 10 +++++++++- src/layout_util.c | 11 ++++++++++- src/pan-view/pan-view.c | 13 ++++++++++++- src/search.c | 11 ++++++++++- src/utilops.c | 22 ++++++++++++++++++---- src/utilops.h | 4 ++-- src/view_dir.c | 14 +++++++++++++- src/view_file/view_file.c | 11 ++++++++++- 13 files changed, 148 insertions(+), 17 deletions(-) diff --git a/doc/docbook/GuideMainWindowFolderPane.xml b/doc/docbook/GuideMainWindowFolderPane.xml index a2bd1761..c30245b5 100644 --- a/doc/docbook/GuideMainWindowFolderPane.xml +++ b/doc/docbook/GuideMainWindowFolderPane.xml @@ -390,7 +390,21 @@ Copy path - Copy sjkhsdlfjhvfljhDelete file or folder + + Copy selected item-path(s) to clipboard + + The clipboard used is selected + here. + + . Each data item copied will be enclosed in quotes. + + + + + + Copy path unquoted + + Copy selected item-path(s) to clipboard. The data will not be enclosed in quotes. diff --git a/doc/docbook/GuideMainWindowMenus.xml b/doc/docbook/GuideMainWindowMenus.xml index 066c5d76..e3cb7479 100644 --- a/doc/docbook/GuideMainWindowMenus.xml +++ b/doc/docbook/GuideMainWindowMenus.xml @@ -407,7 +407,24 @@ - Copy selected item path to clipboard. + + Copy selected item-path(s) to clipboard + + The clipboard used is selected + here. + + . Each data item copied will be enclosed in quotes. + + + + + + + Copy path unquoted + + + + Copy selected item-path(s) to clipboard. The data will not be enclosed in quotes. diff --git a/src/collect-table.c b/src/collect-table.c index ca4868fc..4ea3f483 100644 --- a/src/collect-table.c +++ b/src/collect-table.c @@ -729,7 +729,14 @@ static void collection_table_popup_copy_path_cb(GtkWidget *widget, gpointer data { 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 @@ static GtkWidget *collection_table_popup_menu(CollectTable *ct, gboolean over_ic 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); diff --git a/src/dupe.c b/src/dupe.c index ff49303e..a5b5c83b 100644 --- a/src/dupe.c +++ b/src/dupe.c @@ -2255,7 +2255,14 @@ static void dupe_menu_copy_path_cb(GtkWidget *widget, gpointer data) { 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 @@ static GtkWidget *dupe_menu_popup_main(DupeWindow *dw, DupeItem *di) 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); diff --git a/src/img-view.c b/src/img-view.c index 057b2964..89d5df8e 100644 --- a/src/img-view.c +++ b/src/img-view.c @@ -1170,7 +1170,16 @@ static void view_copy_path_cb(GtkWidget *widget, gpointer data) 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 @@ static GtkWidget *view_popup_menu(ViewWindow *vw) 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); diff --git a/src/layout_image.c b/src/layout_image.c index b736e418..ade67a39 100644 --- a/src/layout_image.c +++ b/src/layout_image.c @@ -514,7 +514,14 @@ static void li_pop_menu_copy_path_cb(GtkWidget *widget, gpointer data) { 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 @@ static GtkWidget *layout_image_pop_menu(LayoutWindow *lw) 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); diff --git a/src/layout_util.c b/src/layout_util.c index 3495a374..0f164b56 100644 --- a/src/layout_util.c +++ b/src/layout_util.c @@ -289,7 +289,14 @@ static void layout_menu_copy_path_cb(GtkAction *action, gpointer data) { 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 @@ static GtkActionEntry menu_entries[] = { { "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"), "W", N_("Close window"), CB(layout_menu_close_cb) }, { "Quit", GTK_STOCK_QUIT, N_("_Quit"), "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 @@ static const gchar *menu_ui_description = " " " " " " +" " " " " " " " diff --git a/src/pan-view/pan-view.c b/src/pan-view/pan-view.c index bcd1d85d..60104778 100644 --- a/src/pan-view/pan-view.c +++ b/src/pan-view/pan-view.c @@ -2138,7 +2138,16 @@ static void pan_copy_path_cb(GtkWidget *widget, gpointer data) 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 @@ static GtkWidget *pan_popup_menu(PanWindow *pw) 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); diff --git a/src/search.c b/src/search.c index 190000da..7ded659b 100644 --- a/src/search.c +++ b/src/search.c @@ -999,7 +999,14 @@ static void sr_menu_copy_path_cb(GtkWidget *widget, gpointer data) { 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 @@ static GtkWidget *search_result_menu(SearchData *sd, gboolean on_row, gboolean e 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); diff --git a/src/utilops.c b/src/utilops.c index 06d04ff7..0950b98a 100644 --- a/src/utilops.c +++ b/src/utilops.c @@ -3032,7 +3032,7 @@ void file_util_rename_dir(FileData *source_fd, const gchar *new_path, GtkWidget } -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 @@ void file_util_copy_path_to_clipboard(FileData *fd) { 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 @@ void file_util_copy_path_list_to_clipboard(GList *list) 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, ' '); } diff --git a/src/utilops.h b/src/utilops.h index 5daa6e19..d9c6a1b7 100644 --- a/src/utilops.h +++ b/src/utilops.h @@ -68,8 +68,8 @@ void file_util_start_filter_from_filelist(const gchar *key, GList *list, const g 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: */ diff --git a/src/view_dir.c b/src/view_dir.c index d349d7e8..8ae22cc8 100644 --- a/src/view_dir.c +++ b/src/view_dir.c @@ -528,7 +528,16 @@ static void vd_pop_menu_copy_path_cb(GtkWidget *widget, gpointer data) 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 @@ GtkWidget *vd_pop_menu(ViewDir *vd, FileData *fd) 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); diff --git a/src/view_file/view_file.c b/src/view_file/view_file.c index de8b14b7..65084ee8 100644 --- a/src/view_file/view_file.c +++ b/src/view_file/view_file.c @@ -357,7 +357,14 @@ static void vf_pop_menu_copy_path_cb(GtkWidget *widget, gpointer data) { 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 @@ GtkWidget *vf_pop_menu(ViewFile *vf) 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); -- 2.20.1