diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-11 01:15:04 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-11 01:15:04 +0000 |
commit | 54a102904270a1adb7bd45d6b84c1ebe72c32eba (patch) | |
tree | c85235febde55b20019fe595e29abcc13ee2e350 /chrome | |
parent | e479cbc1f26dc1a9b250b90affb29653fed2aa46 (diff) | |
download | chromium_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.cc | 3 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_tree_model.cc | 3 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_utils_gtk.cc | 47 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_utils_gtk.h | 6 | ||||
-rw-r--r-- | chrome/browser/gtk/gtk_theme_provider.cc | 61 | ||||
-rw-r--r-- | chrome/browser/gtk/gtk_theme_provider.h | 17 | ||||
-rw-r--r-- | chrome/browser/gtk/list_store_favicon_loader.cc | 4 | ||||
-rw-r--r-- | chrome/browser/gtk/tabs/tab_renderer_gtk.cc | 2 | ||||
-rw-r--r-- | chrome/browser/gtk/task_manager_gtk.cc | 5 |
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); |