12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/native_theme_gtk2.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <gtk/gtk.h>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/chrome_gtk_menu_subclasses.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/libgtk2ui/gtk2_ui.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/skia_utils_gtk2.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/color_utils.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/path.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size.h"
17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ui/gfx/skia_util.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/common_theme.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Theme colors returned by GetSystemColor().
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kInvalidColorIdColor = SkColorSetRGB(255, 0, 128);
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst GdkColor kURLTextColor = GDK_COLOR_RGB(0x00, 0x88, 0x00);
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochGdkColor GdkAlphaBlend(GdkColor foreground,
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       GdkColor background,
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       SkAlpha alpha) {
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return libgtk2ui::SkColorToGdkColor(
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      color_utils::AlphaBlend(libgtk2ui::GdkColorToSkColor(foreground),
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              libgtk2ui::GdkColorToSkColor(background), alpha));
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Generates the normal URL color, a green color used in unhighlighted URL
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// text. It is a mix of |kURLTextColor| and the current text color.  Unlike the
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// selected text color, it is more important to match the qualities of the
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// foreground typeface color instead of taking the background into account.
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochGdkColor NormalURLColor(GdkColor foreground) {
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::HSL fg_hsl;
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::SkColorToHSL(libgtk2ui::GdkColorToSkColor(foreground), &fg_hsl);
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::HSL hue_hsl;
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::SkColorToHSL(libgtk2ui::GdkColorToSkColor(kURLTextColor),
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            &hue_hsl);
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Only allow colors that have a fair amount of saturation in them (color vs
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // white). This means that our output color will always be fairly green.
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  double s = std::max(0.5, fg_hsl.s);
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Make sure the luminance is at least as bright as the |kURLTextColor| green
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // would be if we were to use that.
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  double l;
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (fg_hsl.l < hue_hsl.l)
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    l = hue_hsl.l;
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  else
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    l = (fg_hsl.l + hue_hsl.l) / 2;
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::HSL output = { hue_hsl.h, s, l };
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return libgtk2ui::SkColorToGdkColor(color_utils::HSLToSkColor(output, 255));
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Generates the selected URL color, a green color used on URL text in the
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// currently highlighted entry in the autocomplete popup. It's a mix of
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// |kURLTextColor|, the current text color, and the background color (the
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// select highlight). It is more important to contrast with the background
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// saturation than to look exactly like the foreground color.
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochGdkColor SelectedURLColor(GdkColor foreground, GdkColor background) {
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::HSL fg_hsl;
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::SkColorToHSL(libgtk2ui::GdkColorToSkColor(foreground),
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            &fg_hsl);
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::HSL bg_hsl;
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::SkColorToHSL(libgtk2ui::GdkColorToSkColor(background),
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            &bg_hsl);
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::HSL hue_hsl;
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::SkColorToHSL(libgtk2ui::GdkColorToSkColor(kURLTextColor),
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            &hue_hsl);
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The saturation of the text should be opposite of the background, clamped
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // to 0.2-0.8. We make sure it's greater than 0.2 so there's some color, but
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // less than 0.8 so it's not the oversaturated neon-color.
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  double opposite_s = 1 - bg_hsl.s;
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  double s = std::max(0.2, std::min(0.8, opposite_s));
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The luminance should match the luminance of the foreground text.  Again,
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // we clamp so as to have at some amount of color (green) in the text.
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  double opposite_l = fg_hsl.l;
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  double l = std::max(0.1, std::min(0.9, opposite_l));
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  color_utils::HSL output = { hue_hsl.h, s, l };
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return libgtk2ui::SkColorToGdkColor(color_utils::HSLToSkColor(output, 255));
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace libgtk2ui {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NativeThemeGtk2* NativeThemeGtk2::instance() {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CR_DEFINE_STATIC_LOCAL(NativeThemeGtk2, s_native_theme, ());
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return &s_native_theme;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NativeThemeGtk2::NativeThemeGtk2()
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : fake_window_(NULL),
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      fake_tooltip_(NULL),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fake_menu_item_(NULL) {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NativeThemeGtk2::~NativeThemeGtk2() {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (fake_window_)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gtk_widget_destroy(fake_window_);
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (fake_tooltip_)
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gtk_widget_destroy(fake_tooltip_);
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fake_entry_.Destroy();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fake_label_.Destroy();
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fake_button_.Destroy();
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  fake_tree_.Destroy();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fake_menu_.Destroy();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)gfx::Size NativeThemeGtk2::GetPartSize(Part part,
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                       State state,
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                       const ExtraParams& extra) const {
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (part == kComboboxArrow)
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return gfx::Size(12, 12);
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ui::NativeThemeBase::GetPartSize(part, state, extra);
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void NativeThemeGtk2::Paint(SkCanvas* canvas,
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            Part part,
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            State state,
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            const gfx::Rect& rect,
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            const ExtraParams& extra) const {
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (rect.IsEmpty())
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (part) {
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case kComboboxArrow:
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PaintComboboxArrow(canvas, GetGtkState(state), rect);
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return;
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    default:
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      NativeThemeBase::Paint(canvas, part, state, rect, extra);
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SkColor NativeThemeGtk2::GetSystemColor(ColorId color_id) const {
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (color_id == kColorId_BlueButtonShadowColor)
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return SK_ColorTRANSPARENT;
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GdkColorToSkColor(GetSystemGdkColor(color_id));
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeThemeGtk2::PaintMenuPopupBackground(
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkCanvas* canvas,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Size& size,
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const MenuBackgroundExtraParams& menu_background) const {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (menu_background.corner_radius > 0) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkPaint paint;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    paint.setStyle(SkPaint::kFill_Style);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    paint.setFlags(SkPaint::kAntiAlias_Flag);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    paint.setColor(GetSystemColor(kColorId_MenuBackgroundColor));
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Path path;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkRect rect = SkRect::MakeWH(SkIntToScalar(size.width()),
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 SkIntToScalar(size.height()));
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkScalar radius = SkIntToScalar(menu_background.corner_radius);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkScalar radii[8] = {radius, radius, radius, radius,
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         radius, radius, radius, radius};
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    path.addRoundRect(rect, radii);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    canvas->drawPath(path, paint);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    canvas->drawColor(GetSystemColor(kColorId_MenuBackgroundColor),
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      SkXfermode::kSrc_Mode);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void NativeThemeGtk2::PaintMenuItemBackground(
186b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    SkCanvas* canvas,
187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    State state,
188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const gfx::Rect& rect,
189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const MenuListExtraParams& menu_list) const {
190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  SkColor color;
191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  SkPaint paint;
192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  switch (state) {
193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    case NativeTheme::kNormal:
194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    case NativeTheme::kDisabled:
195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      color = GetSystemColor(NativeTheme::kColorId_MenuBackgroundColor);
196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      paint.setColor(color);
197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      break;
198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    case NativeTheme::kHovered:
199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      color = GetSystemColor(
200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          NativeTheme::kColorId_FocusedMenuItemBackgroundColor);
201b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      paint.setColor(color);
202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      break;
203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    default:
204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      NOTREACHED() << "Invalid state " << state;
205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      break;
206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  canvas->drawRect(gfx::RectToSkRect(rect), paint);
208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GdkColor NativeThemeGtk2::GetSystemGdkColor(ColorId color_id) const {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (color_id) {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Windows
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_WindowBackground:
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetWindowStyle()->bg[GTK_STATE_NORMAL];
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Dialogs
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_DialogBackground:
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetWindowStyle()->bg[GTK_STATE_NORMAL];
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // FocusableBorder
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_FocusedBorderColor:
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->bg[GTK_STATE_SELECTED];
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_UnfocusedBorderColor:
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->text_aa[GTK_STATE_NORMAL];
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // MenuItem
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_EnabledMenuItemForegroundColor:
22823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case kColorId_DisabledEmphasizedMenuItemForegroundColor:
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetMenuItemStyle()->text[GTK_STATE_NORMAL];
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_DisabledMenuItemForegroundColor:
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetMenuItemStyle()->text[GTK_STATE_INSENSITIVE];
232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    case kColorId_SelectedMenuItemForegroundColor:
233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      return GetMenuItemStyle()->text[GTK_STATE_SELECTED];
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_FocusedMenuItemBackgroundColor:
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetMenuItemStyle()->bg[GTK_STATE_SELECTED];
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_HoverMenuItemBackgroundColor:
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetMenuItemStyle()->bg[GTK_STATE_PRELIGHT];
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_FocusedMenuButtonBorderColor:
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->bg[GTK_STATE_NORMAL];
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_HoverMenuButtonBorderColor:
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->text_aa[GTK_STATE_PRELIGHT];
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_MenuBorderColor:
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_EnabledMenuButtonBorderColor:
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_MenuSeparatorColor: {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetMenuItemStyle()->text[GTK_STATE_INSENSITIVE];
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_MenuBackgroundColor:
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetMenuStyle()->bg[GTK_STATE_NORMAL];
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Label
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_LabelEnabledColor:
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetLabelStyle()->text[GTK_STATE_NORMAL];
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_LabelDisabledColor:
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetLabelStyle()->text[GTK_STATE_INSENSITIVE];
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_LabelBackgroundColor:
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetWindowStyle()->bg[GTK_STATE_NORMAL];
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Button
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonBackgroundColor:
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetButtonStyle()->bg[GTK_STATE_NORMAL];
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonEnabledColor:
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case kColorId_BlueButtonEnabledColor:
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetButtonStyle()->text[GTK_STATE_NORMAL];
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonDisabledColor:
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case kColorId_BlueButtonDisabledColor:
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetButtonStyle()->text[GTK_STATE_INSENSITIVE];
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonHighlightColor:
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetButtonStyle()->base[GTK_STATE_SELECTED];
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case kColorId_ButtonHoverColor:
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case kColorId_BlueButtonHoverColor:
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetButtonStyle()->text[GTK_STATE_PRELIGHT];
2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case kColorId_ButtonHoverBackgroundColor:
2730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return GetButtonStyle()->bg[GTK_STATE_PRELIGHT];
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case kColorId_BlueButtonPressedColor:
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return GetButtonStyle()->text[GTK_STATE_ACTIVE];
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case kColorId_BlueButtonShadowColor:
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // Should be handled in GetSystemColor().
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NOTREACHED();
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return GetButtonStyle()->text[GTK_STATE_NORMAL];
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Textfield
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TextfieldDefaultColor:
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->text[GTK_STATE_NORMAL];
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TextfieldDefaultBackground:
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->base[GTK_STATE_NORMAL];
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TextfieldReadOnlyColor:
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->text[GTK_STATE_INSENSITIVE];
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TextfieldReadOnlyBackground:
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->base[GTK_STATE_INSENSITIVE];
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TextfieldSelectionColor:
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->text[GTK_STATE_SELECTED];
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kColorId_TextfieldSelectionBackgroundFocused:
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return GetEntryStyle()->base[GTK_STATE_SELECTED];
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Tooltips
2965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case kColorId_TooltipBackground:
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return GetTooltipStyle()->bg[GTK_STATE_NORMAL];
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case kColorId_TooltipText:
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return GetTooltipStyle()->fg[GTK_STATE_NORMAL];
3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Trees and Tables (implemented on GTK using the same class)
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TableBackground:
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TreeBackground:
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return GetTreeStyle()->bg[GTK_STATE_NORMAL];
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TableText:
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TreeText:
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return GetTreeStyle()->text[GTK_STATE_NORMAL];
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TableSelectedText:
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TableSelectedTextUnfocused:
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TreeSelectedText:
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TreeSelectedTextUnfocused:
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return GetTreeStyle()->text[GTK_STATE_SELECTED];
313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TableSelectionBackgroundFocused:
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TableSelectionBackgroundUnfocused:
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TreeSelectionBackgroundFocused:
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TreeSelectionBackgroundUnfocused:
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return GetTreeStyle()->bg[GTK_STATE_SELECTED];
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TreeArrow:
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return GetTreeStyle()->fg[GTK_STATE_NORMAL];
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case kColorId_TableGroupingIndicatorColor:
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return GetTreeStyle()->text_aa[GTK_STATE_NORMAL];
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // Results Table
324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableNormalBackground:
325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GetEntryStyle()->base[GTK_STATE_NORMAL];
326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableHoveredBackground: {
327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GtkStyle* entry_style = GetEntryStyle();
328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GdkAlphaBlend(
329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          entry_style->base[GTK_STATE_NORMAL],
330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          entry_style->base[GTK_STATE_SELECTED], 0x80);
331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableSelectedBackground:
333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GetEntryStyle()->base[GTK_STATE_SELECTED];
334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableNormalText:
335c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableHoveredText:
336c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GetEntryStyle()->text[GTK_STATE_NORMAL];
337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableSelectedText:
338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GetEntryStyle()->text[GTK_STATE_SELECTED];
339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableNormalDimmedText:
340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableHoveredDimmedText: {
341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GtkStyle* entry_style = GetEntryStyle();
342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GdkAlphaBlend(
343c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          entry_style->text[GTK_STATE_NORMAL],
344c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          entry_style->base[GTK_STATE_NORMAL], 0x80);
345c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
346c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableSelectedDimmedText: {
347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GtkStyle* entry_style = GetEntryStyle();
348c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GdkAlphaBlend(
349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          entry_style->text[GTK_STATE_SELECTED],
350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          entry_style->base[GTK_STATE_NORMAL], 0x80);
351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableNormalUrl:
353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableHoveredUrl: {
354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return NormalURLColor(GetEntryStyle()->text[GTK_STATE_NORMAL]);
355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
356c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableSelectedUrl: {
357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GtkStyle* entry_style = GetEntryStyle();
358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return SelectedURLColor(entry_style->text[GTK_STATE_SELECTED],
359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              entry_style->base[GTK_STATE_SELECTED]);
360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableNormalDivider: {
362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GtkStyle* win_style = GetWindowStyle();
363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GdkAlphaBlend(win_style->text[GTK_STATE_NORMAL],
364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           win_style->bg[GTK_STATE_NORMAL], 0x34);
365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableHoveredDivider: {
367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GtkStyle* win_style = GetWindowStyle();
368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GdkAlphaBlend(win_style->text[GTK_STATE_PRELIGHT],
369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           win_style->bg[GTK_STATE_PRELIGHT], 0x34);
370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case kColorId_ResultsTableSelectedDivider: {
372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GtkStyle* win_style = GetWindowStyle();
373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return GdkAlphaBlend(win_style->text[GTK_STATE_SELECTED],
374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           win_style->bg[GTK_STATE_SELECTED], 0x34);
375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case kColorId_NumColors:
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NOTREACHED();
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return SkColorToGdkColor(kInvalidColorIdColor);
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GtkWidget* NativeThemeGtk2::GetRealizedWindow() const {
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!fake_window_) {
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fake_window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL);
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gtk_widget_realize(fake_window_);
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return fake_window_;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GtkStyle* NativeThemeGtk2::GetWindowStyle() const {
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gtk_rc_get_style(GetRealizedWindow());
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GtkStyle* NativeThemeGtk2::GetEntryStyle() const {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!fake_entry_.get()) {
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fake_entry_.Own(gtk_entry_new());
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // The fake entry needs to be in the window so it can be realized so we can
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // use the computed parts of the style.
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gtk_container_add(GTK_CONTAINER(GetRealizedWindow()), fake_entry_.get());
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gtk_widget_realize(fake_entry_.get());
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gtk_rc_get_style(fake_entry_.get());
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GtkStyle* NativeThemeGtk2::GetLabelStyle() const {
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!fake_label_.get())
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fake_label_.Own(gtk_label_new(""));
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gtk_rc_get_style(fake_label_.get());
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GtkStyle* NativeThemeGtk2::GetButtonStyle() const {
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!fake_button_.get())
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fake_button_.Own(gtk_button_new());
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gtk_rc_get_style(fake_button_.get());
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GtkStyle* NativeThemeGtk2::GetTreeStyle() const {
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!fake_tree_.get())
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    fake_tree_.Own(gtk_tree_view_new());
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return gtk_rc_get_style(fake_tree_.get());
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)GtkStyle* NativeThemeGtk2::GetTooltipStyle() const {
431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!fake_tooltip_) {
432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    fake_tooltip_ = gtk_window_new(GTK_WINDOW_TOPLEVEL);
433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gtk_widget_set_name(fake_tooltip_, "gtk-tooltip");
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gtk_widget_realize(fake_tooltip_);
435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return gtk_rc_get_style(fake_tooltip_);
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GtkStyle* NativeThemeGtk2::GetMenuStyle() const {
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!fake_menu_.get())
44103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    fake_menu_.Own(gtk_custom_menu_new());
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gtk_rc_get_style(fake_menu_.get());
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GtkStyle* NativeThemeGtk2::GetMenuItemStyle() const {
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!fake_menu_item_) {
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!fake_menu_.get())
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      fake_menu_.Own(gtk_custom_menu_new());
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    fake_menu_item_ = gtk_custom_menu_item_new();
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gtk_menu_shell_append(GTK_MENU_SHELL(fake_menu_.get()), fake_menu_item_);
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gtk_rc_get_style(fake_menu_item_);
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void NativeThemeGtk2::PaintComboboxArrow(SkCanvas* canvas,
458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                         GtkStateType state,
459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                         const gfx::Rect& rect) const {
460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GdkPixmap* pm = gdk_pixmap_new(gtk_widget_get_window(GetRealizedWindow()),
461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 rect.width(),
462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 rect.height(),
463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 -1);
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Paint the background.
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gtk_paint_flat_box(GetWindowStyle(),
466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     pm,
467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     state,
468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     GTK_SHADOW_NONE,
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     NULL,
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     GetRealizedWindow(),
471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     NULL, 0, 0, rect.width(), rect.height());
472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gtk_paint_arrow(GetWindowStyle(),
473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  pm,
474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  state,
475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  GTK_SHADOW_NONE,
476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  NULL,
477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  GetRealizedWindow(),
478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  NULL,
479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  GTK_ARROW_DOWN,
480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  true,
481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  0, 0, rect.width(), rect.height());
482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GdkPixbuf* pb = gdk_pixbuf_get_from_drawable(NULL,
483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               pm,
484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               gdk_drawable_get_colormap(pm),
485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               0, 0,
486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               0, 0,
487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               rect.width(), rect.height());
488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SkBitmap arrow = GdkPixbufToImageSkia(pb);
489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  canvas->drawBitmap(arrow, rect.x(), rect.y());
490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  g_object_unref(pb);
492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  g_object_unref(pm);
493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace libgtk2ui
496