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

Unified Diff: chrome/browser/ui/libgtkui/gtk_ui.cc

Issue 2701923002: Gtk3: Fix tab border color and --secondary-ui-md colors (Closed)
Patch Set: Move lambda to function in anonymous namespace Created 3 years, 10 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/ui/libgtkui/gtk_ui.h ('k') | chrome/browser/ui/libgtkui/native_theme_gtk3.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/libgtkui/gtk_ui.cc
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc
index cc35427af7dde23b9eb11e4b88504c18403e6448..02add34d434f5541555b4e3c4a4488f9423aa5a0 100644
--- a/chrome/browser/ui/libgtkui/gtk_ui.cc
+++ b/chrome/browser/ui/libgtkui/gtk_ui.cc
@@ -379,6 +379,59 @@ views::LinuxUI::NonClientMiddleClickAction GetDefaultMiddleClickAction() {
}
}
+#if GTK_MAJOR_VERSION > 2
+// COLOR_TOOLBAR_TOP_SEPARATOR represents the border between tabs and the
+// frame, as well as the border between tabs and the toolbar. For this
+// reason, it is difficult to calculate the One True Color that works well on
+// all themes and is opaque. However, we can cheat to get a good color that
+// works well for both borders. The idea is we have two variables: alpha and
+// lightness. And we have two constraints (on lightness):
+// 1. the border color, when painted on |header_bg|, should give |header_fg|
+// 2. the border color, when painted on |toolbar_bg|, should give |toolbar_fg|
+// This gives the equations:
+// alpha*lightness + (1 - alpha)*header_bg = header_fg
+// alpha*lightness + (1 - alpha)*toolbar_bg = toolbar_fg
+// The algorithm below is just a result of solving those equations for alpha
+// and lightness. If a problem is encountered, like division by zero, or
+// |a| or |l| not in [0, 1], then fallback on |header_fg| or |toolbar_fg|.
+SkColor GetToolbarTopSeparatorColor(SkColor header_fg,
+ SkColor header_bg,
+ SkColor toolbar_fg,
+ SkColor toolbar_bg) {
+ using namespace color_utils;
+
+ SkColor default_color = SkColorGetA(header_fg) ? header_fg : toolbar_fg;
+ if (!SkColorGetA(default_color))
+ return SK_ColorTRANSPARENT;
+
+ auto get_lightness = [](SkColor color) {
+ HSL hsl;
+ SkColorToHSL(color, &hsl);
+ return hsl.l;
+ };
+
+ double f1 = get_lightness(GetResultingPaintColor(header_fg, header_bg));
+ double b1 = get_lightness(header_bg);
+ double f2 = get_lightness(GetResultingPaintColor(toolbar_fg, toolbar_bg));
+ double b2 = get_lightness(toolbar_bg);
+
+ if (b1 == b2)
+ return default_color;
+ double a = (f1 - f2 - b1 + b2) / (b2 - b1);
+ if (a == 0)
+ return default_color;
+ double l = (f1 - (1 - a) * b1) / a;
+ if (a < 0 || a > 1 || l < 0 || l > 1)
+ return default_color;
+ // Take the hue and saturation from |default_color|, but use the
+ // calculated lightness.
+ HSL border;
+ SkColorToHSL(default_color, &border);
+ border.l = l;
+ return HSLToSkColor(border, a * 0xff);
+}
+#endif
+
} // namespace
GtkUi::GtkUi() : middle_click_action_(GetDefaultMiddleClickAction()) {
@@ -768,9 +821,29 @@ void GtkUi::LoadGtkValues() {
UpdateDeviceScaleFactor();
UpdateCursorTheme();
- BuildFrameColors();
-
#if GTK_MAJOR_VERSION == 2
+ const color_utils::HSL kDefaultFrameShift = {-1, -1, 0.4};
+ SkColor frame_color =
+ native_theme_->GetSystemColor(ui::NativeTheme::kColorId_WindowBackground);
+ frame_color = color_utils::HSLShift(frame_color, kDefaultFrameShift);
+ GetChromeStyleColor("frame-color", &frame_color);
+ colors_[ThemeProperties::COLOR_FRAME] = frame_color;
+
+ GtkStyle* style = gtk_rc_get_style(fake_window_);
+ SkColor temp_color = color_utils::HSLShift(
+ GdkColorToSkColor(style->bg[GTK_STATE_INSENSITIVE]), kDefaultFrameShift);
+ GetChromeStyleColor("inactive-frame-color", &temp_color);
+ colors_[ThemeProperties::COLOR_FRAME_INACTIVE] = temp_color;
+
+ temp_color = color_utils::HSLShift(frame_color, kDefaultTintFrameIncognito);
+ GetChromeStyleColor("incognito-frame-color", &temp_color);
+ colors_[ThemeProperties::COLOR_FRAME_INCOGNITO] = temp_color;
+
+ temp_color =
+ color_utils::HSLShift(frame_color, kDefaultTintFrameIncognitoInactive);
+ GetChromeStyleColor("incognito-inactive-frame-color", &temp_color);
+ colors_[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] = temp_color;
+
SkColor toolbar_color =
native_theme_->GetSystemColor(ui::NativeTheme::kColorId_DialogBackground);
SkColor label_color = native_theme_->GetSystemColor(
@@ -808,6 +881,16 @@ void GtkUi::LoadGtkValues() {
colors_[ThemeProperties::COLOR_NTP_HEADER] =
colors_[ThemeProperties::COLOR_FRAME];
#else
+ SkColor frame_color = GetBgColor("#headerbar.header-bar.titlebar");
+ SkColor frame_color_inactive =
+ GetBgColor("#headerbar.header-bar.titlebar:backdrop");
+ colors_[ThemeProperties::COLOR_FRAME] = frame_color;
+ colors_[ThemeProperties::COLOR_FRAME_INACTIVE] = frame_color_inactive;
+ colors_[ThemeProperties::COLOR_FRAME_INCOGNITO] =
+ color_utils::HSLShift(frame_color, kDefaultTintFrameIncognito);
+ colors_[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] =
+ color_utils::HSLShift(frame_color_inactive, kDefaultTintFrameIncognito);
+
SkColor toolbar_color = GetBgColor("GtkToolbar#toolbar");
SkColor toolbar_text_color = color_utils::GetReadableColor(
GetFgColor("GtkToolbar#toolbar GtkLabel#label"),
@@ -824,50 +907,54 @@ void GtkUi::LoadGtkValues() {
SkColor location_bar_border =
GetBorderColor("GtkToolbar#toolbar GtkEntry#entry");
- if (SkColorGetA(location_bar_border)) {
+ if (SkColorGetA(location_bar_border))
colors_[ThemeProperties::COLOR_LOCATION_BAR_BORDER] = location_bar_border;
- }
- inactive_selection_bg_color_ = GetSelectedBgColor("GtkEntry#entry:backdrop");
+ inactive_selection_bg_color_ =
+ GetSelectedBgColor("GtkTextView#textview.view:backdrop");
inactive_selection_fg_color_ =
- GetSelectedTextColor("GtkEntry#entry:backdrop");
+ GetSelectedTextColor("GtkTextView#textview.view:backdrop");
- SkColor toolbar_separator_horizontal =
- GetSeparatorColor("GtkToolbar#toolbar GtkSeparator#separator.horizontal");
- SkColor toolbar_separator_vertical =
- GetSeparatorColor("GtkToolbar#toolbar GtkSeparator#separator.vertical");
+ SkColor toolbar_button_border =
+ GetBorderColor("GtkToolbar#toolbar GtkButton#button");
colors_[ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_BACKGROUND] =
toolbar_color;
colors_[ThemeProperties::COLOR_BOOKMARK_BAR_INSTRUCTIONS_TEXT] =
toolbar_text_color;
// Separates the toolbar from the bookmark bar or butter bars.
colors_[ThemeProperties::COLOR_TOOLBAR_BOTTOM_SEPARATOR] =
- toolbar_separator_horizontal;
+ toolbar_button_border;
// Separates entries in the downloads bar.
colors_[ThemeProperties::COLOR_TOOLBAR_VERTICAL_SEPARATOR] =
- toolbar_separator_vertical;
+ toolbar_button_border;
// Separates the bookmark bar from the web content.
colors_[ThemeProperties::COLOR_DETACHED_BOOKMARK_BAR_SEPARATOR] =
- toolbar_separator_horizontal;
+ toolbar_button_border;
// These colors represent the border drawn around tabs and between
// the tabstrip and toolbar.
- SkColor header_button_border =
- GetBorderColor("#headerbar.header-bar.titlebar GtkButton#button");
- SkColor header_button_inactive_border = GetBorderColor(
- "#headerbar.header-bar.titlebar:backdrop GtkButton#button");
+ SkColor toolbar_top_separator = GetToolbarTopSeparatorColor(
+ GetBorderColor("#headerbar.header-bar.titlebar GtkButton#button"),
+ frame_color, toolbar_button_border, toolbar_color);
+ SkColor toolbar_top_separator_inactive = GetToolbarTopSeparatorColor(
+ GetBorderColor(
+ "#headerbar.header-bar.titlebar:backdrop GtkButton#button"),
+ frame_color_inactive, toolbar_button_border, toolbar_color);
// Unlike with toolbars, we always want a border around tabs, so let
// ThemeService choose the border color if the theme doesn't provide one.
- if (SkColorGetA(header_button_border) &&
- SkColorGetA(header_button_inactive_border)) {
+ if (SkColorGetA(toolbar_top_separator) &&
+ SkColorGetA(toolbar_top_separator_inactive)) {
colors_[ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR] =
- header_button_border;
+ toolbar_top_separator;
colors_[ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR_INACTIVE] =
- header_button_inactive_border;
+ toolbar_top_separator_inactive;
}
- colors_[ThemeProperties::COLOR_NTP_BACKGROUND] = GetBgColor("GtkEntry#entry");
- colors_[ThemeProperties::COLOR_NTP_TEXT] = GetFgColor("GtkEntry#entry");
+ colors_[ThemeProperties::COLOR_NTP_BACKGROUND] =
+ native_theme_->GetSystemColor(
+ ui::NativeTheme::kColorId_TextfieldDefaultBackground);
+ colors_[ThemeProperties::COLOR_NTP_TEXT] = native_theme_->GetSystemColor(
+ ui::NativeTheme::kColorId_TextfieldDefaultColor);
colors_[ThemeProperties::COLOR_NTP_HEADER] =
GetBorderColor("GtkButton#button");
#endif
@@ -880,8 +967,8 @@ void GtkUi::LoadGtkValues() {
// Generate the colors that we pass to WebKit.
SetScrollbarColors();
- focus_ring_color_ =
- native_theme_->GetSystemColor(ui::NativeTheme::kColorId_LinkEnabled);
+ focus_ring_color_ = native_theme_->GetSystemColor(
+ ui::NativeTheme::kColorId_FocusedBorderColor);
// Some GTK themes only define the text selection colors on the GtkEntry
// class, so we need to use that for getting selection colors.
@@ -890,12 +977,14 @@ void GtkUi::LoadGtkValues() {
active_selection_fg_color_ = native_theme_->GetSystemColor(
ui::NativeTheme::kColorId_TextfieldSelectionColor);
+ SkColor throbber_spinning = native_theme_->GetSystemColor(
+ ui::NativeTheme::kColorId_ThrobberSpinningColor);
colors_[ThemeProperties::COLOR_TAB_THROBBER_SPINNING] =
- native_theme_->GetSystemColor(
- ui::NativeTheme::kColorId_ThrobberSpinningColor);
+ color_utils::GetReadableColor(throbber_spinning, toolbar_color);
+ SkColor throbber_waiting = native_theme_->GetSystemColor(
+ ui::NativeTheme::kColorId_ThrobberWaitingColor);
colors_[ThemeProperties::COLOR_TAB_THROBBER_WAITING] =
- native_theme_->GetSystemColor(
- ui::NativeTheme::kColorId_ThrobberWaitingColor);
+ color_utils::GetReadableColor(throbber_waiting, toolbar_color);
}
void GtkUi::UpdateCursorTheme() {
@@ -914,42 +1003,6 @@ void GtkUi::UpdateCursorTheme() {
g_free(theme);
}
-void GtkUi::BuildFrameColors() {
-#if GTK_MAJOR_VERSION == 2
- const color_utils::HSL kDefaultFrameShift = {-1, -1, 0.4};
- SkColor frame_color =
- native_theme_->GetSystemColor(ui::NativeTheme::kColorId_WindowBackground);
- frame_color = color_utils::HSLShift(frame_color, kDefaultFrameShift);
- GetChromeStyleColor("frame-color", &frame_color);
- colors_[ThemeProperties::COLOR_FRAME] = frame_color;
-
- GtkStyle* style = gtk_rc_get_style(fake_window_);
- SkColor temp_color = color_utils::HSLShift(
- GdkColorToSkColor(style->bg[GTK_STATE_INSENSITIVE]), kDefaultFrameShift);
- GetChromeStyleColor("inactive-frame-color", &temp_color);
- colors_[ThemeProperties::COLOR_FRAME_INACTIVE] = temp_color;
-
- temp_color = color_utils::HSLShift(frame_color, kDefaultTintFrameIncognito);
- GetChromeStyleColor("incognito-frame-color", &temp_color);
- colors_[ThemeProperties::COLOR_FRAME_INCOGNITO] = temp_color;
-
- temp_color =
- color_utils::HSLShift(frame_color, kDefaultTintFrameIncognitoInactive);
- GetChromeStyleColor("incognito-inactive-frame-color", &temp_color);
- colors_[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] = temp_color;
-#else
- SkColor color_frame = GetBgColor("#headerbar.header-bar.titlebar");
- SkColor color_frame_inactive =
- GetBgColor("#headerbar.header-bar.titlebar:backdrop");
- colors_[ThemeProperties::COLOR_FRAME] = color_frame;
- colors_[ThemeProperties::COLOR_FRAME_INACTIVE] = color_frame_inactive;
- colors_[ThemeProperties::COLOR_FRAME_INCOGNITO] =
- color_utils::HSLShift(color_frame, kDefaultTintFrameIncognito);
- colors_[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] =
- color_utils::HSLShift(color_frame_inactive, kDefaultTintFrameIncognito);
-#endif
-}
-
void GtkUi::UpdateDefaultFont() {
GtkWidget* fake_label = gtk_label_new(nullptr);
g_object_ref_sink(fake_label); // Remove the floating reference.
« no previous file with comments | « chrome/browser/ui/libgtkui/gtk_ui.h ('k') | chrome/browser/ui/libgtkui/native_theme_gtk3.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698