From 2269e91e8edfac9f5bacc7c45dd7c8281de8a852 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-settings.h | 1 + mousepad/mousepad-view.c | 91 ++++++++++++++++++++++++++ mousepad/mousepad-view.h | 8 +++ mousepad/mousepad-window.c | 3 + mousepad/org.xfce.mousepad.gschema.xml | 7 ++ 5 files changed, 110 insertions(+) diff --git a/mousepad/mousepad-settings.h b/mousepad/mousepad-settings.h index 4993045..bd051d4 100644 --- a/mousepad/mousepad-settings.h +++ b/mousepad/mousepad-settings.h @@ -22,6 +22,7 @@ G_BEGIN_DECLS /* Setting names */ +#define MOUSEPAD_SETTING_PERSISTENT_X_CLIPBOARD "/preferences/view/persistent-x-clipboard" #define MOUSEPAD_SETTING_AUTO_INDENT "/preferences/view/auto-indent" #define MOUSEPAD_SETTING_FONT_NAME "/preferences/view/font-name" #define MOUSEPAD_SETTING_USE_DEFAULT_FONT "/preferences/view/use-default-monospace-font" diff --git a/mousepad/mousepad-view.c b/mousepad/mousepad-view.c index 802f116..4b0fd8c 100644 --- a/mousepad/mousepad-view.c +++ b/mousepad/mousepad-view.c @@ -107,6 +107,10 @@ static void mousepad_view_transpose_words (GtkTextBuffer GtkTextIter *iter); static void mousepad_view_update_font (MousepadView *view); +static void mousepad_view_selection_extended (GtkTextBuffer *buffer, + GParamSpec *pspec, + MousepadView *view); + struct _MousepadViewClass @@ -150,6 +154,10 @@ struct _MousepadView gchar *color_scheme; gboolean match_braces; + + /* persistent X clipboard */ + GdkAtom _MOUSEPAD_X_CLIPBOARD; + gboolean persistent_x_clipboard; }; @@ -162,6 +170,7 @@ enum PROP_SHOW_LINE_ENDINGS, PROP_COLOR_SCHEME, PROP_WORD_WRAP, + PROP_PERSISTENT_X_CLIPBOARD, PROP_MATCH_BRACES, NUM_PROPERTIES }; @@ -237,6 +246,15 @@ mousepad_view_class_init (MousepadViewClass *klass) FALSE, G_PARAM_READWRITE)); + g_object_class_install_property ( + gobject_class, + PROP_PERSISTENT_X_CLIPBOARD, + g_param_spec_boolean ("persistent-x-clipboard", + "PersistentXClipboard", + "Whether to enable X clipboard persistence", + FALSE, + G_PARAM_READWRITE)); + g_object_class_install_property ( gobject_class, PROP_MATCH_BRACES, @@ -328,6 +346,7 @@ mousepad_view_init (MousepadView *view) #define BIND_(setting, prop) \ MOUSEPAD_SETTING_BIND (setting, view, prop, G_SETTINGS_BIND_DEFAULT) + BIND_ (PERSISTENT_X_CLIPBOARD, "persistent-x-clipboard"); BIND_ (AUTO_INDENT, "auto-indent"); BIND_ (FONT_NAME, "font-name"); BIND_ (SHOW_WHITESPACE, "show-whitespace"); @@ -403,6 +422,9 @@ mousepad_view_set_property (GObject *object, case PROP_WORD_WRAP: mousepad_view_set_word_wrap (view, g_value_get_boolean (value)); break; + case PROP_PERSISTENT_X_CLIPBOARD: + mousepad_view_set_persistent_x_clipboard (view, g_value_get_boolean (value)); + break; case PROP_MATCH_BRACES: mousepad_view_set_match_braces (view, g_value_get_boolean (value)); break; @@ -439,6 +461,9 @@ mousepad_view_get_property (GObject *object, case PROP_WORD_WRAP: g_value_set_boolean (value, mousepad_view_get_word_wrap (view)); break; + case PROP_PERSISTENT_X_CLIPBOARD: + g_value_set_boolean (value, mousepad_view_get_persistent_x_clipboard (view)); + break; case PROP_MATCH_BRACES: g_value_set_boolean (value, mousepad_view_get_match_braces (view)); break; @@ -2860,3 +2885,69 @@ mousepad_view_get_match_braces (MousepadView *view) return view->match_braces; } + + + +void +mousepad_view_set_persistent_x_clipboard (MousepadView *view, + gboolean enabled) +{ + g_return_if_fail (MOUSEPAD_IS_VIEW (view)); + + view->persistent_x_clipboard = enabled; + if (enabled) + { + view->_MOUSEPAD_X_CLIPBOARD = gdk_atom_intern_static_string ("_MOUSEPAD_X_CLIPBOARD"); + gtk_clipboard_set_text (gtk_clipboard_get (view->_MOUSEPAD_X_CLIPBOARD), "", 0); + } +} + + + +gboolean +mousepad_view_get_persistent_x_clipboard (MousepadView *view) +{ + g_return_val_if_fail (MOUSEPAD_IS_VIEW (view), FALSE); + + return view->persistent_x_clipboard; +} + + + +void +mousepad_view_persistent_x_clipboard (gint selection, + MousepadView *view) +{ + GtkTextBuffer *buffer; + GtkClipboard *clipboard_1, *clipboard_2; + + g_return_if_fail (MOUSEPAD_IS_VIEW (view)); + + if (view->persistent_x_clipboard) + { + buffer = mousepad_view_get_buffer (view); + if (selection) + g_signal_connect (G_OBJECT (buffer), "notify::cursor-position", + G_CALLBACK (mousepad_view_selection_extended), view); + else + { + mousepad_disconnect_by_func (G_OBJECT (buffer), mousepad_view_selection_extended, view); + clipboard_1 = gtk_widget_get_clipboard (GTK_WIDGET (view), GDK_SELECTION_PRIMARY); + clipboard_2 = gtk_clipboard_get (view->_MOUSEPAD_X_CLIPBOARD); + gtk_clipboard_set_text (clipboard_1, gtk_clipboard_wait_for_text (clipboard_2), -1); + } + } +} + + + +static void +mousepad_view_selection_extended (GtkTextBuffer *buffer, + GParamSpec *pspec, + MousepadView *view) +{ + g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer)); + g_return_if_fail (MOUSEPAD_IS_VIEW (view)); + + gtk_text_buffer_copy_clipboard (buffer, gtk_clipboard_get (view->_MOUSEPAD_X_CLIPBOARD)); +} diff --git a/mousepad/mousepad-view.h b/mousepad/mousepad-view.h index 14c5fce..324d185 100644 --- a/mousepad/mousepad-view.h +++ b/mousepad/mousepad-view.h @@ -124,6 +124,14 @@ void mousepad_view_set_match_braces (MousepadView *view gboolean mousepad_view_get_match_braces (MousepadView *view); +void mousepad_view_set_persistent_x_clipboard (MousepadView *view, + gboolean enabled); + +gboolean mousepad_view_get_persistent_x_clipboard (MousepadView *view); + +void mousepad_view_persistent_x_clipboard (gint selection, + MousepadView *view); + G_END_DECLS #endif /* !__MOUSEPAD_VIEW_H__ */ diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c index 3de3105..a679c1f 100644 --- a/mousepad/mousepad-window.c +++ b/mousepad/mousepad-window.c @@ -2235,6 +2235,9 @@ 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 */ + mousepad_view_persistent_x_clipboard (selection, document->textview); } diff --git a/mousepad/org.xfce.mousepad.gschema.xml b/mousepad/org.xfce.mousepad.gschema.xml index 105a14a..e8c45c0 100644 --- a/mousepad/org.xfce.mousepad.gschema.xml +++ b/mousepad/org.xfce.mousepad.gschema.xml @@ -48,6 +48,13 @@ + + false + Persistent X clipboard + + When true, X clipboard persistence after text deselection is enabled, when false it is not. + + false Auto-indentation -- 2.26.2