summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/gtk_theme_provider.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/gtk/gtk_theme_provider.cc')
-rw-r--r--chrome/browser/gtk/gtk_theme_provider.cc59
1 files changed, 40 insertions, 19 deletions
diff --git a/chrome/browser/gtk/gtk_theme_provider.cc b/chrome/browser/gtk/gtk_theme_provider.cc
index a9e331b..4a4075f 100644
--- a/chrome/browser/gtk/gtk_theme_provider.cc
+++ b/chrome/browser/gtk/gtk_theme_provider.cc
@@ -30,6 +30,17 @@ const skia::HSL kExactColor = { -1, -1, -1 };
const skia::HSL kDefaultFrameShift = { -1, -1, 0.4 };
+// Minimum difference between the toolbar and the button color before we try a
+// different color.
+const double kMinimumLuminanceDifference = 0.1;
+
+// Converts a GdkColor to a SkColor.
+SkColor GdkToSkColor(GdkColor* color) {
+ return SkColorSetRGB(color->red >> 8,
+ color->green >> 8,
+ color->blue >> 8);
+}
+
} // namespace
// static
@@ -175,7 +186,9 @@ void GtkThemeProvider::LoadGtkValues() {
GdkColor frame_color = window_style->bg[GTK_STATE_SELECTED];
GdkColor inactive_frame_color = window_style->bg[GTK_STATE_INSENSITIVE];
+ GdkColor toolbar_color = window_style->bg[GTK_STATE_NORMAL];
GdkColor button_color = window_style->bg[GTK_STATE_SELECTED];
+ GdkColor label_color = label_style->text[GTK_STATE_NORMAL];
GtkSettings* settings = gtk_settings_get_default();
bool theme_has_frame_color = false;
@@ -205,28 +218,39 @@ void GtkThemeProvider::LoadGtkValues() {
// color, change the luminosity of the frame color downwards to 80% of what
// it currently is. This is in a futile attempt to match the default
// metacity and xfwm themes.
- SkColor shifted =
- skia::HSLShift(SkColorSetRGB((frame_color.red >> 8),
- (frame_color.green >> 8),
- (frame_color.blue >> 8)),
- kDefaultFrameShift);
+ SkColor shifted = skia::HSLShift(GdkToSkColor(&frame_color),
+ kDefaultFrameShift);
frame_color.pixel = 0;
frame_color.red = SkColorGetR(shifted) * kSkiaToGDKMultiplier;
frame_color.green = SkColorGetG(shifted) * kSkiaToGDKMultiplier;
frame_color.blue = SkColorGetB(shifted) * kSkiaToGDKMultiplier;
}
+ // By default, the button tint color is the background selection color. But
+ // this can be unreadable in some dark themes, so we set a minimum contrast
+ // between the button color and the toolbar color.
+ skia::HSL button_hsl;
+ skia::SkColorToHSL(GdkToSkColor(&button_color), button_hsl);
+ skia::HSL toolbar_hsl;
+ skia::SkColorToHSL(GdkToSkColor(&toolbar_color), toolbar_hsl);
+ double hsl_difference = fabs(button_hsl.l - toolbar_hsl.l);
+ if (hsl_difference <= kMinimumLuminanceDifference) {
+ // Not enough contrast. Try the text color instead.
+ skia::HSL label_hsl;
+ skia::SkColorToHSL(GdkToSkColor(&label_color), label_hsl);
+ double label_difference = fabs(label_hsl.l - toolbar_hsl.l);
+ if (label_difference >= kMinimumLuminanceDifference) {
+ button_color = label_color;
+ }
+ }
+
SetThemeColorFromGtk(kColorFrame, &frame_color);
// Skip COLOR_FRAME_INACTIVE and the incognito colors, as they will be
// autogenerated from tints.
- SetThemeColorFromGtk(kColorToolbar,
- &window_style->bg[GTK_STATE_NORMAL]);
- SetThemeColorFromGtk(kColorTabText,
- &label_style->text[GTK_STATE_NORMAL]);
- SetThemeColorFromGtk(kColorBackgroundTabText,
- &label_style->text[GTK_STATE_NORMAL]);
- SetThemeColorFromGtk(kColorBookmarkText,
- &label_style->text[GTK_STATE_NORMAL]);
+ SetThemeColorFromGtk(kColorToolbar, &toolbar_color);
+ SetThemeColorFromGtk(kColorTabText, &label_color);
+ SetThemeColorFromGtk(kColorBackgroundTabText, &label_color);
+ SetThemeColorFromGtk(kColorBookmarkText, &label_color);
SetThemeColorFromGtk(kColorControlBackground,
&window_style->bg[GTK_STATE_NORMAL]);
SetThemeColorFromGtk(kColorButtonBackground,
@@ -257,17 +281,14 @@ void GtkThemeProvider::LoadGtkValues() {
}
void GtkThemeProvider::SetThemeColorFromGtk(const char* id, GdkColor* color) {
- SetColor(id, SkColorSetRGB(color->red >> 8,
- color->green >> 8,
- color->blue >> 8));
+ SetColor(id, GdkToSkColor(color));
}
void GtkThemeProvider::SetThemeTintFromGtk(const char* id, GdkColor* color,
const skia::HSL& default_tint) {
skia::HSL hsl;
- skia::SkColorToHSL(SkColorSetRGB((color->red >> 8),
- (color->green >> 8),
- (color->blue >> 8)), hsl);
+ skia::SkColorToHSL(GdkToSkColor(color), hsl);
+
if (default_tint.s != -1)
hsl.s = default_tint.s;