summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-11 01:15:04 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-11 01:15:04 +0000
commit54a102904270a1adb7bd45d6b84c1ebe72c32eba (patch)
treec85235febde55b20019fe595e29abcc13ee2e350 /chrome
parente479cbc1f26dc1a9b250b90affb29653fed2aa46 (diff)
downloadchromium_src-54a102904270a1adb7bd45d6b84c1ebe72c32eba.zip
chromium_src-54a102904270a1adb7bd45d6b84c1ebe72c32eba.tar.gz
chromium_src-54a102904270a1adb7bd45d6b84c1ebe72c32eba.tar.bz2
Update the system favicon/folder icon on theme change.
BUG=21531 TEST=use gtk theme, look at icons in task manager, bookmark bar, tab strip, change gtk theme with gnome-appearance-properties,note that the default favicons and folder icons have changed Review URL: http://codereview.chromium.org/202055 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25962 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/gtk/bookmark_editor_gtk.cc3
-rw-r--r--chrome/browser/gtk/bookmark_tree_model.cc3
-rw-r--r--chrome/browser/gtk/bookmark_utils_gtk.cc47
-rw-r--r--chrome/browser/gtk/bookmark_utils_gtk.h6
-rw-r--r--chrome/browser/gtk/gtk_theme_provider.cc61
-rw-r--r--chrome/browser/gtk/gtk_theme_provider.h17
-rw-r--r--chrome/browser/gtk/list_store_favicon_loader.cc4
-rw-r--r--chrome/browser/gtk/tabs/tab_renderer_gtk.cc2
-rw-r--r--chrome/browser/gtk/task_manager_gtk.cc5
9 files changed, 90 insertions, 58 deletions
diff --git a/chrome/browser/gtk/bookmark_editor_gtk.cc b/chrome/browser/gtk/bookmark_editor_gtk.cc
index 3aee43b..93d2c14 100644
--- a/chrome/browser/gtk/bookmark_editor_gtk.cc
+++ b/chrome/browser/gtk/bookmark_editor_gtk.cc
@@ -13,6 +13,7 @@
#include "base/string_util.h"
#include "chrome/browser/gtk/bookmark_tree_model.h"
#include "chrome/browser/gtk/bookmark_utils_gtk.h"
+#include "chrome/browser/gtk/gtk_theme_provider.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/bookmarks/bookmark_utils.h"
#include "chrome/browser/history/history.h"
@@ -313,7 +314,7 @@ void BookmarkEditorGtk::AddNewGroup(GtkTreeIter* parent, GtkTreeIter* child) {
gtk_tree_store_set(
tree_store_, child,
bookmark_utils::FOLDER_ICON,
- bookmark_utils::GetFolderIcon(true),
+ GtkThemeProvider::GetFolderIcon(true),
bookmark_utils::FOLDER_NAME,
l10n_util::GetStringUTF8(IDS_BOOMARK_EDITOR_NEW_FOLDER_NAME).c_str(),
bookmark_utils::ITEM_ID, static_cast<int64>(0),
diff --git a/chrome/browser/gtk/bookmark_tree_model.cc b/chrome/browser/gtk/bookmark_tree_model.cc
index 7682e9b..dd63a8d 100644
--- a/chrome/browser/gtk/bookmark_tree_model.cc
+++ b/chrome/browser/gtk/bookmark_tree_model.cc
@@ -10,6 +10,7 @@
#include "base/string_util.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/gtk/bookmark_utils_gtk.h"
+#include "chrome/browser/gtk/gtk_theme_provider.h"
namespace {
@@ -23,7 +24,7 @@ void AddSingleNodeToTreeStore(GtkTreeStore* store, const BookmarkNode* node,
// differently).
gtk_tree_store_set(store, iter,
bookmark_utils::FOLDER_ICON,
- bookmark_utils::GetFolderIcon(true),
+ GtkThemeProvider::GetFolderIcon(true),
bookmark_utils::FOLDER_NAME,
WideToUTF8(node->GetTitle()).c_str(),
bookmark_utils::ITEM_ID, node->id(),
diff --git a/chrome/browser/gtk/bookmark_utils_gtk.cc b/chrome/browser/gtk/bookmark_utils_gtk.cc
index 8fbe9f9..9c5730f 100644
--- a/chrome/browser/gtk/bookmark_utils_gtk.cc
+++ b/chrome/browser/gtk/bookmark_utils_gtk.cc
@@ -17,9 +17,6 @@
#include "chrome/browser/gtk/gtk_theme_provider.h"
#include "chrome/browser/profile.h"
#include "chrome/common/gtk_util.h"
-#include "grit/app_resources.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
namespace {
@@ -50,10 +47,6 @@ void* AsVoid(const BookmarkNode* node) {
return const_cast<BookmarkNode*>(node);
}
-// This is a dummy widget that only exists so we have something to pass to
-// gtk_widget_render_icon().
-GtkWidget* icon_widget = NULL;
-
} // namespace
namespace bookmark_utils {
@@ -63,42 +56,6 @@ const char kBookmarkNode[] = "bookmark-node";
// Spacing between the buttons on the bar.
const int kBarButtonPadding = 4;
-GdkPixbuf* GetFolderIcon(bool native) {
- if (native) {
- if (!icon_widget)
- icon_widget = gtk_fixed_new();
- // We never release our ref, so we will leak this on program shutdown.
- static GdkPixbuf* default_folder_icon =
- gtk_widget_render_icon(icon_widget, GTK_STOCK_DIRECTORY,
- GTK_ICON_SIZE_MENU, NULL);
- if (default_folder_icon)
- return default_folder_icon;
- }
-
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- static GdkPixbuf* default_folder_icon = rb.GetPixbufNamed(
- IDR_BOOKMARK_BAR_FOLDER);
- return default_folder_icon;
-}
-
-GdkPixbuf* GetDefaultFavicon(bool native) {
- if (native) {
- if (!icon_widget)
- icon_widget = gtk_fixed_new();
- // We never release our ref, so we will leak this on program shutdown.
- static GdkPixbuf* default_bookmark_icon =
- gtk_widget_render_icon(icon_widget, GTK_STOCK_FILE,
- GTK_ICON_SIZE_MENU, NULL);
- if (default_bookmark_icon)
- return default_bookmark_icon;
- }
-
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- static GdkPixbuf* default_bookmark_icon = rb.GetPixbufNamed(
- IDR_DEFAULT_FAVICON);
- return default_bookmark_icon;
-}
-
GdkPixbuf* GetPixbufForNode(const BookmarkNode* node, BookmarkModel* model,
bool native) {
GdkPixbuf* pixbuf;
@@ -107,11 +64,11 @@ GdkPixbuf* GetPixbufForNode(const BookmarkNode* node, BookmarkModel* model,
if (model->GetFavIcon(node).width() != 0) {
pixbuf = gfx::GdkPixbufFromSkBitmap(&model->GetFavIcon(node));
} else {
- pixbuf = GetDefaultFavicon(native);
+ pixbuf = GtkThemeProvider::GetDefaultFavicon(native);
g_object_ref(pixbuf);
}
} else {
- pixbuf = GetFolderIcon(native);
+ pixbuf = GtkThemeProvider::GetFolderIcon(native);
g_object_ref(pixbuf);
}
diff --git a/chrome/browser/gtk/bookmark_utils_gtk.h b/chrome/browser/gtk/bookmark_utils_gtk.h
index 3bab09d..de56039 100644
--- a/chrome/browser/gtk/bookmark_utils_gtk.h
+++ b/chrome/browser/gtk/bookmark_utils_gtk.h
@@ -21,12 +21,6 @@ extern const char kBookmarkNode[];
// Padding between the image and the label of a bookmark bar button.
extern const int kBarButtonPadding;
-// These functions do not add a ref to the returned pixbuf, and it should not be
-// unreffed.
-// If |native| is true, get the GTK_STOCK version of the icon.
-GdkPixbuf* GetFolderIcon(bool native);
-GdkPixbuf* GetDefaultFavicon(bool native);
-
// Get the image that is used to represent the node. This function adds a ref
// to the returned pixbuf, so it requires a matching call to g_object_unref().
GdkPixbuf* GetPixbufForNode(const BookmarkNode* node, BookmarkModel* model,
diff --git a/chrome/browser/gtk/gtk_theme_provider.cc b/chrome/browser/gtk/gtk_theme_provider.cc
index b1c07d5..428e58b 100644
--- a/chrome/browser/gtk/gtk_theme_provider.cc
+++ b/chrome/browser/gtk/gtk_theme_provider.cc
@@ -21,6 +21,9 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
+#include "grit/app_resources.h"
+//#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
namespace {
@@ -56,6 +59,10 @@ SkColor GdkToSkColor(GdkColor* color) {
} // namespace
+GtkWidget* GtkThemeProvider::icon_widget_ = NULL;
+GdkPixbuf* GtkThemeProvider::default_folder_icon_ = NULL;
+GdkPixbuf* GtkThemeProvider::default_bookmark_icon_ = NULL;
+
// static
GtkThemeProvider* GtkThemeProvider::GetFrom(Profile* profile) {
return static_cast<GtkThemeProvider*>(profile->GetThemeProvider());
@@ -185,6 +192,48 @@ CairoCachedSurface* GtkThemeProvider::GetSurfaceNamed(
return surface;
}
+// static
+GdkPixbuf* GtkThemeProvider::GetFolderIcon(bool native) {
+ if (native) {
+ if (!icon_widget_)
+ icon_widget_ = gtk_fixed_new();
+ // We never release our ref, so we will leak this on program shutdown.
+ if (!default_folder_icon_) {
+ default_folder_icon_ =
+ gtk_widget_render_icon(icon_widget_, GTK_STOCK_DIRECTORY,
+ GTK_ICON_SIZE_MENU, NULL);
+ }
+ if (default_folder_icon_)
+ return default_folder_icon_;
+ }
+
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ static GdkPixbuf* default_folder_icon_ = rb.GetPixbufNamed(
+ IDR_BOOKMARK_BAR_FOLDER);
+ return default_folder_icon_;
+}
+
+// static
+GdkPixbuf* GtkThemeProvider::GetDefaultFavicon(bool native) {
+ if (native) {
+ if (!icon_widget_)
+ icon_widget_ = gtk_fixed_new();
+ // We never release our ref, so we will leak this on program shutdown.
+ if (!default_bookmark_icon_) {
+ default_bookmark_icon_ =
+ gtk_widget_render_icon(icon_widget_, GTK_STOCK_FILE,
+ GTK_ICON_SIZE_MENU, NULL);
+ }
+ if (default_bookmark_icon_)
+ return default_bookmark_icon_;
+ }
+
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ static GdkPixbuf* default_bookmark_icon_ = rb.GetPixbufNamed(
+ IDR_DEFAULT_FAVICON);
+ return default_bookmark_icon_;
+}
+
void GtkThemeProvider::LoadThemePrefs() {
if (use_gtk_) {
LoadGtkValues();
@@ -239,11 +288,23 @@ void GtkThemeProvider::FreePlatformCaches() {
void GtkThemeProvider::OnStyleSet(GtkWidget* widget,
GtkStyle* previous_style,
GtkThemeProvider* provider) {
+ GdkPixbuf* default_folder_icon = default_folder_icon_;
+ GdkPixbuf* default_bookmark_icon = default_bookmark_icon_;
+ default_folder_icon_ = NULL;
+ default_bookmark_icon_ = NULL;
+
if (provider->profile()->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme)) {
provider->ClearAllThemeData();
provider->LoadGtkValues();
provider->NotifyThemeChanged();
}
+
+ // Free the old icons only after the theme change notification has gone
+ // through.
+ if (default_folder_icon)
+ g_object_unref(default_folder_icon);
+ if (default_bookmark_icon)
+ g_object_unref(default_bookmark_icon);
}
void GtkThemeProvider::LoadGtkValues() {
diff --git a/chrome/browser/gtk/gtk_theme_provider.h b/chrome/browser/gtk/gtk_theme_provider.h
index f42381c..14b6e73 100644
--- a/chrome/browser/gtk/gtk_theme_provider.h
+++ b/chrome/browser/gtk/gtk_theme_provider.h
@@ -75,6 +75,12 @@ class GtkThemeProvider : public BrowserThemeProvider,
// to send the image to the server on each expose.
CairoCachedSurface* GetSurfaceNamed(int id, GtkWidget* widget_on_display);
+ // These functions do not add a ref to the returned pixbuf, and it should not be
+ // unreffed.
+ // If |native| is true, get the GTK_STOCK version of the icon.
+ static GdkPixbuf* GetFolderIcon(bool native);
+ static GdkPixbuf* GetDefaultFavicon(bool native);
+
protected:
// Possibly creates a theme specific version of theme_toolbar_default.
// (minimally acceptable version right now, which is just a fill of the bg
@@ -135,6 +141,17 @@ class GtkThemeProvider : public BrowserThemeProvider,
typedef std::map<int, CairoCachedSurface*> CairoCachedSurfaceMap;
typedef std::map<GdkDisplay*, CairoCachedSurfaceMap> PerDisplaySurfaceMap;
PerDisplaySurfaceMap per_display_surfaces_;
+
+ // This is a dummy widget that only exists so we have something to pass to
+ // gtk_widget_render_icon().
+ static GtkWidget* icon_widget_;
+
+ // The default folder icon and default bookmark icon for the GTK theme.
+ // These are static because the system can only have one theme at a time.
+ // They are cached when they are requested the first time, and cleared when
+ // the system theme changes.
+ static GdkPixbuf* default_folder_icon_;
+ static GdkPixbuf* default_bookmark_icon_;
};
#endif // CHROME_BROWSER_GTK_GTK_THEME_PROVIDER_H_
diff --git a/chrome/browser/gtk/list_store_favicon_loader.cc b/chrome/browser/gtk/list_store_favicon_loader.cc
index 2b3803b..68f7547 100644
--- a/chrome/browser/gtk/list_store_favicon_loader.cc
+++ b/chrome/browser/gtk/list_store_favicon_loader.cc
@@ -8,7 +8,7 @@
#include "base/gfx/gtk_util.h"
#include "base/gfx/png_decoder.h"
-#include "chrome/browser/gtk/bookmark_utils_gtk.h"
+#include "chrome/browser/gtk/gtk_theme_provider.h"
#include "chrome/browser/profile.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -18,7 +18,7 @@ ListStoreFavIconLoader::ListStoreFavIconLoader(
: list_store_(list_store), favicon_col_(favicon_col),
favicon_handle_col_(favicon_handle_col), profile_(profile),
consumer_(consumer),
- default_favicon_(bookmark_utils::GetDefaultFavicon(true)) {
+ default_favicon_(GtkThemeProvider::GetDefaultFavicon(true)) {
}
ListStoreFavIconLoader::~ListStoreFavIconLoader() {
diff --git a/chrome/browser/gtk/tabs/tab_renderer_gtk.cc b/chrome/browser/gtk/tabs/tab_renderer_gtk.cc
index e6381d6..bd54642 100644
--- a/chrome/browser/gtk/tabs/tab_renderer_gtk.cc
+++ b/chrome/browser/gtk/tabs/tab_renderer_gtk.cc
@@ -762,7 +762,7 @@ void TabRendererGtk::PaintIcon(gfx::Canvas* canvas) {
} else {
if (!data_.favicon.isNull()) {
if (data_.is_default_favicon && theme_provider_->UseGtkTheme()) {
- GdkPixbuf* favicon = bookmark_utils::GetDefaultFavicon(true);
+ GdkPixbuf* favicon = GtkThemeProvider::GetDefaultFavicon(true);
canvas->DrawGdkPixbuf(favicon, favicon_bounds_.x(),
favicon_bounds_.y() + fav_icon_hiding_offset_);
} else {
diff --git a/chrome/browser/gtk/task_manager_gtk.cc b/chrome/browser/gtk/task_manager_gtk.cc
index ebe66a0..832c4de 100644
--- a/chrome/browser/gtk/task_manager_gtk.cc
+++ b/chrome/browser/gtk/task_manager_gtk.cc
@@ -16,8 +16,9 @@
#include "chrome/browser/browser_list.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_window.h"
-#include "chrome/browser/gtk/bookmark_utils_gtk.h"
+#include "chrome/browser/gtk/gtk_theme_provider.h"
#include "chrome/browser/gtk/gtk_chrome_link_button.h"
+#include "chrome/browser/gtk/gtk_theme_provider.h"
#include "chrome/browser/gtk/menu_gtk.h"
#include "chrome/common/gtk_tree.h"
#include "chrome/common/gtk_util.h"
@@ -518,7 +519,7 @@ GdkPixbuf* TaskManagerGtk::GetModelIcon(int row) {
ResourceBundle::GetSharedInstance().GetBitmapNamed(
IDR_DEFAULT_FAVICON)->pixelRef()) {
return static_cast<GdkPixbuf*>(g_object_ref(
- bookmark_utils::GetDefaultFavicon(true)));
+ GtkThemeProvider::GetDefaultFavicon(true)));
}
return gfx::GdkPixbufFromSkBitmap(&icon);