This patch adds a new configuration setting, selection-clipboard, which allows
us to choose between the PRIMARY selection, and the CLIPBOARD selection, for
determining which X clipboard to use for storing mouse-selected data. It has
only two valid values: "primary" and "clipboard", with "clipboard" being set as
the it's default value.

---
 config.c        |    3 +++
 page-widget.c   |   18 ++++++++++++++----
 shortcuts.c     |   14 +++++++++++---
 utils.c         |   26 ++++++++++++++++++++++++++
 utils.h         |   10 ++++++++++
 zathurarc.5.rst |   11 +++++++++++
 6 files changed, 75 insertions(+), 7 deletions(-)

diff --git a/config.c b/config.c
index 88f007d..d5fb533 100644
--- a/config.c
+++ b/config.c
@@ -128,6 +128,7 @@ config_load_default(zathura_t* zathura)
   float float_value          = 0;
   bool bool_value            = false;
   bool inc_search            = true;
+  char* string_value         = NULL;
   girara_session_t* gsession = zathura->ui.session;
 
   /* mode settings */
@@ -222,6 +223,8 @@ config_load_default(zathura_t* zathura)
   girara_setting_add(gsession, "statusbar-basename",     &bool_value,  
BOOLEAN, false, _("Use basename of the file in the statusbar"), NULL, NULL);
   bool_value = false;
   girara_setting_add(gsession, "synctex",                &bool_value,  
BOOLEAN, false, _("Enable synctex support"), NULL, NULL);
+  string_value = "clipboard";
+  girara_setting_add(gsession, "selection-clipboard",    string_value, STRING, 
 false, _("The clipboard into which mouse-selected data will be written"), 
NULL, NULL);
 
   /* define default shortcuts */
   girara_shortcut_add(gsession, GDK_CONTROL_MASK, GDK_KEY_c,          NULL, 
sc_abort,                    0,          0,               NULL);
diff --git a/page-widget.c b/page-widget.c
index adf69da..d5ebd96 100644
--- a/page-widget.c
+++ b/page-widget.c
@@ -669,15 +669,20 @@ cb_zathura_page_widget_button_release_event(GtkWidget* 
widget, GdkEventButton* b
       char* text = zathura_page_get_text(priv->page, tmp, NULL);
       if (text != NULL) {
         if (strlen(text) > 0) {
-          /* copy to clipboard */
-          gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), 
text, -1);
+          GdkAtom* selection = get_selection(priv->zathura);
 
+          /* copy to clipboard */
+          if (selection != NULL) {
+            gtk_clipboard_set_text(gtk_clipboard_get(*selection), text, -1);
+          }
 
           if (priv->page != NULL && document != NULL && priv->zathura != NULL) 
{
             char* stripped_text = g_strdelimit(g_strdup(text), "\n\t\r\n", ' 
');
             girara_notify(priv->zathura->ui.session, GIRARA_INFO, _("Copied 
selected text to clipboard: %s"), stripped_text);
             g_free(stripped_text);
           }
+
+          g_free(selection);
         }
 
         g_free(text);
@@ -832,9 +837,14 @@ cb_menu_image_copy(GtkMenuItem* item, ZathuraPage* page)
   GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable(NULL, pixmap, NULL, 0, 0, 0,
                       0, width, height);
 
-  gtk_clipboard_set_image(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), pixbuf);
-  gtk_clipboard_set_image(gtk_clipboard_get(GDK_SELECTION_PRIMARY), pixbuf);
+  GdkAtom* selection = get_selection(priv->zathura);
+
+  if (selection != NULL) {
+    gtk_clipboard_set_image(gtk_clipboard_get(*selection), pixbuf);
+    gtk_clipboard_set_image(gtk_clipboard_get(*selection), pixbuf);
+  }
 
+  g_free(selection);
   /* reset */
   priv->images.current = NULL;
 #endif
diff --git a/shortcuts.c b/shortcuts.c
index d251cdd..1191144 100644
--- a/shortcuts.c
+++ b/shortcuts.c
@@ -274,16 +274,24 @@ sc_focus_inputbar(girara_session_t* session, 
girara_argument_t* argument, girara
       g_free(tmp);
     }
 
+    GdkAtom* selection = get_selection(zathura);
+
     /* we save the X clipboard that will be clear by "grab_focus" */
-    gchar* x_clipboard_text = 
gtk_clipboard_wait_for_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY));
+    gchar* x_clipboard_text;
+
+    if (selection != NULL) {
+      x_clipboard_text = 
gtk_clipboard_wait_for_text(gtk_clipboard_get(*selection));
+    }
 
     gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1);
 
-    if (x_clipboard_text != NULL) {
+    if (x_clipboard_text != NULL && selection != NULL) {
       /* we reset the X clipboard with saved text */
-      gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), 
x_clipboard_text, -1);
+      gtk_clipboard_set_text(gtk_clipboard_get(*selection), x_clipboard_text, 
-1);
       g_free(x_clipboard_text);
     }
+
+    g_free(selection);
   }
 
   return true;
diff --git a/utils.c b/utils.c
index 7c462b3..e92c8f3 100644
--- a/utils.c
+++ b/utils.c
@@ -411,3 +411,29 @@ replace_substring(const char* string, const char* old, 
const char* new)
 
   return ret;
 }
+
+GdkAtom* get_selection(zathura_t* zathura)
+{
+    g_return_val_if_fail(zathura != NULL, NULL);
+
+    char* value;
+    girara_setting_get(zathura->ui.session, "selection-clipboard", &value);
+
+    GdkAtom* selection = g_malloc(sizeof(GdkAtom));
+
+    if (strcmp(value, "primary") == 0) {
+      *selection = GDK_SELECTION_PRIMARY;
+    } else if (strcmp(value, "clipboard") == 0) {
+      *selection = GDK_SELECTION_CLIPBOARD;
+    } else {
+      girara_error("Invalid value for the selection-clipboard setting");
+      g_free(value);
+      g_free(selection);
+
+      return NULL;
+    }
+
+    g_free(value);
+
+    return selection;
+}
diff --git a/utils.h b/utils.h
index ce6baf6..d42baf5 100644
--- a/utils.h
+++ b/utils.h
@@ -154,4 +154,14 @@ char* zathura_get_version_string(zathura_t* zathura, bool 
markup);
  */
 char* replace_substring(const char* string, const char* old, const char* new);
 
+/**
+ * Get a pointer to the GdkAtom of the current clipboard.
+ *
+ * @param zathura The zathura instance
+ *
+ * @return A pointer to a GdkAtom object correspoinding to the current
+ * clipboard, or NULL.
+ */
+GdkAtom* get_selection(zathura_t* zathura);
+
 #endif // UTILS_H
diff --git a/zathurarc.5.rst b/zathurarc.5.rst
index 17bad11..c7c520f 100644
--- a/zathurarc.5.rst
+++ b/zathurarc.5.rst
@@ -749,6 +749,17 @@ Defines the amount of percent that is zoomed in or out on 
each command.
 * Value type: Integer
 * Default value: 10
 
+selection-clipboard
+^^^^^^^^^^^^^^^^^^^
+Defines the X clipbaord into which mouse-selected data will be written.  When 
it
+is "clipboard", selected data will be written to the CLIPBOARD clipboard, and
+can be pasted using the Ctrl+v key combination.  When it is "primary", selected
+data will be written to the PRIMARY clipboard, and can be pasted using the
+middle mouse button, or the Shift-Insert key combination.
+
+* Value type: String
+* Default value: clipbaord
+
 SEE ALSO
 ========
 
-- 
1.7.10.4

_______________________________________________
zathura mailing list
zathura@lists.pwmt.org
http://lists.pwmt.org/mailman/listinfo/zathura

Reply via email to