diff --git a/gdk/x11/gdksettings.c b/gdk/x11/gdksettings.c index eed43b5bd4..15d73ba98d 100644 --- a/gdk/x11/gdksettings.c +++ b/gdk/x11/gdksettings.c @@ -81,7 +81,9 @@ static const char gdk_settings_names[] = "Gtk/AutoMnemonics\0" "gtk-auto-mnemonics\0" "Gtk/VisibleFocus\0" "gtk-visible-focus\0" "Gtk/ShellShowsAppMenu\0" "gtk-shell-shows-app-menu\0" - "Gtk/ShellShowsMenubar\0" "gtk-shell-shows-menubar\0"; + "Gtk/ShellShowsMenubar\0" "gtk-shell-shows-menubar\0" + "Gtk/EnablePrimaryPaste\0" "gtk-enable-primary-paste\0"; + static const struct @@ -137,5 +139,6 @@ static const struct { 1730, 1748 }, { 1767, 1784 }, { 1802, 1824 }, - { 1849, 1871 } + { 1849, 1871 }, + { 1895, 1918 } }; diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 28bf32b5e4..22ff7ef072 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -572,6 +572,7 @@ static void gtk_entry_move_adjustments (GtkEntry *en static GdkPixbuf * gtk_entry_ensure_pixbuf (GtkEntry *entry, GtkEntryIconPosition icon_pos); static void gtk_entry_update_cached_style_values(GtkEntry *entry); +static gboolean get_middle_click_paste (GtkEntry *entry); /* Completion */ static gint gtk_entry_completion_timeout (gpointer data); @@ -3962,7 +3963,9 @@ gtk_entry_button_press (GtkWidget *widget, return TRUE; } - else if (event->button == GDK_BUTTON_MIDDLE && event->type == GDK_BUTTON_PRESS) + else if (event->type == GDK_BUTTON_PRESS && + event->button == GDK_BUTTON_MIDDLE && + get_middle_click_paste (entry)) { if (priv->editable) { @@ -9157,6 +9160,18 @@ cursor_blinks (GtkEntry *entry) return FALSE; } +static gboolean +get_middle_click_paste (GtkEntry *entry) +{ + GtkSettings *settings; + gboolean paste; + + settings = gtk_widget_get_settings (GTK_WIDGET (entry)); + g_object_get (settings, "gtk-enable-primary-paste", &paste, NULL); + + return paste; +} + static gint get_cursor_time (GtkEntry *entry) { diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index 871c5e9f92..534ef021c5 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -209,7 +209,8 @@ enum { PROP_IM_PREEDIT_STYLE, PROP_IM_STATUS_STYLE, PROP_SHELL_SHOWS_APP_MENU, - PROP_SHELL_SHOWS_MENUBAR + PROP_SHELL_SHOWS_MENUBAR, + PROP_ENABLE_PRIMARY_PASTE }; /* --- prototypes --- */ @@ -1355,6 +1356,23 @@ gtk_settings_class_init (GtkSettingsClass *class) NULL); g_assert (result == PROP_SHELL_SHOWS_MENUBAR); + /** + * GtkSettings:gtk-enable-primary-paste: + * + * Whether a middle click on a mouse should paste the + * 'PRIMARY' clipboard content at the cursor location. + * + * Since: 3.4 + */ + result = settings_install_property_parser (class, + g_param_spec_boolean ("gtk-enable-primary-paste", + P_("Enable primary paste"), + P_("Whether a middle click on a mouse should paste the 'PRIMARY' clipboard content at the cursor location."), + TRUE, + GTK_PARAM_READWRITE), + NULL); + g_assert (result == PROP_ENABLE_PRIMARY_PASTE); + g_type_class_add_private (class, sizeof (GtkSettingsPrivate)); } diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 53e1004d4c..66116733c0 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -338,7 +338,7 @@ static gboolean gtk_text_view_focus (GtkWidget *widget, GtkDirectionType direction); static void gtk_text_view_select_all (GtkWidget *widget, gboolean select); - +static gboolean get_middle_click_paste (GtkTextView *text_view); /* Source side drag signals */ static void gtk_text_view_drag_begin (GtkWidget *widget, @@ -4589,7 +4589,8 @@ gtk_text_view_button_press_event (GtkWidget *widget, GdkEventButton *event) return TRUE; } - else if (event->button == GDK_BUTTON_MIDDLE) + else if (event->button == GDK_BUTTON_MIDDLE && + get_middle_click_paste (text_view)) { GtkTextIter iter; @@ -5052,6 +5053,18 @@ cursor_blinks (GtkTextView *text_view) return FALSE; } +static gboolean +get_middle_click_paste (GtkTextView *text_view) +{ + GtkSettings *settings; + gboolean paste; + + settings = gtk_widget_get_settings (GTK_WIDGET (text_view)); + g_object_get (settings, "gtk-enable-primary-paste", &paste, NULL); + + return paste; +} + static gint get_cursor_time (GtkTextView *text_view) {