Fix #137: "Copy path" problem (or may be feature)
authorColin Clark <[email protected]>
Wed, 8 Nov 2017 17:06:50 +0000 (17:06 +0000)
committerColin Clark <[email protected]>
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 673cc59d01e880e1d8784f6eec166e254699cf2f..df2584ca4c345d8ab6d7001180203560907cb360 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 8aeb2af37620f958832d369a064212c464665114..2a8715cb2d4c8481250b29b7eaa7cb3fde3a9cc3 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 869754e2f62591019c18dd5e608fd1acf5941d24..b0695bcb354c91d02c2c02f496650678d91f56ae 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 3a62a2ac5c9f5e6b04589e25c9fb7831468487eb..ca08d392bc210c123824e1ff1482a69e579064b9 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 7261330ef2ff642cb5794e3b461d69be9d4d624f..1de5f90cd8a5ecf62a7537197d63ef92a0505455 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 4f135bda86f8ab674a49c76832efe7e66909a59a..4d3356d76c4b5a45c28711df5f58262cede9ee1d 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 654955061eeefdb851875486617f9c6dfd639056..8e55ea4d88e546f03a7f19a2da32c48843a30132 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 0bc9d0db8ff09b103a1aadaa96ac64fe6625b385..06d04ff7620615e1b73fd08ca2ea3b91c493f51a 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;