diff -ur gtk+-2.24.31/gtk/gtkentry.c gtk+-2.24.31_patched/gtk/gtkentry.c --- gtk+-2.24.31/gtk/gtkentry.c 2016-07-03 20:01:01.000000000 +0200 +++ gtk+-2.24.31_patched/gtk/gtkentry.c 2016-10-06 20:19:41.504175144 +0200 @@ -168,6 +168,7 @@ CUT_CLIPBOARD, COPY_CLIPBOARD, PASTE_CLIPBOARD, + PASTE_SELECTION, TOGGLE_OVERWRITE, ICON_PRESS, ICON_RELEASE, @@ -382,6 +383,8 @@ static void gtk_entry_cut_clipboard (GtkEntry *entry); static void gtk_entry_copy_clipboard (GtkEntry *entry); static void gtk_entry_paste_clipboard (GtkEntry *entry); +static void gtk_entry_paste_selection (GtkEntry *entry, + const gchar *which); static void gtk_entry_toggle_overwrite (GtkEntry *entry); static void gtk_entry_select_all (GtkEntry *entry); static void gtk_entry_real_activate (GtkEntry *entry); @@ -612,6 +615,7 @@ class->cut_clipboard = gtk_entry_cut_clipboard; class->copy_clipboard = gtk_entry_copy_clipboard; class->paste_clipboard = gtk_entry_paste_clipboard; + class->paste_selection = gtk_entry_paste_selection; class->toggle_overwrite = gtk_entry_toggle_overwrite; class->activate = gtk_entry_real_activate; class->get_text_area_size = gtk_entry_get_text_area_size; @@ -1485,6 +1489,26 @@ _gtk_marshal_VOID__VOID, G_TYPE_NONE, 0); + + /** + * GtkEntry::paste-selection: + * @entry: the object which received the signal + * + * The ::paste-selection signal is a + * keybinding signal + * which gets emitted to paste the contents of the given selection + * into the entry. + */ + signals[PASTE_SELECTION] = + g_signal_new (I_("paste-selection"), + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GtkEntryClass, paste_selection), + NULL, NULL, + _gtk_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + /** * GtkEntry::toggle-overwrite: * @entry: the object which received the signal @@ -5091,6 +5115,23 @@ gtk_widget_error_bell (GTK_WIDGET (entry)); } +gtk_entry_paste_selection (GtkEntry *entry, const gchar *which) +{ + if (entry->editable) + { + if (g_str_equal(which, "primary")) + gtk_entry_paste (entry, GDK_SELECTION_PRIMARY); + else if (g_str_equal(which, "secondary")) + gtk_entry_paste (entry, GDK_SELECTION_PRIMARY); + else if (g_str_equal(which, "clipboard")) + gtk_entry_paste (entry, GDK_SELECTION_CLIPBOARD); + else + gtk_widget_error_bell (GTK_WIDGET (entry)); + } + else + gtk_widget_error_bell (GTK_WIDGET (entry)); +} + static void gtk_entry_delete_cb (GtkEntry *entry) { diff -ur gtk+-2.24.31/gtk/gtkentry.h gtk+-2.24.31_patched/gtk/gtkentry.h --- gtk+-2.24.31/gtk/gtkentry.h 2015-12-28 16:42:28.000000000 +0100 +++ gtk+-2.24.31_patched/gtk/gtkentry.h 2016-10-06 19:59:44.000000000 +0200 @@ -149,6 +149,8 @@ void (* cut_clipboard) (GtkEntry *entry); void (* copy_clipboard) (GtkEntry *entry); void (* paste_clipboard) (GtkEntry *entry); + void (* paste_selection) (GtkEntry *entry, + const gchar *which); void (* toggle_overwrite) (GtkEntry *entry); /* hook to add other objects beside the entry (like in GtkSpinButton) */ @@ -160,7 +162,6 @@ /* Padding for future expansion */ void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); }; GType gtk_entry_get_type (void) G_GNUC_CONST; diff -ur gtk+-2.24.31/gtk/gtktextview.c gtk+-2.24.31_patched/gtk/gtktextview.c --- gtk+-2.24.31/gtk/gtktextview.c 2015-12-28 16:42:28.000000000 +0100 +++ gtk+-2.24.31_patched/gtk/gtktextview.c 2016-10-06 19:59:58.000000000 +0200 @@ -135,6 +135,7 @@ CUT_CLIPBOARD, COPY_CLIPBOARD, PASTE_CLIPBOARD, + PASTE_SELECTION, TOGGLE_OVERWRITE, MOVE_VIEWPORT, SELECT_ALL, @@ -281,6 +282,8 @@ static void gtk_text_view_cut_clipboard (GtkTextView *text_view); static void gtk_text_view_copy_clipboard (GtkTextView *text_view); static void gtk_text_view_paste_clipboard (GtkTextView *text_view); +static void gtk_text_view_paste_selection (GtkTextView *text_view, + const gchar *which); static void gtk_text_view_toggle_overwrite (GtkTextView *text_view); static void gtk_text_view_toggle_cursor_visible (GtkTextView *text_view); static void gtk_text_view_compat_move_focus(GtkTextView *text_view, @@ -532,6 +535,7 @@ klass->cut_clipboard = gtk_text_view_cut_clipboard; klass->copy_clipboard = gtk_text_view_copy_clipboard; klass->paste_clipboard = gtk_text_view_paste_clipboard; + klass->paste_selection = gtk_text_view_paste_selection; klass->toggle_overwrite = gtk_text_view_toggle_overwrite; klass->move_focus = gtk_text_view_compat_move_focus; klass->set_scroll_adjustments = gtk_text_view_set_scroll_adjustments; @@ -925,6 +929,27 @@ _gtk_marshal_VOID__VOID, G_TYPE_NONE, 0); + + /** + * GtkTextView::paste-selection: + * @text_view: the object which received the signal + * + * The ::paste-selection signal is a + * keybinding signal + * which gets emitted to paste the contents of the given selection + * into the text view. + */ + signals[PASTE_SELECTION] = + g_signal_new (I_("paste-selection"), + G_OBJECT_CLASS_TYPE (gobject_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GtkTextViewClass, paste_selection), + NULL, NULL, + _gtk_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + /** * GtkTextView::paste-clipboard: * @text_view: the object which received the signal @@ -5818,6 +5843,32 @@ } static void +gtk_text_view_paste_selection (GtkTextView *text_view, + const gchar *which) +{ + GtkClipboard *clipboard = NULL; + + if (g_str_equal (which, "primary")) + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (text_view), + GDK_SELECTION_PRIMARY); + else if (g_str_equal (which, "secondary")) + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (text_view), + GDK_SELECTION_SECONDARY); + else if (g_str_equal (which, "clipboard")) + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (text_view), + GDK_SELECTION_CLIPBOARD); + + if (clipboard) + gtk_text_buffer_paste_clipboard (get_buffer (text_view), + clipboard, + NULL, + text_view->editable); + else + gtk_widget_error_bell (GTK_WIDGET (text_view)); +} + + +static void gtk_text_view_paste_done_handler (GtkTextBuffer *buffer, GtkClipboard *clipboard, gpointer data) diff -ur gtk+-2.24.31/gtk/gtktextview.h gtk+-2.24.31_patched/gtk/gtktextview.h --- gtk+-2.24.31/gtk/gtktextview.h 2015-12-28 16:42:28.000000000 +0100 +++ gtk+-2.24.31_patched/gtk/gtktextview.h 2016-10-06 20:00:08.000000000 +0200 @@ -194,6 +194,8 @@ void (* cut_clipboard) (GtkTextView *text_view); void (* copy_clipboard) (GtkTextView *text_view); void (* paste_clipboard) (GtkTextView *text_view); + void (* paste_selection) (GtkTextView *text_view, const gchar *which); + /* overwrite */ void (* toggle_overwrite) (GtkTextView *text_view); @@ -211,7 +213,6 @@ void (*_gtk_reserved4) (void); void (*_gtk_reserved5) (void); void (*_gtk_reserved6) (void); - void (*_gtk_reserved7) (void); }; GType gtk_text_view_get_type (void) G_GNUC_CONST;