summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc27
-rw-r--r--chrome/browser/autocomplete/autocomplete_edit_view_gtk.h5
2 files changed, 32 insertions, 0 deletions
diff --git a/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc b/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc
index 0938d83..d41d373 100644
--- a/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc
+++ b/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc
@@ -210,6 +210,8 @@ void AutocompleteEditViewGtk::Init() {
G_CALLBACK(&HandleDragDataReceivedThunk), this);
g_signal_connect(text_view_, "backspace",
G_CALLBACK(&HandleBackSpaceThunk), this);
+ g_signal_connect(text_view_, "copy-clipboard",
+ G_CALLBACK(&HandleCopyClipboardThunk), this);
#if !defined(TOOLKIT_VIEWS)
registrar_.Add(this,
@@ -921,6 +923,31 @@ void AutocompleteEditViewGtk::HandleBackSpace() {
g_signal_stop_emission(text_view_, signal_id, 0);
}
+void AutocompleteEditViewGtk::HandleCopyClipboard() {
+ // On copy, we manually update the PRIMARY selection to contain the
+ // highlighted text. This matches Firefox -- we highlight the URL but don't
+ // update PRIMARY on Ctrl-L, so Ctrl-L, Ctrl-C and then middle-click is a
+ // convenient way to paste the current URL somewhere.
+ if (!gtk_text_buffer_get_has_selection(text_buffer_))
+ return;
+
+ GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+ DCHECK(clipboard);
+ if (!clipboard)
+ return;
+
+ // Passing gtk_text_buffer_copy_clipboard() a text buffer that already owns
+ // the clipboard that's being updated clears the highlighted text, which we
+ // don't want to do (and it also appears to at least sometimes trigger a
+ // failed G_IS_OBJECT() assertion).
+ if (gtk_clipboard_get_owner(clipboard) == G_OBJECT(text_buffer_))
+ return;
+
+ // We can't just call SavePrimarySelection(); that makes the text view lose
+ // the selection and unhighlight its text.
+ gtk_text_buffer_copy_clipboard(text_buffer_, clipboard);
+}
+
void AutocompleteEditViewGtk::SelectAllInternal(bool reversed,
bool update_primary_selection) {
GtkTextIter start, end;
diff --git a/chrome/browser/autocomplete/autocomplete_edit_view_gtk.h b/chrome/browser/autocomplete/autocomplete_edit_view_gtk.h
index 50293e3..b9c83a3 100644
--- a/chrome/browser/autocomplete/autocomplete_edit_view_gtk.h
+++ b/chrome/browser/autocomplete/autocomplete_edit_view_gtk.h
@@ -271,6 +271,11 @@ class AutocompleteEditViewGtk : public AutocompleteEditView,
}
void HandleBackSpace();
+ static void HandleCopyClipboardThunk(GtkTextView* text_view, gpointer self) {
+ reinterpret_cast<AutocompleteEditViewGtk*>(self)->HandleCopyClipboard();
+ }
+ void HandleCopyClipboard();
+
// Actual implementation of SelectAll(), but also provides control over
// whether the PRIMARY selection is set to the selected text (in SelectAll(),
// it isn't, but we want set the selection when the user clicks in the entry).