Index: chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc |
diff --git a/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc b/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc |
index 35f413fe146348f08c630c82eca17f5500a295e1..1dbb500ffbdbab008c543722ff14196af83a0621 100644 |
--- a/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc |
+++ b/chrome/browser/ui/gtk/omnibox/omnibox_popup_view_gtk.cc |
@@ -488,7 +488,9 @@ void OmniboxPopupViewGtk::AcceptLine(size_t line, |
} |
const gfx::Image* OmniboxPopupViewGtk::IconForMatch( |
- const AutocompleteMatch& match, bool selected) { |
+ const AutocompleteMatch& match, |
+ bool selected, |
+ bool is_selected_keyword) { |
const SkBitmap* bitmap = model_->GetIconIfExtensionMatch(match); |
if (bitmap) { |
if (!ContainsKey(images_, bitmap)) { |
@@ -499,8 +501,14 @@ const gfx::Image* OmniboxPopupViewGtk::IconForMatch( |
return images_[bitmap]; |
} |
- int icon = match.starred ? |
- IDR_OMNIBOX_STAR : AutocompleteMatch::TypeToIcon(match.type); |
+ int icon; |
+ if (is_selected_keyword) |
+ icon = IDR_OMNIBOX_TTS; |
+ else if (match.starred) |
+ icon = IDR_OMNIBOX_STAR; |
+ else |
+ icon = AutocompleteMatch::TypeToIcon(match.type); |
+ |
if (selected) { |
switch (icon) { |
case IDR_OMNIBOX_EXTENSION_APP: |
@@ -518,6 +526,9 @@ const gfx::Image* OmniboxPopupViewGtk::IconForMatch( |
case IDR_OMNIBOX_STAR: |
icon = IDR_OMNIBOX_STAR_DARK; |
break; |
+ case IDR_OMNIBOX_TTS: |
+ icon = IDR_OMNIBOX_TTS_DARK; |
+ break; |
default: |
NOTREACHED(); |
break; |
@@ -527,6 +538,24 @@ const gfx::Image* OmniboxPopupViewGtk::IconForMatch( |
return theme_service_->GetImageNamed(icon); |
} |
+void OmniboxPopupViewGtk::GetVisibleMatchForInput( |
+ size_t index, |
+ const AutocompleteMatch** match, |
+ bool* is_selected_keyword) { |
+ const AutocompleteResult& result = model_->result(); |
+ |
+ if (result.match_at(index).associated_keyword.get() && |
+ model_->selected_line() == index && |
+ model_->selected_line_state() == AutocompletePopupModel::KEYWORD) { |
+ *match = result.match_at(index).associated_keyword.get(); |
+ *is_selected_keyword = true; |
+ return; |
+ } |
+ |
+ *match = &result.match_at(index); |
+ *is_selected_keyword = false; |
+} |
+ |
gboolean OmniboxPopupViewGtk::HandleMotion(GtkWidget* widget, |
GdkEventMotion* event) { |
// TODO(deanm): Windows has a bunch of complicated logic here. |
@@ -610,7 +639,9 @@ gboolean OmniboxPopupViewGtk::HandleExpose(GtkWidget* widget, |
if (!line_rect.Intersects(damage_rect)) |
continue; |
- const AutocompleteMatch& match = result.match_at(i); |
+ const AutocompleteMatch* match = NULL; |
+ bool is_selected_keyword = false; |
+ GetVisibleMatchForInput(i, &match, &is_selected_keyword); |
bool is_selected = (model_->selected_line() == i); |
bool is_hovered = (model_->hovered_line() == i); |
if (is_selected || is_hovered) { |
@@ -626,20 +657,20 @@ gboolean OmniboxPopupViewGtk::HandleExpose(GtkWidget* widget, |
(line_rect.width() - kIconLeftPadding - kIconWidth); |
// Draw the icon for this result. |
DrawFullImage(cr, widget, |
- IconForMatch(match, is_selected), |
+ IconForMatch(*match, is_selected, is_selected_keyword), |
icon_start_x, line_rect.y() + kIconTopPadding); |
// Draw the results text vertically centered in the results space. |
// First draw the contents / url, but don't let it take up the whole width |
// if there is also a description to be shown. |
- bool has_description = !match.description.empty(); |
+ bool has_description = !match->description.empty(); |
int text_width = window_rect.width() - (kIconAreaWidth + kRightPadding); |
int allocated_content_width = has_description ? |
static_cast<int>(text_width * kContentWidthPercentage) : text_width; |
pango_layout_set_width(layout_, allocated_content_width * PANGO_SCALE); |
// Note: We force to URL to LTR for all text directions. |
- SetupLayoutForMatch(layout_, match.contents, match.contents_class, |
+ SetupLayoutForMatch(layout_, match->contents, match->contents_class, |
is_selected ? &selected_content_text_color_ : |
&content_text_color_, |
is_selected ? &selected_content_dim_text_color_ : |
@@ -674,7 +705,7 @@ gboolean OmniboxPopupViewGtk::HandleExpose(GtkWidget* widget, |
// In Windows, a boolean "force_dim" is passed as true for the |
// description. Here, we pass the dim text color for both normal and dim, |
// to accomplish the same thing. |
- SetupLayoutForMatch(layout_, match.description, match.description_class, |
+ SetupLayoutForMatch(layout_, match->description, match->description_class, |
is_selected ? &selected_content_dim_text_color_ : |
&content_dim_text_color_, |
is_selected ? &selected_content_dim_text_color_ : |
@@ -694,6 +725,18 @@ gboolean OmniboxPopupViewGtk::HandleExpose(GtkWidget* widget, |
pango_cairo_show_layout(cr, layout_); |
cairo_restore(cr); |
} |
+ |
+ if (match->associated_keyword.get()) { |
+ // If this entry has an associated keyword, draw the arrow at the extreme |
+ // other side of the omnibox. |
+ icon_start_x = ltr ? (line_rect.width() - kIconLeftPadding - kIconWidth) : |
+ kIconLeftPadding; |
+ // Draw the icon for this result. |
+ DrawFullImage(cr, widget, |
+ theme_service_->GetImageNamed( |
+ is_selected ? IDR_OMNIBOX_TTS_DARK : IDR_OMNIBOX_TTS), |
+ icon_start_x, line_rect.y() + kIconTopPadding); |
+ } |
} |
cairo_destroy(cr); |