[gtk+] Add support for disabling middle click paste



commit c1f01eb929b20cff0075ce76f214fc579a9796c9
Author: Bastien Nocera <hadess hadess net>
Date:   Wed Nov 30 20:46:55 2011 +0100

    Add support for disabling middle click paste
    
    Adds a gtk-enable-primary-paste setting that is backed by
    and X setting, and make GtkEntry and GtkTextView respect it.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=665243

 gdk/x11/gdksettings.c |    7 +++++--
 gtk/gtkentry.c        |   17 ++++++++++++++++-
 gtk/gtksettings.c     |   20 +++++++++++++++++++-
 gtk/gtktextview.c     |   17 +++++++++++++++--
 4 files changed, 55 insertions(+), 6 deletions(-)
---
diff --git a/gdk/x11/gdksettings.c b/gdk/x11/gdksettings.c
index eed43b5..15d73ba 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 28bf32b..22ff7ef 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 871c5e9..534ef02 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 53e1004..6611673 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)
 {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]