OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/libgtkui/native_theme_gtk2.h" | 5 #include "chrome/browser/ui/libgtkui/native_theme_gtk.h" |
6 | 6 |
7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
8 | 8 |
9 #include "chrome/browser/ui/libgtkui/chrome_gtk_frame.h" | 9 #include "chrome/browser/ui/libgtkui/chrome_gtk_frame.h" |
10 #include "chrome/browser/ui/libgtkui/chrome_gtk_menu_subclasses.h" | 10 #include "chrome/browser/ui/libgtkui/chrome_gtk_menu_subclasses.h" |
11 #include "chrome/browser/ui/libgtkui/gtk2_ui.h" | 11 #include "chrome/browser/ui/libgtkui/gtk_ui.h" |
12 #include "chrome/browser/ui/libgtkui/gtk2_util.h" | 12 #include "chrome/browser/ui/libgtkui/gtk_util.h" |
13 #include "chrome/browser/ui/libgtkui/skia_utils_gtk2.h" | 13 #include "chrome/browser/ui/libgtkui/skia_utils_gtk.h" |
14 #include "third_party/skia/include/core/SkColor.h" | 14 #include "third_party/skia/include/core/SkColor.h" |
15 #include "ui/gfx/color_palette.h" | 15 #include "ui/gfx/color_palette.h" |
16 #include "ui/gfx/color_utils.h" | 16 #include "ui/gfx/color_utils.h" |
17 #include "ui/gfx/geometry/rect.h" | 17 #include "ui/gfx/geometry/rect.h" |
18 #include "ui/gfx/geometry/size.h" | 18 #include "ui/gfx/geometry/size.h" |
19 #include "ui/gfx/path.h" | 19 #include "ui/gfx/path.h" |
20 #include "ui/gfx/skia_util.h" | 20 #include "ui/gfx/skia_util.h" |
21 #include "ui/native_theme/common_theme.h" | 21 #include "ui/native_theme/common_theme.h" |
22 #include "ui/native_theme/native_theme_aura.h" | 22 #include "ui/native_theme/native_theme_aura.h" |
23 #include "ui/native_theme/native_theme_dark_aura.h" | 23 #include "ui/native_theme/native_theme_dark_aura.h" |
(...skipping 20 matching lines...) Expand all Loading... |
44 double s = std::max(0.5, fg_hsl.s); | 44 double s = std::max(0.5, fg_hsl.s); |
45 | 45 |
46 // Make sure the luminance is at least as bright as the |kURLTextColor| green | 46 // Make sure the luminance is at least as bright as the |kURLTextColor| green |
47 // would be if we were to use that. | 47 // would be if we were to use that. |
48 double l; | 48 double l; |
49 if (fg_hsl.l < hue_hsl.l) | 49 if (fg_hsl.l < hue_hsl.l) |
50 l = hue_hsl.l; | 50 l = hue_hsl.l; |
51 else | 51 else |
52 l = (fg_hsl.l + hue_hsl.l) / 2; | 52 l = (fg_hsl.l + hue_hsl.l) / 2; |
53 | 53 |
54 color_utils::HSL output = { hue_hsl.h, s, l }; | 54 color_utils::HSL output = {hue_hsl.h, s, l}; |
55 return color_utils::HSLToSkColor(output, 255); | 55 return color_utils::HSLToSkColor(output, 255); |
56 } | 56 } |
57 | 57 |
58 // Generates the selected URL color, a green color used on URL text in the | 58 // Generates the selected URL color, a green color used on URL text in the |
59 // currently highlighted entry in the autocomplete popup. It's a mix of | 59 // currently highlighted entry in the autocomplete popup. It's a mix of |
60 // |kURLTextColor|, the current text color, and the background color (the | 60 // |kURLTextColor|, the current text color, and the background color (the |
61 // select highlight). It is more important to contrast with the background | 61 // select highlight). It is more important to contrast with the background |
62 // saturation than to look exactly like the foreground color. | 62 // saturation than to look exactly like the foreground color. |
63 SkColor SelectedURLColor(SkColor foreground, SkColor background) { | 63 SkColor SelectedURLColor(SkColor foreground, SkColor background) { |
64 color_utils::HSL fg_hsl, bg_hsl, hue_hsl; | 64 color_utils::HSL fg_hsl, bg_hsl, hue_hsl; |
65 color_utils::SkColorToHSL(foreground, &fg_hsl); | 65 color_utils::SkColorToHSL(foreground, &fg_hsl); |
66 color_utils::SkColorToHSL(background, &bg_hsl); | 66 color_utils::SkColorToHSL(background, &bg_hsl); |
67 color_utils::SkColorToHSL(kURLTextColor, &hue_hsl); | 67 color_utils::SkColorToHSL(kURLTextColor, &hue_hsl); |
68 | 68 |
69 // The saturation of the text should be opposite of the background, clamped | 69 // The saturation of the text should be opposite of the background, clamped |
70 // to 0.2-0.8. We make sure it's greater than 0.2 so there's some color, but | 70 // to 0.2-0.8. We make sure it's greater than 0.2 so there's some color, but |
71 // less than 0.8 so it's not the oversaturated neon-color. | 71 // less than 0.8 so it's not the oversaturated neon-color. |
72 double opposite_s = 1 - bg_hsl.s; | 72 double opposite_s = 1 - bg_hsl.s; |
73 double s = std::max(0.2, std::min(0.8, opposite_s)); | 73 double s = std::max(0.2, std::min(0.8, opposite_s)); |
74 | 74 |
75 // The luminance should match the luminance of the foreground text. Again, | 75 // The luminance should match the luminance of the foreground text. Again, |
76 // we clamp so as to have at some amount of color (green) in the text. | 76 // we clamp so as to have at some amount of color (green) in the text. |
77 double opposite_l = fg_hsl.l; | 77 double opposite_l = fg_hsl.l; |
78 double l = std::max(0.1, std::min(0.9, opposite_l)); | 78 double l = std::max(0.1, std::min(0.9, opposite_l)); |
79 | 79 |
80 color_utils::HSL output = { hue_hsl.h, s, l }; | 80 color_utils::HSL output = {hue_hsl.h, s, l}; |
81 return color_utils::HSLToSkColor(output, 255); | 81 return color_utils::HSLToSkColor(output, 255); |
82 } | 82 } |
83 | 83 |
84 enum WidgetState { | 84 enum WidgetState { |
85 NORMAL = 0, | 85 NORMAL = 0, |
86 ACTIVE = 1, | 86 ACTIVE = 1, |
87 PRELIGHT = 2, | 87 PRELIGHT = 2, |
88 SELECTED = 3, | 88 SELECTED = 3, |
89 INSENSITIVE = 4, | 89 INSENSITIVE = 4, |
90 }; | 90 }; |
(...skipping 21 matching lines...) Expand all Loading... |
112 SkColor GetTextAAColor(GtkWidget* widget, WidgetState state) { | 112 SkColor GetTextAAColor(GtkWidget* widget, WidgetState state) { |
113 return GdkColorToSkColor(gtk_rc_get_style(widget)->text_aa[stateMap[state]]); | 113 return GdkColorToSkColor(gtk_rc_get_style(widget)->text_aa[stateMap[state]]); |
114 } | 114 } |
115 SkColor GetBaseColor(GtkWidget* widget, WidgetState state) { | 115 SkColor GetBaseColor(GtkWidget* widget, WidgetState state) { |
116 return GdkColorToSkColor(gtk_rc_get_style(widget)->base[stateMap[state]]); | 116 return GdkColorToSkColor(gtk_rc_get_style(widget)->base[stateMap[state]]); |
117 } | 117 } |
118 | 118 |
119 #else | 119 #else |
120 // Same order as enum WidgetState above | 120 // Same order as enum WidgetState above |
121 const GtkStateFlags stateMap[] = { | 121 const GtkStateFlags stateMap[] = { |
122 GTK_STATE_FLAG_NORMAL, | 122 GTK_STATE_FLAG_NORMAL, GTK_STATE_FLAG_ACTIVE, |
123 GTK_STATE_FLAG_ACTIVE, | 123 GTK_STATE_FLAG_PRELIGHT, GTK_STATE_FLAG_SELECTED, |
124 GTK_STATE_FLAG_PRELIGHT, | 124 GTK_STATE_FLAG_INSENSITIVE, |
125 GTK_STATE_FLAG_SELECTED, | |
126 GTK_STATE_FLAG_INSENSITIVE, | |
127 }; | 125 }; |
128 | 126 |
129 SkColor GetFGColor(GtkWidget* widget, WidgetState state) { | 127 SkColor GetFGColor(GtkWidget* widget, WidgetState state) { |
130 GdkRGBA color; | 128 GdkRGBA color; |
131 gtk_style_context_get_color( | 129 gtk_style_context_get_color(gtk_widget_get_style_context(widget), |
132 gtk_widget_get_style_context(widget), stateMap[state], &color); | 130 stateMap[state], &color); |
133 return SkColorSetRGB(color.red * 255, color.green * 255, color.blue * 255); | 131 return SkColorSetRGB(color.red * 255, color.green * 255, color.blue * 255); |
134 } | 132 } |
135 SkColor GetBGColor(GtkWidget* widget, WidgetState state) { | 133 SkColor GetBGColor(GtkWidget* widget, WidgetState state) { |
136 GdkRGBA color; | 134 GdkRGBA color; |
137 | 135 |
138 G_GNUC_BEGIN_IGNORE_DEPRECATIONS | 136 G_GNUC_BEGIN_IGNORE_DEPRECATIONS |
139 gtk_style_context_get_background_color( | 137 gtk_style_context_get_background_color(gtk_widget_get_style_context(widget), |
140 gtk_widget_get_style_context(widget), stateMap[state], &color); | 138 stateMap[state], &color); |
141 G_GNUC_END_IGNORE_DEPRECATIONS | 139 G_GNUC_END_IGNORE_DEPRECATIONS |
142 | 140 |
143 // Hack for default color | 141 // Hack for default color |
144 if (color.alpha == 0.0) | 142 if (color.alpha == 0.0) |
145 color = {1, 1, 1, 1}; | 143 color = {1, 1, 1, 1}; |
146 | 144 |
147 return SkColorSetRGB(color.red * 255, color.green * 255, color.blue * 255); | 145 return SkColorSetRGB(color.red * 255, color.green * 255, color.blue * 255); |
148 } | 146 } |
149 | 147 |
150 SkColor GetTextColor(GtkWidget* widget, WidgetState state) { | 148 SkColor GetTextColor(GtkWidget* widget, WidgetState state) { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 const MenuItemExtraParams& menu_item) const { | 202 const MenuItemExtraParams& menu_item) const { |
205 SkColor color; | 203 SkColor color; |
206 SkPaint paint; | 204 SkPaint paint; |
207 switch (state) { | 205 switch (state) { |
208 case NativeTheme::kNormal: | 206 case NativeTheme::kNormal: |
209 case NativeTheme::kDisabled: | 207 case NativeTheme::kDisabled: |
210 color = GetSystemColor(NativeTheme::kColorId_MenuBackgroundColor); | 208 color = GetSystemColor(NativeTheme::kColorId_MenuBackgroundColor); |
211 paint.setColor(color); | 209 paint.setColor(color); |
212 break; | 210 break; |
213 case NativeTheme::kHovered: | 211 case NativeTheme::kHovered: |
214 color = GetSystemColor( | 212 color = |
215 NativeTheme::kColorId_FocusedMenuItemBackgroundColor); | 213 GetSystemColor(NativeTheme::kColorId_FocusedMenuItemBackgroundColor); |
216 paint.setColor(color); | 214 paint.setColor(color); |
217 break; | 215 break; |
218 default: | 216 default: |
219 NOTREACHED() << "Invalid state " << state; | 217 NOTREACHED() << "Invalid state " << state; |
220 break; | 218 break; |
221 } | 219 } |
222 if (menu_item.corner_radius > 0) { | 220 if (menu_item.corner_radius > 0) { |
223 const SkScalar radius = SkIntToScalar(menu_item.corner_radius); | 221 const SkScalar radius = SkIntToScalar(menu_item.corner_radius); |
224 canvas->drawRoundRect(gfx::RectToSkRect(rect), radius, radius, paint); | 222 canvas->drawRoundRect(gfx::RectToSkRect(rect), radius, radius, paint); |
225 return; | 223 return; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 case kColorId_TextfieldReadOnlyColor: | 330 case kColorId_TextfieldReadOnlyColor: |
333 return GetTextColor(GetEntry(), SELECTED); | 331 return GetTextColor(GetEntry(), SELECTED); |
334 case kColorId_TextfieldReadOnlyBackground: | 332 case kColorId_TextfieldReadOnlyBackground: |
335 return GetBaseColor(GetEntry(), SELECTED); | 333 return GetBaseColor(GetEntry(), SELECTED); |
336 case kColorId_TextfieldSelectionColor: | 334 case kColorId_TextfieldSelectionColor: |
337 return GetTextColor(GetLabel(), SELECTED); | 335 return GetTextColor(GetLabel(), SELECTED); |
338 case kColorId_TextfieldSelectionBackgroundFocused: | 336 case kColorId_TextfieldSelectionBackgroundFocused: |
339 return GetBaseColor(GetLabel(), SELECTED); | 337 return GetBaseColor(GetLabel(), SELECTED); |
340 #endif | 338 #endif |
341 | 339 |
342 | |
343 // Tooltips | 340 // Tooltips |
344 case kColorId_TooltipBackground: | 341 case kColorId_TooltipBackground: |
345 return GetBGColor(GetTooltip(), NORMAL); | 342 return GetBGColor(GetTooltip(), NORMAL); |
346 case kColorId_TooltipText: | 343 case kColorId_TooltipText: |
347 return GetFGColor(GetTooltip(), NORMAL); | 344 return GetFGColor(GetTooltip(), NORMAL); |
348 | 345 |
349 // Trees and Tables (implemented on GTK using the same class) | 346 // Trees and Tables (implemented on GTK using the same class) |
350 case kColorId_TableBackground: | 347 case kColorId_TableBackground: |
351 case kColorId_TreeBackground: | 348 case kColorId_TreeBackground: |
352 return GetBGColor(GetTree(), NORMAL); | 349 return GetBGColor(GetTree(), NORMAL); |
353 case kColorId_TableText: | 350 case kColorId_TableText: |
354 case kColorId_TreeText: | 351 case kColorId_TreeText: |
355 return GetTextColor(GetTree(), NORMAL); | 352 return GetTextColor(GetTree(), NORMAL); |
356 case kColorId_TableSelectedText: | 353 case kColorId_TableSelectedText: |
357 case kColorId_TableSelectedTextUnfocused: | 354 case kColorId_TableSelectedTextUnfocused: |
358 case kColorId_TreeSelectedText: | 355 case kColorId_TreeSelectedText: |
359 case kColorId_TreeSelectedTextUnfocused: | 356 case kColorId_TreeSelectedTextUnfocused: |
360 return GetTextColor(GetTree(), SELECTED); | 357 return GetTextColor(GetTree(), SELECTED); |
361 case kColorId_TableSelectionBackgroundFocused: | 358 case kColorId_TableSelectionBackgroundFocused: |
362 case kColorId_TableSelectionBackgroundUnfocused: | 359 case kColorId_TableSelectionBackgroundUnfocused: |
363 case kColorId_TreeSelectionBackgroundFocused: | 360 case kColorId_TreeSelectionBackgroundFocused: |
364 case kColorId_TreeSelectionBackgroundUnfocused: | 361 case kColorId_TreeSelectionBackgroundUnfocused: |
365 return GetBGColor(GetTree(), SELECTED); | 362 return GetBGColor(GetTree(), SELECTED); |
366 case kColorId_TreeArrow: | 363 case kColorId_TreeArrow: |
367 return GetFGColor(GetTree(), NORMAL); | 364 return GetFGColor(GetTree(), NORMAL); |
368 case kColorId_TableGroupingIndicatorColor: | 365 case kColorId_TableGroupingIndicatorColor: |
369 return GetTextAAColor(GetTree(), NORMAL); | 366 return GetTextAAColor(GetTree(), NORMAL); |
370 | 367 |
371 // Results Table | 368 // Results Table |
372 case kColorId_ResultsTableNormalBackground: | 369 case kColorId_ResultsTableNormalBackground: |
373 return GetSystemColor(kColorId_TextfieldDefaultBackground); | 370 return GetSystemColor(kColorId_TextfieldDefaultBackground); |
374 case kColorId_ResultsTableHoveredBackground: | 371 case kColorId_ResultsTableHoveredBackground: |
375 return color_utils::AlphaBlend( | 372 return color_utils::AlphaBlend( |
376 GetSystemColor(kColorId_TextfieldDefaultBackground), | 373 GetSystemColor(kColorId_TextfieldDefaultBackground), |
377 GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused), | 374 GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused), 0x80); |
378 0x80); | |
379 case kColorId_ResultsTableSelectedBackground: | 375 case kColorId_ResultsTableSelectedBackground: |
380 return GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused); | 376 return GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused); |
381 case kColorId_ResultsTableNormalText: | 377 case kColorId_ResultsTableNormalText: |
382 case kColorId_ResultsTableHoveredText: | 378 case kColorId_ResultsTableHoveredText: |
383 return GetSystemColor(kColorId_TextfieldDefaultColor); | 379 return GetSystemColor(kColorId_TextfieldDefaultColor); |
384 case kColorId_ResultsTableSelectedText: | 380 case kColorId_ResultsTableSelectedText: |
385 return GetSystemColor(kColorId_TextfieldSelectionColor); | 381 return GetSystemColor(kColorId_TextfieldSelectionColor); |
386 case kColorId_ResultsTableNormalDimmedText: | 382 case kColorId_ResultsTableNormalDimmedText: |
387 case kColorId_ResultsTableHoveredDimmedText: | 383 case kColorId_ResultsTableHoveredDimmedText: |
388 return color_utils::AlphaBlend( | 384 return color_utils::AlphaBlend( |
389 GetSystemColor(kColorId_TextfieldDefaultColor), | 385 GetSystemColor(kColorId_TextfieldDefaultColor), |
390 GetSystemColor(kColorId_TextfieldDefaultBackground), | 386 GetSystemColor(kColorId_TextfieldDefaultBackground), 0x80); |
391 0x80); | |
392 case kColorId_ResultsTableSelectedDimmedText: | 387 case kColorId_ResultsTableSelectedDimmedText: |
393 return color_utils::AlphaBlend( | 388 return color_utils::AlphaBlend( |
394 GetSystemColor(kColorId_TextfieldSelectionColor), | 389 GetSystemColor(kColorId_TextfieldSelectionColor), |
395 GetSystemColor(kColorId_TextfieldDefaultBackground), | 390 GetSystemColor(kColorId_TextfieldDefaultBackground), 0x80); |
396 0x80); | |
397 case kColorId_ResultsTableNormalUrl: | 391 case kColorId_ResultsTableNormalUrl: |
398 case kColorId_ResultsTableHoveredUrl: | 392 case kColorId_ResultsTableHoveredUrl: |
399 return NormalURLColor(GetSystemColor(kColorId_TextfieldDefaultColor)); | 393 return NormalURLColor(GetSystemColor(kColorId_TextfieldDefaultColor)); |
400 | 394 |
401 case kColorId_ResultsTableSelectedUrl: | 395 case kColorId_ResultsTableSelectedUrl: |
402 return SelectedURLColor( | 396 return SelectedURLColor( |
403 GetSystemColor(kColorId_TextfieldSelectionColor), | 397 GetSystemColor(kColorId_TextfieldSelectionColor), |
404 GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused)); | 398 GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused)); |
405 | 399 |
406 case kColorId_ResultsTablePositiveText: { | 400 case kColorId_ResultsTablePositiveText: { |
(...skipping 22 matching lines...) Expand all Loading... |
429 } | 423 } |
430 | 424 |
431 // Throbber | 425 // Throbber |
432 case kColorId_ThrobberSpinningColor: | 426 case kColorId_ThrobberSpinningColor: |
433 case kColorId_ThrobberLightColor: | 427 case kColorId_ThrobberLightColor: |
434 return GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused); | 428 return GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused); |
435 | 429 |
436 case kColorId_ThrobberWaitingColor: | 430 case kColorId_ThrobberWaitingColor: |
437 return color_utils::AlphaBlend( | 431 return color_utils::AlphaBlend( |
438 GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused), | 432 GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused), |
439 GetBGColor(GetWindow(), NORMAL), | 433 GetBGColor(GetWindow(), NORMAL), 0x80); |
440 0x80); | |
441 | 434 |
442 // Alert icons | 435 // Alert icons |
443 // Just fall back to the same colors as Aura. | 436 // Just fall back to the same colors as Aura. |
444 case kColorId_AlertSeverityLow: | 437 case kColorId_AlertSeverityLow: |
445 case kColorId_AlertSeverityMedium: | 438 case kColorId_AlertSeverityMedium: |
446 case kColorId_AlertSeverityHigh: { | 439 case kColorId_AlertSeverityHigh: { |
447 ui::NativeTheme* fallback_theme = | 440 ui::NativeTheme* fallback_theme = |
448 color_utils::IsDark(GetTextColor(GetEntry(), NORMAL)) | 441 color_utils::IsDark(GetTextColor(GetEntry(), NORMAL)) |
449 ? ui::NativeThemeAura::instance() | 442 ? ui::NativeThemeAura::instance() |
450 : ui::NativeThemeDarkAura::instance(); | 443 : ui::NativeThemeDarkAura::instance(); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
565 | 558 |
566 if (!fake_menu_item) { | 559 if (!fake_menu_item) { |
567 fake_menu_item = gtk_custom_menu_item_new(); | 560 fake_menu_item = gtk_custom_menu_item_new(); |
568 gtk_menu_shell_append(GTK_MENU_SHELL(GetMenu()), fake_menu_item); | 561 gtk_menu_shell_append(GTK_MENU_SHELL(GetMenu()), fake_menu_item); |
569 } | 562 } |
570 | 563 |
571 return fake_menu_item; | 564 return fake_menu_item; |
572 } | 565 } |
573 | 566 |
574 } // namespace libgtkui | 567 } // namespace libgtkui |
OLD | NEW |