Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Unified Diff: chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc

Issue 173462: Fix control key and paste behavior in Linux omnibox. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_edit_view_gtk.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc
===================================================================
--- chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc (revision 24586)
+++ chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc (working copy)
@@ -104,7 +104,8 @@
#if !defined(TOOLKIT_VIEWS)
theme_provider_(GtkThemeProvider::GetFrom(profile)),
#endif
- tab_was_pressed_(false) {
+ tab_was_pressed_(false),
+ paste_clipboard_requested_(false) {
model_->set_popup_model(popup_view_->GetModel());
}
@@ -211,6 +212,8 @@
G_CALLBACK(&HandleBackSpaceThunk), this);
g_signal_connect(text_view_, "copy-clipboard",
G_CALLBACK(&HandleCopyClipboardThunk), this);
+ g_signal_connect(text_view_, "paste-clipboard",
+ G_CALLBACK(&HandlePasteClipboardThunk), this);
#if !defined(TOOLKIT_VIEWS)
registrar_.Add(this,
@@ -360,12 +363,12 @@
bool AutocompleteEditViewGtk::IsSelectAll() {
GtkTextIter sel_start, sel_end;
- if (!gtk_text_buffer_get_selection_bounds(text_buffer_, &sel_start, &sel_end))
- return false;
+ gtk_text_buffer_get_selection_bounds(text_buffer_, &sel_start, &sel_end);
GtkTextIter start, end;
gtk_text_buffer_get_bounds(text_buffer_, &start, &end);
+ // Returns true if the |text_buffer_| is empty.
return gtk_text_iter_equal(&start, &sel_start) &&
gtk_text_iter_equal(&end, &sel_end);
}
@@ -393,7 +396,7 @@
// Don't inline autocomplete when the caret/selection isn't at the end of
// the text.
CharRange sel = GetSelection();
- model_->StartAutocomplete(sel.cp_max < GetTextLength());
+ model_->StartAutocomplete(std::max(sel.cp_max, sel.cp_min) < GetTextLength());
}
void AutocompleteEditViewGtk::ClosePopup() {
@@ -443,6 +446,15 @@
}
void AutocompleteEditViewGtk::OnBeforePossibleChange() {
+ // If this change is caused by a paste clipboard action and all text is
+ // selected, then call model_->on_paste_replacing_all() to prevent inline
+ // autocomplete.
+ if (paste_clipboard_requested_) {
+ paste_clipboard_requested_ = false;
+ if (IsSelectAll())
+ model_->on_paste_replacing_all();
+ }
+
// Record our state.
text_before_change_ = GetText();
sel_before_change_ = GetSelection();
@@ -612,6 +624,10 @@
event->keyval == GDK_KP_Tab) &&
!(event->state & GDK_CONTROL_MASK));
+ // Reset |paste_clipboard_requested_| to make sure we won't misinterpret this
+ // key input action as a paste action.
+ paste_clipboard_requested_ = false;
+
// Call the default handler, so that IME can work as normal.
// New line characters will be filtered out by our "insert-text"
// signal handler attached to |text_buffer_| object.
@@ -684,6 +700,10 @@
}
gboolean AutocompleteEditViewGtk::HandleViewButtonPress(GdkEventButton* event) {
+ // We don't need to care about double and triple clicks.
+ if (event->type != GDK_BUTTON_PRESS)
+ return FALSE;
+
if (event->button == 1) {
// When the first button is pressed, track some stuff that will help us
// determine whether we should select all of the text when the button is
@@ -691,6 +711,11 @@
button_1_pressed_ = true;
text_view_focused_before_button_press_ = GTK_WIDGET_HAS_FOCUS(text_view_);
text_selected_during_click_ = false;
+ } else if (event->button == 2) {
+ // GtkTextView pastes PRIMARY selection with middle click.
+ // We can't call model_->on_paste_replacing_all() here, because the actual
+ // paste clipboard action may not be performed if the clipboard is empty.
+ paste_clipboard_requested_ = true;
}
return FALSE;
}
@@ -725,7 +750,9 @@
}
gboolean AutocompleteEditViewGtk::HandleViewFocusIn() {
- model_->OnSetFocus(false);
+ GdkModifierType modifiers;
+ gdk_window_get_pointer(text_view_->window, NULL, NULL, &modifiers);
+ model_->OnSetFocus((modifiers & GDK_CONTROL_MASK) != 0);
// TODO(deanm): Some keyword hit business, etc here.
return FALSE; // Continue propagation.
@@ -868,6 +895,10 @@
void AutocompleteEditViewGtk::HandleDragDataReceived(
GdkDragContext* context, gint x, gint y,
GtkSelectionData* selection_data, guint target_type, guint time) {
+ // Reset |paste_clipboard_requested_| to make sure we won't misinterpret this
+ // drop action as a paste action.
+ paste_clipboard_requested_ = false;
+
// Don't try to PasteAndGo on drops originating from this omnibox. However, do
// allow default behavior for such drags.
if (context->source_window == text_view_->window)
@@ -991,6 +1022,12 @@
gtk_text_buffer_copy_clipboard(text_buffer_, clipboard);
}
+void AutocompleteEditViewGtk::HandlePasteClipboard() {
+ // We can't call model_->on_paste_replacing_all() here, because the actual
+ // paste clipboard action may not be performed if the clipboard is empty.
+ paste_clipboard_requested_ = true;
+}
+
void AutocompleteEditViewGtk::SelectAllInternal(bool reversed,
bool update_primary_selection) {
GtkTextIter start, end;
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_edit_view_gtk.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698