Discussion:
[zathura] [Zathura PATCH] Make the X clipboard buffer configurable
Marwan Tanager
2013-08-31 02:14:54 UTC
Permalink
From: Marawan Tanager <marwan.tngr at gmail.com>

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
Loading...