Index: chrome/browser/gtk/gtk_theme_provider.cc |
diff --git a/chrome/browser/gtk/gtk_theme_provider.cc b/chrome/browser/gtk/gtk_theme_provider.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f0303983aa23cf8094df9e42001511909eb2e1ab |
--- /dev/null |
+++ b/chrome/browser/gtk/gtk_theme_provider.cc |
@@ -0,0 +1,154 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/gtk/gtk_theme_provider.h" |
+ |
+#include <gtk/gtk.h> |
+ |
+#include "base/gfx/gtk_util.h" |
+#include "chrome/browser/metrics/user_metrics.h" |
+#include "chrome/browser/profile.h" |
+#include "chrome/common/pref_names.h" |
+#include "grit/theme_resources.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
+#include "third_party/skia/include/core/SkCanvas.h" |
+ |
+namespace { |
+ |
+// The size of the rendered toolbar image. |
+const int kToolbarImageWidth = 64; |
+const int kToolbarImageHeight = 128; |
+ |
+} // namespace |
+ |
+GtkThemeProvider::GtkThemeProvider() |
+ : BrowserThemeProvider(), |
+ fake_window_(gtk_window_new(GTK_WINDOW_TOPLEVEL)) { |
+ // Only realized widgets receive style-set notifications, which we need to |
+ // broadcast new theme images and colors. |
+ gtk_widget_realize(fake_window_); |
+ g_signal_connect(fake_window_, "style-set", G_CALLBACK(&OnStyleSet), this); |
+} |
+ |
+GtkThemeProvider::~GtkThemeProvider() { |
+ gtk_widget_destroy(fake_window_); |
+} |
+ |
+void GtkThemeProvider::SetTheme(Extension* extension) { |
+ profile()->GetPrefs()->SetBoolean(prefs::kUsesSystemTheme, false); |
+ BrowserThemeProvider::SetTheme(extension); |
+} |
+ |
+void GtkThemeProvider::UseDefaultTheme() { |
+ profile()->GetPrefs()->SetBoolean(prefs::kUsesSystemTheme, false); |
+ BrowserThemeProvider::UseDefaultTheme(); |
+} |
+ |
+void GtkThemeProvider::SetNativeTheme() { |
+ profile()->GetPrefs()->SetBoolean(prefs::kUsesSystemTheme, true); |
+ ClearAllThemeData(); |
+ LoadGtkValues(); |
+ NotifyThemeChanged(); |
+} |
+ |
+// static |
+bool GtkThemeProvider::UseSystemThemeGraphics(Profile* profile) { |
+ return profile->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme); |
+} |
+ |
+void GtkThemeProvider::LoadThemePrefs() { |
+ if (profile()->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme)) { |
+ LoadGtkValues(); |
+ } else { |
+ BrowserThemeProvider::LoadThemePrefs(); |
+ } |
+} |
+ |
+SkBitmap* GtkThemeProvider::LoadThemeBitmap(int id) { |
+ if (id == IDR_THEME_TOOLBAR && UseSystemThemeGraphics(profile())) { |
+ GtkStyle* style = gtk_rc_get_style(fake_window_); |
+ GdkColor* color = &style->bg[GTK_STATE_NORMAL]; |
+ SkBitmap* bitmap = new SkBitmap; |
+ bitmap->setConfig(SkBitmap::kARGB_8888_Config, |
+ kToolbarImageWidth, kToolbarImageHeight); |
+ bitmap->allocPixels(); |
+ bitmap->eraseRGB(color->red >> 8, color->green >> 8, color->blue >> 8); |
+ return bitmap; |
+ } else { |
+ return BrowserThemeProvider::LoadThemeBitmap(id); |
+ } |
+} |
+ |
+// static |
+void GtkThemeProvider::OnStyleSet(GtkWidget* widget, |
+ GtkStyle* previous_style, |
+ GtkThemeProvider* provider) { |
+ if (provider->profile()->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme)) { |
+ provider->ClearAllThemeData(); |
+ provider->LoadGtkValues(); |
+ provider->NotifyThemeChanged(); |
+ } |
+} |
+ |
+void GtkThemeProvider::LoadGtkValues() { |
+ GtkStyle* style = gtk_rc_get_style(fake_window_); |
+ |
+ SetThemeColorFromGtk(themes::kColorFrame, &style->bg[GTK_STATE_SELECTED]); |
+ SetThemeColorFromGtk(themes::kColorFrameInactive, |
+ &style->bg[GTK_STATE_INSENSITIVE]); |
+ // TODO(erg): Incognito images. |
+ SetThemeColorFromGtk(themes::kColorToolbar, |
+ &style->bg[GTK_STATE_NORMAL]); |
+ SetThemeColorFromGtk(themes::kColorTabText, |
+ &style->text[GTK_STATE_NORMAL]); |
+ SetThemeColorFromGtk(themes::kColorBackgroundTabText, |
+ &style->text[GTK_STATE_NORMAL]); |
+ SetThemeColorFromGtk(themes::kColorBookmarkText, |
+ &style->text[GTK_STATE_NORMAL]); |
+ SetThemeColorFromGtk(themes::kColorControlBackground, |
+ &style->bg[GTK_STATE_NORMAL]); |
+ SetThemeColorFromGtk(themes::kColorButtonBackground, |
+ &style->bg[GTK_STATE_NORMAL]); |
+ |
+ SetThemeTintFromGtk(themes::kTintButtons, &style->bg[GTK_STATE_SELECTED], |
+ themes::kDefaultTintButtons); |
+ SetThemeTintFromGtk(themes::kTintFrame, &style->bg[GTK_STATE_SELECTED], |
+ themes::kDefaultTintFrame); |
+ SetThemeTintFromGtk(themes::kTintFrameInactive, |
+ &style->bg[GTK_STATE_SELECTED], |
+ themes::kDefaultTintFrameInactive); |
+ SetThemeTintFromGtk(themes::kTintFrameIncognito, |
+ &style->bg[GTK_STATE_SELECTED], |
+ themes::kDefaultTintFrameIncognito); |
+ SetThemeTintFromGtk(themes::kTintFrameIncognitoInactive, |
+ &style->bg[GTK_STATE_SELECTED], |
+ themes::kDefaultTintFrameIncognitoInactive); |
+ SetThemeTintFromGtk(themes::kTintBackgroundTab, |
+ &style->bg[GTK_STATE_SELECTED], |
+ themes::kDefaultTintBackgroundTab); |
+ |
+ GenerateFrameColors(); |
+ GenerateFrameImages(); |
+} |
+ |
+void GtkThemeProvider::SetThemeColorFromGtk(const char* id, GdkColor* color) { |
+ SetColor(id, SkColorSetRGB(color->red >> 8, |
+ color->green >> 8, |
+ color->blue >> 8)); |
+} |
+ |
+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); |
+ if (default_tint.s != -1) |
+ hsl.s = default_tint.s; |
+ |
+ if (default_tint.l != -1) |
+ hsl.l = default_tint.l; |
+ SetTint(id, hsl); |
+} |
+ |