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

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

Issue 2585893002: Gtk3: Fix various menu colors (Closed)
Patch Set: Created 4 years 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/native_theme_gtk3.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/libgtkui/native_theme_gtk3.cc
diff --git a/chrome/browser/ui/libgtkui/native_theme_gtk3.cc b/chrome/browser/ui/libgtkui/native_theme_gtk3.cc
index 5ca122f4f5b57c3f23f0db4740bdc01b2583ea38..8e5eba027bbabfd083c1dd8f548514d8f6d61b83 100644
--- a/chrome/browser/ui/libgtkui/native_theme_gtk3.cc
+++ b/chrome/browser/ui/libgtkui/native_theme_gtk3.cc
@@ -35,35 +35,75 @@ const GtkStateFlags stateMap[] = {
GTK_STATE_FLAG_INSENSITIVE,
};
+// The caller must g_object_unref the returned context.
+GtkStyleContext* GetStyleContextFromCss(const char* css_selector) {
+ GtkWidgetPath* path = gtk_widget_path_new();
+ for (const auto& widget_type :
+ base::SplitString(css_selector, base::kWhitespaceASCII,
+ base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
+ gtk_widget_path_append_type(path, G_TYPE_NONE);
+ for (const auto& widget_class :
+ base::SplitString(widget_type, ".", base::TRIM_WHITESPACE,
+ base::SPLIT_WANT_NONEMPTY)) {
+ gtk_widget_path_iter_add_class(path, -1, widget_class.c_str());
+ }
+ }
+
+ GtkStyleContext* context = gtk_style_context_new();
+ gtk_style_context_set_path(context, path);
+ gtk_widget_path_unref(path);
+ return context;
+}
+
+SkColor GdkRgbaToSkColor(const GdkRGBA& color) {
+ return SkColorSetARGB(color.alpha * 255, color.red * 255, color.green * 255,
+ color.blue * 255);
+}
+
+SkColor ColorFromContext(GtkStyleContext* context,
+ GtkStateFlags state,
+ const char* color_name) {
+ GdkRGBA* color = nullptr;
+ gtk_style_context_get(context, state, color_name, &color, nullptr);
+ DCHECK(color);
+ SkColor sk_color = GdkRgbaToSkColor(*color);
+ gdk_rgba_free(color);
+ return sk_color;
+}
+
SkColor GetFGColor(GtkWidget* widget, WidgetState state) {
- GdkRGBA color;
- gtk_style_context_get_color(gtk_widget_get_style_context(widget),
- stateMap[state], &color);
- return SkColorSetRGB(color.red * 255, color.green * 255, color.blue * 255);
+ return ColorFromContext(gtk_widget_get_style_context(widget), stateMap[state],
+ "color");
}
+
SkColor GetBGColor(GtkWidget* widget, WidgetState state) {
- GdkRGBA color;
-
- G_GNUC_BEGIN_IGNORE_DEPRECATIONS
- gtk_style_context_get_background_color(gtk_widget_get_style_context(widget),
- stateMap[state], &color);
- G_GNUC_END_IGNORE_DEPRECATIONS
-
- // Hack for default color
- if (color.alpha == 0.0)
- color = {1, 1, 1, 1};
-
- return SkColorSetRGB(color.red * 255, color.green * 255, color.blue * 255);
+ return ColorFromContext(gtk_widget_get_style_context(widget), stateMap[state],
+ "background-color");
}
-SkColor GetTextColor(GtkWidget* widget, WidgetState state) {
- return GetFGColor(widget, state);
+SkColor GetFGColor(const char* css_selector, GtkStateFlags state) {
Elliot Glaysher 2016/12/16 21:55:59 Do you plan on having two GetFBColor functions ove
Tom (Use chromium acct) 2016/12/16 22:01:07 Just temporary during the conversion
+ GtkStyleContext* context = GetStyleContextFromCss(css_selector);
+ SkColor color = ColorFromContext(context, state, "color");
+ g_object_unref(context);
+ return color;
}
-SkColor GetTextAAColor(GtkWidget* widget, WidgetState state) {
- return GetFGColor(widget, state);
+
+SkColor GetBGColor(const char* css_selector, GtkStateFlags state) {
+ GtkStyleContext* context = GetStyleContextFromCss(css_selector);
+ SkColor color = ColorFromContext(context, state, "background-color");
+ g_object_unref(context);
+ return color;
}
-SkColor GetBaseColor(GtkWidget* widget, WidgetState state) {
- return GetBGColor(widget, state);
+
+SkColor GetBorderColor(const char* css_selector, GtkStateFlags state) {
+ GtkStyleContext* context = GetStyleContextFromCss(css_selector);
+ GtkBorder border;
+ gtk_style_context_get_border(context, state, &border);
+ bool has_border = border.left || border.right || border.top || border.bottom;
+ SkColor color = ColorFromContext(
+ context, state, has_border ? "border-color" : "background-color");
+ g_object_unref(context);
+ return color;
}
void PaintWidget(SkCanvas* canvas,
@@ -80,20 +120,7 @@ void PaintWidget(SkCanvas* canvas,
cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, rect.width()));
cairo_t* cr = cairo_create(surface);
- GtkWidgetPath* path = gtk_widget_path_new();
- for (const auto& widget_type :
- base::SplitString(css_selector, base::kWhitespaceASCII,
- base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
- gtk_widget_path_append_type(path, G_TYPE_NONE);
- for (const auto& widget_class :
- base::SplitString(widget_type, ".", base::TRIM_WHITESPACE,
- base::SPLIT_WANT_NONEMPTY)) {
- gtk_widget_path_iter_add_class(path, -1, widget_class.c_str());
- }
- }
-
- GtkStyleContext* context = gtk_style_context_new();
- gtk_style_context_set_path(context, path);
+ GtkStyleContext* context = GetStyleContextFromCss(css_selector);
gtk_style_context_set_state(context, state);
gtk_render_background(context, cr, 0, 0, rect.width(), rect.height());
@@ -103,7 +130,6 @@ void PaintWidget(SkCanvas* canvas,
canvas->drawBitmap(bitmap, rect.x(), rect.y());
g_object_unref(context);
- gtk_widget_path_unref(path);
}
GtkStateFlags StateToStateFlags(NativeThemeGtk3::State state) {
@@ -136,7 +162,7 @@ NativeThemeGtk3::NativeThemeGtk3() {}
// This doesn't actually get called
NativeThemeGtk3::~NativeThemeGtk3() {}
-SkColor NativeThemeGtk3::GetSystemColor(ColorId color_id) const {
+SkColor NativeThemeGtk3::LookupGtkThemeColor(ColorId color_id) const {
const SkColor kPositiveTextColor = SkColorSetRGB(0x0b, 0x80, 0x43);
const SkColor kNegativeTextColor = SkColorSetRGB(0xc5, 0x39, 0x29);
@@ -154,39 +180,37 @@ SkColor NativeThemeGtk3::GetSystemColor(ColorId color_id) const {
case kColorId_FocusedBorderColor:
return GetBGColor(GetEntry(), SELECTED);
case kColorId_UnfocusedBorderColor:
- return GetTextAAColor(GetEntry(), NORMAL);
+ return GetFGColor(GetEntry(), NORMAL);
- // MenuItem
- case kColorId_SelectedMenuItemForegroundColor:
- return GetTextColor(GetMenuItem(), SELECTED);
+ // Menu
+ case kColorId_MenuBackgroundColor:
+ return GetBGColor("menu", GTK_STATE_FLAG_NORMAL);
+ case kColorId_MenuBorderColor:
+ return GetBorderColor("menu", GTK_STATE_FLAG_NORMAL);
case kColorId_FocusedMenuItemBackgroundColor:
- return GetBGColor(GetMenuItem(), SELECTED);
-
+ return GetBGColor("menu menuitem", GTK_STATE_FLAG_FOCUSED);
case kColorId_EnabledMenuItemForegroundColor:
- return GetTextColor(GetMenuItem(), NORMAL);
+ return GetFGColor("menu menuitem label", GTK_STATE_FLAG_NORMAL);
+ case kColorId_SelectedMenuItemForegroundColor:
+ return GetFGColor("menu menuitem label", GTK_STATE_FLAG_SELECTED);
case kColorId_DisabledMenuItemForegroundColor:
- return GetTextColor(GetMenuItem(), INSENSITIVE);
+ return GetFGColor("menu menuitem label", GTK_STATE_FLAG_INSENSITIVE);
+ case kColorId_MenuSeparatorColor:
+ // MenuButton borders are used the same way as menu separtors in Chrome.
+ case kColorId_EnabledMenuButtonBorderColor:
case kColorId_FocusedMenuButtonBorderColor:
- return GetBGColor(GetEntry(), NORMAL);
case kColorId_HoverMenuButtonBorderColor:
- return GetTextAAColor(GetEntry(), PRELIGHT);
- case kColorId_MenuBorderColor:
- case kColorId_EnabledMenuButtonBorderColor:
- case kColorId_MenuSeparatorColor: {
- return GetTextColor(GetMenuItem(), INSENSITIVE);
- }
- case kColorId_MenuBackgroundColor:
- return GetBGColor(GetMenu(), NORMAL);
+ return GetFGColor("menu menuitem.separator", GTK_STATE_FLAG_INSENSITIVE);
// Label
case kColorId_LabelEnabledColor:
- return GetTextColor(GetEntry(), NORMAL);
+ return GetFGColor(GetEntry(), NORMAL);
case kColorId_LabelDisabledColor:
- return GetTextColor(GetLabel(), INSENSITIVE);
+ return GetFGColor(GetLabel(), INSENSITIVE);
case kColorId_LabelTextSelectionColor:
- return GetTextColor(GetLabel(), SELECTED);
+ return GetFGColor(GetLabel(), SELECTED);
case kColorId_LabelTextSelectionBackgroundFocused:
- return GetBaseColor(GetLabel(), SELECTED);
+ return GetBGColor(GetLabel(), SELECTED);
// Link
case kColorId_LinkDisabled:
@@ -209,42 +233,42 @@ SkColor NativeThemeGtk3::GetSystemColor(ColorId color_id) const {
// Button
case kColorId_ButtonEnabledColor:
- return GetTextColor(GetButton(), NORMAL);
+ return GetFGColor(GetButton(), NORMAL);
case kColorId_BlueButtonEnabledColor:
- return GetTextColor(GetBlueButton(), NORMAL);
+ return GetFGColor(GetBlueButton(), NORMAL);
case kColorId_ButtonDisabledColor:
- return GetTextColor(GetButton(), INSENSITIVE);
+ return GetFGColor(GetButton(), INSENSITIVE);
case kColorId_BlueButtonDisabledColor:
- return GetTextColor(GetBlueButton(), INSENSITIVE);
+ return GetFGColor(GetBlueButton(), INSENSITIVE);
case kColorId_ButtonHoverColor:
- return GetTextColor(GetButton(), PRELIGHT);
+ return GetFGColor(GetButton(), PRELIGHT);
case kColorId_BlueButtonHoverColor:
- return GetTextColor(GetBlueButton(), PRELIGHT);
+ return GetFGColor(GetBlueButton(), PRELIGHT);
case kColorId_BlueButtonPressedColor:
- return GetTextColor(GetBlueButton(), ACTIVE);
+ return GetFGColor(GetBlueButton(), ACTIVE);
case kColorId_BlueButtonShadowColor:
return SK_ColorTRANSPARENT;
case kColorId_ProminentButtonColor:
return GetSystemColor(kColorId_LinkEnabled);
case kColorId_TextOnProminentButtonColor:
- return GetTextColor(GetLabel(), SELECTED);
+ return GetFGColor(GetLabel(), SELECTED);
case kColorId_ButtonPressedShade:
return SK_ColorTRANSPARENT;
// Textfield
case kColorId_TextfieldDefaultColor:
- return GetTextColor(GetEntry(), NORMAL);
+ return GetFGColor(GetEntry(), NORMAL);
case kColorId_TextfieldDefaultBackground:
- return GetBaseColor(GetEntry(), NORMAL);
+ return GetBGColor(GetEntry(), NORMAL);
case kColorId_TextfieldReadOnlyColor:
- return GetTextColor(GetEntry(), SELECTED);
+ return GetFGColor(GetEntry(), SELECTED);
case kColorId_TextfieldReadOnlyBackground:
- return GetBaseColor(GetEntry(), SELECTED);
+ return GetBGColor(GetEntry(), SELECTED);
case kColorId_TextfieldSelectionColor:
- return GetTextColor(GetLabel(), SELECTED);
+ return GetFGColor(GetLabel(), SELECTED);
case kColorId_TextfieldSelectionBackgroundFocused:
- return GetBaseColor(GetLabel(), SELECTED);
+ return GetBGColor(GetLabel(), SELECTED);
// Tooltips
case kColorId_TooltipBackground:
@@ -258,12 +282,12 @@ SkColor NativeThemeGtk3::GetSystemColor(ColorId color_id) const {
return GetBGColor(GetTree(), NORMAL);
case kColorId_TableText:
case kColorId_TreeText:
- return GetTextColor(GetTree(), NORMAL);
+ return GetFGColor(GetTree(), NORMAL);
case kColorId_TableSelectedText:
case kColorId_TableSelectedTextUnfocused:
case kColorId_TreeSelectedText:
case kColorId_TreeSelectedTextUnfocused:
- return GetTextColor(GetTree(), SELECTED);
+ return GetFGColor(GetTree(), SELECTED);
case kColorId_TableSelectionBackgroundFocused:
case kColorId_TableSelectionBackgroundUnfocused:
case kColorId_TreeSelectionBackgroundFocused:
@@ -272,7 +296,7 @@ SkColor NativeThemeGtk3::GetSystemColor(ColorId color_id) const {
case kColorId_TreeArrow:
return GetFGColor(GetTree(), NORMAL);
case kColorId_TableGroupingIndicatorColor:
- return GetTextAAColor(GetTree(), NORMAL);
+ return GetFGColor(GetTree(), NORMAL);
// Results Table
case kColorId_ResultsTableNormalBackground:
@@ -306,30 +330,24 @@ SkColor NativeThemeGtk3::GetSystemColor(ColorId color_id) const {
GetSystemColor(kColorId_TextfieldSelectionColor),
GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused));
- case kColorId_ResultsTablePositiveText: {
+ case kColorId_ResultsTablePositiveText:
return color_utils::GetReadableColor(kPositiveTextColor,
- GetBaseColor(GetEntry(), NORMAL));
- }
- case kColorId_ResultsTablePositiveHoveredText: {
+ GetBGColor(GetEntry(), NORMAL));
+ case kColorId_ResultsTablePositiveHoveredText:
return color_utils::GetReadableColor(kPositiveTextColor,
- GetBaseColor(GetEntry(), PRELIGHT));
- }
- case kColorId_ResultsTablePositiveSelectedText: {
+ GetBGColor(GetEntry(), PRELIGHT));
+ case kColorId_ResultsTablePositiveSelectedText:
return color_utils::GetReadableColor(kPositiveTextColor,
- GetBaseColor(GetEntry(), SELECTED));
- }
- case kColorId_ResultsTableNegativeText: {
+ GetBGColor(GetEntry(), SELECTED));
+ case kColorId_ResultsTableNegativeText:
return color_utils::GetReadableColor(kNegativeTextColor,
- GetBaseColor(GetEntry(), NORMAL));
- }
- case kColorId_ResultsTableNegativeHoveredText: {
+ GetBGColor(GetEntry(), NORMAL));
+ case kColorId_ResultsTableNegativeHoveredText:
return color_utils::GetReadableColor(kNegativeTextColor,
- GetBaseColor(GetEntry(), PRELIGHT));
- }
- case kColorId_ResultsTableNegativeSelectedText: {
+ GetBGColor(GetEntry(), PRELIGHT));
+ case kColorId_ResultsTableNegativeSelectedText:
return color_utils::GetReadableColor(kNegativeTextColor,
- GetBaseColor(GetEntry(), SELECTED));
- }
+ GetBGColor(GetEntry(), SELECTED));
// Throbber
case kColorId_ThrobberSpinningColor:
@@ -345,13 +363,8 @@ SkColor NativeThemeGtk3::GetSystemColor(ColorId color_id) const {
// Just fall back to the same colors as Aura.
case kColorId_AlertSeverityLow:
case kColorId_AlertSeverityMedium:
- case kColorId_AlertSeverityHigh: {
- ui::NativeTheme* fallback_theme =
- color_utils::IsDark(GetTextColor(GetEntry(), NORMAL))
- ? ui::NativeTheme::GetInstanceForNativeUi()
- : ui::NativeThemeDarkAura::instance();
- return fallback_theme->GetSystemColor(color_id);
- }
+ case kColorId_AlertSeverityHigh:
+ return SK_ColorTRANSPARENT;
case kColorId_NumColors:
NOTREACHED();
@@ -361,6 +374,19 @@ SkColor NativeThemeGtk3::GetSystemColor(ColorId color_id) const {
return kInvalidColorIdColor;
}
+SkColor NativeThemeGtk3::GetSystemColor(ColorId color_id) const {
+ SkColor color = LookupGtkThemeColor(color_id);
+ if (SkColorGetA(color))
+ return color;
+ gboolean prefer_dark_theme = FALSE;
+ g_object_get(gtk_settings_get_default(), "gtk-application-prefer-dark-theme",
+ &prefer_dark_theme, nullptr);
+ ui::NativeTheme* fallback_theme =
+ prefer_dark_theme ? ui::NativeThemeDarkAura::instance()
+ : ui::NativeTheme::GetInstanceForNativeUi();
+ return fallback_theme->GetSystemColor(color_id);
+}
+
void NativeThemeGtk3::PaintMenuPopupBackground(
SkCanvas* canvas,
const gfx::Size& size,
« no previous file with comments | « chrome/browser/ui/libgtkui/native_theme_gtk3.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698