From 50bb377e125f679434eccce9d943cf56a1bf54a4 Mon Sep 17 00:00:00 2001 From: Tamaranch <138-Tamaranch@users.noreply.gitlab.xfce.org> Date: Tue, 12 May 2020 17:28:17 +0200 Subject: [PATCH] Persistent X clipboard --- mousepad/mousepad-window.c | 49 ++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c index 3de3105..4416305 100644 --- a/mousepad/mousepad-window.c +++ b/mousepad/mousepad-window.c @@ -154,6 +154,9 @@ static void mousepad_window_cursor_changed (MousepadD static void mousepad_window_selection_changed (MousepadDocument *document, gint selection, MousepadWindow *window); +static void mousepad_window_selection_extended (GtkTextBuffer *buffer, + GParamSpec *pspec, + MousepadWindow *window); static void mousepad_window_overwrite_changed (MousepadDocument *document, gboolean overwrite, MousepadWindow *window); @@ -404,6 +407,9 @@ struct _MousepadWindow /* idle update functions for the recent and go menu */ guint update_recent_menu_id; guint update_go_menu_id; + + /* persistent X clipboard */ + GdkAtom _MOUSEPAD_X_CLIPBOARD; }; @@ -1003,6 +1009,9 @@ mousepad_window_init (MousepadWindow *window) window->replace_dialog = NULL; window->active = NULL; window->recent_manager = NULL; + window->_MOUSEPAD_X_CLIPBOARD = gdk_atom_intern ("_MOUSEPAD_X_CLIPBOARD", FALSE); + gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (window), + window->_MOUSEPAD_X_CLIPBOARD), "", 0); #if GTK_CHECK_VERSION(3, 0, 0) gtk_window_set_has_resize_grip (GTK_WINDOW (window), TRUE); @@ -2205,11 +2214,12 @@ mousepad_window_selection_changed (MousepadDocument *document, gint selection, MousepadWindow *window) { - GtkAction *action; - guint i; - const gchar *action_names1[] = { "tabs-to-spaces", "spaces-to-tabs", "duplicate", "strip-trailing" }; - const gchar *action_names2[] = { "line-up", "line-down" }; - const gchar *action_names3[] = { "cut", "copy", "delete", "lowercase", "uppercase", "titlecase", "opposite-case" }; + GtkAction *action; + guint i; + GtkClipboard *clipboard_1, *clipboard_2; + const gchar *action_names1[] = { "tabs-to-spaces", "spaces-to-tabs", "duplicate", "strip-trailing" }; + const gchar *action_names2[] = { "line-up", "line-down" }; + const gchar *action_names3[] = { "cut", "copy", "delete", "lowercase", "uppercase", "titlecase", "opposite-case" }; /* sensitivity of the change selection action */ action = gtk_action_group_get_action (window->action_group, "change-selection"); @@ -2235,6 +2245,35 @@ mousepad_window_selection_changed (MousepadDocument *document, action = gtk_action_group_get_action (window->action_group, action_names3[i]); gtk_action_set_sensitive (action, selection > 0); } + + /* persistent X clipboard */ + if (selection) + g_signal_connect (G_OBJECT (document->buffer), "notify::cursor-position", + G_CALLBACK (mousepad_window_selection_extended), window); + else + { + mousepad_disconnect_by_func (G_OBJECT (document->buffer), + mousepad_window_selection_extended, window); + clipboard_1 = gtk_widget_get_clipboard (GTK_WIDGET (window), GDK_SELECTION_PRIMARY); + clipboard_2 = gtk_widget_get_clipboard (GTK_WIDGET (window), window->_MOUSEPAD_X_CLIPBOARD); + gtk_clipboard_set_text (clipboard_1, gtk_clipboard_wait_for_text (clipboard_2), -1); + } +} + + + +static void +mousepad_window_selection_extended (GtkTextBuffer *buffer, + GParamSpec *pspec, + MousepadWindow *window) +{ + GtkClipboard *clipboard; + + g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer)); + g_return_if_fail (MOUSEPAD_IS_WINDOW (window)); + + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window), window->_MOUSEPAD_X_CLIPBOARD); + gtk_text_buffer_copy_clipboard (buffer, clipboard); } -- 2.26.2