Fix #137: "Copy path" problem (or may be feature)
authorColin Clark <colin.clark@cclark.uk>
Wed, 8 Nov 2017 17:06:50 +0000 (17:06 +0000)
committerColin Clark <colin.clark@cclark.uk>
Wed, 8 Nov 2017 17:06:50 +0000 (17:06 +0000)
https://github.com/BestImageViewer/geeqie/issues/137

Additional option on Preferences/Behavior to select either PRIMARY or
CLIPBOARD for the copy path menu item

doc/docbook/GuideOptionsBehavior.xml
src/advanced_exif.c
src/options.c
src/options.h
src/preferences.c
src/rcfile.c
src/typedefs.h
src/utilops.c

index 673cc59..df2584c 100644 (file)
           <para>This is the width and height of the icon generated from image and displayed when doing drag and drop actions. High resolution screens may require to increase this number.</para>\r
         </listitem>\r
       </varlistentry>\r
+      <varlistentry>\r
+        <term>\r
+          <guilabel>Copy path clipboard selection</guilabel>\r
+        </term>\r
+        <listitem>\r
+          <para>\r
+            This option determines which clipboard selection is used for the "Copy path" menu item. The exact method of the paste operation will depend on the operating system, but in general will be:\r
+            <variablelist>\r
+              <varlistentry>\r
+                <term>\r
+                  <guilabel>PRIMARY</guilabel>\r
+                </term>\r
+                <listitem>\r
+                  <para>Paste using mouse middle-click, or shift-insert.</para>\r
+                </listitem>\r
+              </varlistentry>\r
+              <varlistentry>\r
+                <term>\r
+                  <guilabel>CLIPBOARD</guilabel>\r
+                </term>\r
+                <listitem>\r
+                  <para>Paste using mouse right-click and select paste, or control-v.</para>\r
+                </listitem>\r
+              </varlistentry>\r
+            </variablelist>\r
+          </para>\r
+        </listitem>\r
+      </varlistentry>\r
     </variablelist>\r
   </section>\r
   <section id="Navigation">\r
index 8aeb2af..2a8715c 100644 (file)
@@ -335,7 +335,7 @@ static gboolean advanced_exif_mouseclick(GtkWidget *widget,
                col_num = g_list_index(cols, (gpointer)column);
                gtk_tree_model_get(store, &iter, display_order[col_num], &value, -1);
 
-               clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+               clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
                gtk_clipboard_set_text(clipboard, value, -1);
 
                g_list_free(cols);
index 869754e..b0695bc 100644 (file)
@@ -164,6 +164,7 @@ ConfOptions *init_options(ConfOptions *options)
        options->tree_descend_subdirs = FALSE;
        options->view_dir_list_single_click_enter = TRUE;
        options->update_on_time_change = TRUE;
+       options->clipboard_selection = PRIMARY;
 
        options->stereo.fixed_w = 1920;
        options->stereo.fixed_h = 1080;
index 3a62a2a..ca08d39 100644 (file)
@@ -51,6 +51,7 @@ struct _ConfOptions
 
        gint open_recent_list_maxsize;
        gint dnd_icon_size;
+       gint clipboard_selection;
 
        gboolean save_window_positions;
        gboolean use_saved_window_positions_for_new_windows;
index 7261330..1de5f90 100644 (file)
@@ -360,6 +360,7 @@ static void config_window_apply(void)
 
        options->open_recent_list_maxsize = c_options->open_recent_list_maxsize;
        options->dnd_icon_size = c_options->dnd_icon_size;
+       options->clipboard_selection = c_options->clipboard_selection;
 
        options->metadata.save_in_image_file = c_options->metadata.save_in_image_file;
        options->metadata.save_legacy_IPTC = c_options->metadata.save_legacy_IPTC;
@@ -524,6 +525,22 @@ static void quality_menu_cb(GtkWidget *combo, gpointer data)
                }
 }
 
+static void clipboard_selection_menu_cb(GtkWidget *combo, gpointer data)
+{
+       gint *option = data;
+
+       switch (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)))
+               {
+               case 0:
+               default:
+                       *option = PRIMARY;
+                       break;
+               case 1:
+                       *option = CLIPBOARD;
+                       break;
+               }
+}
+
 static void add_quality_menu(GtkWidget *table, gint column, gint row, const gchar *text,
                             guint option, guint *option_c)
 {
@@ -555,6 +572,33 @@ static void add_quality_menu(GtkWidget *table, gint column, gint row, const gcha
        gtk_widget_show(combo);
 }
 
+static void add_clipboard_selection_menu(GtkWidget *table, gint column, gint row, const gchar *text,
+                            guint option, guint *option_c)
+{
+       GtkWidget *combo;
+       gint current = 0;
+
+       *option_c = option;
+
+       pref_table_label(table, column, row, text, 0.0);
+
+       combo = gtk_combo_box_text_new();
+
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("PRIMARY"));
+       if (option == PRIMARY) current = 0;
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), _("CLIPBOARD"));
+       if (option == CLIPBOARD) current = 1;
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+       g_signal_connect(G_OBJECT(combo), "changed",
+                        G_CALLBACK(clipboard_selection_menu_cb), option_c);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, 0, 0, 0);
+       gtk_widget_show(combo);
+}
+
 static void thumb_size_menu_cb(GtkWidget *combo, gpointer data)
 {
        gint n;
@@ -2324,6 +2368,9 @@ static void config_tab_behavior(GtkWidget *notebook)
        pref_spin_new_int(group, _("Drag'n drop icon size"), NULL,
                          16, 256, 16, options->dnd_icon_size, &c_options->dnd_icon_size);
 
+       table = pref_table_new(group, 2, 1, FALSE, FALSE);
+       add_clipboard_selection_menu(table, 0, 0, _("Copy path clipboard selection:"), options->clipboard_selection, &c_options->clipboard_selection);
+
        group = pref_group_new(vbox, FALSE, _("Navigation"), GTK_ORIENTATION_VERTICAL);
 
        pref_checkbox_new_int(group, _("Progressive keyboard scrolling"),
index 4f135bd..4d3356d 100644 (file)
@@ -332,6 +332,7 @@ static void write_global_attributes(GString *outstr, gint indent)
        WRITE_NL(); WRITE_INT(*options, open_recent_list_maxsize);
        WRITE_NL(); WRITE_INT(*options, dnd_icon_size);
        WRITE_NL(); WRITE_BOOL(*options, place_dialogs_under_mouse);
+       WRITE_NL(); WRITE_INT(*options, clipboard_selection);
 
        WRITE_NL(); WRITE_BOOL(*options, save_window_positions);
        WRITE_NL(); WRITE_BOOL(*options, use_saved_window_positions_for_new_windows);
@@ -631,6 +632,7 @@ static gboolean load_global_params(const gchar **attribute_names, const gchar **
                if (READ_INT(*options, open_recent_list_maxsize)) continue;
                if (READ_INT(*options, dnd_icon_size)) continue;
                if (READ_BOOL(*options, place_dialogs_under_mouse)) continue;
+               if (READ_INT(*options, clipboard_selection)) continue;
 
                if (READ_BOOL(*options, save_window_positions)) continue;
                if (READ_BOOL(*options, use_saved_window_positions_for_new_windows)) continue;
index 6549550..8e55ea4 100644 (file)
@@ -28,6 +28,11 @@ typedef enum {
        ZOOM_RESET_NONE         = 2
 } ZoomMode;
 
+typedef enum {
+       PRIMARY = 0,
+       CLIPBOARD = 1,
+} ClipboardSelection;
+
 typedef enum {
        MOUSE_BUTTON_LEFT       = 1,
        MOUSE_BUTTON_MIDDLE     = 2,
index 0bc9d0d..06d04ff 100644 (file)
@@ -3038,7 +3038,14 @@ void file_util_copy_path_to_clipboard(FileData *fd)
 
        if (!fd || !*fd->path) return;
 
-       clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+       if (options->clipboard_selection == PRIMARY)
+               {
+               clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+               }
+       else
+               {
+               clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+               }
        gtk_clipboard_set_text(clipboard, g_shell_quote(fd->path), -1);
 }
 
@@ -3048,7 +3055,14 @@ void file_util_copy_path_list_to_clipboard(GList *list)
        GList *work;
        GString *new;
 
-       clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+       if (options->clipboard_selection == PRIMARY)
+               {
+               clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+               }
+       else
+               {
+               clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+               }
 
        new = g_string_new("");
        work = list;