summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/gtk_theme_provider.h
diff options
context:
space:
mode:
authorerg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-10 18:16:15 +0000
committererg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-10 18:16:15 +0000
commiteafb5b7bf242e8ebd9c947012ca404dd904bc1bd (patch)
tree697b1e9468e78b390233af5e8c696ff14f65fa72 /chrome/browser/gtk/gtk_theme_provider.h
parente28b0fbbcde1c08e4dfbff7d4bd8e1f292892b9c (diff)
downloadchromium_src-eafb5b7bf242e8ebd9c947012ca404dd904bc1bd.zip
chromium_src-eafb5b7bf242e8ebd9c947012ca404dd904bc1bd.tar.gz
chromium_src-eafb5b7bf242e8ebd9c947012ca404dd904bc1bd.tar.bz2
Reapplies the GdkPixbuf -> cairo surface patch.
Only difference is explicitly calling a FreePerDisplaySurfaces() function from ~GtkThemeProvider() because vtables are set to base class during destructor calling. BUG=http://crbug.com/10499 Original Review URL: http://codereview.chromium.org/197046 Review URL: http://codereview.chromium.org/199077 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25880 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/gtk_theme_provider.h')
-rw-r--r--chrome/browser/gtk/gtk_theme_provider.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/chrome/browser/gtk/gtk_theme_provider.h b/chrome/browser/gtk/gtk_theme_provider.h
index e914d89..f42381c 100644
--- a/chrome/browser/gtk/gtk_theme_provider.h
+++ b/chrome/browser/gtk/gtk_theme_provider.h
@@ -5,6 +5,7 @@
#ifndef CHROME_BROWSER_GTK_GTK_THEME_PROVIDER_H_
#define CHROME_BROWSER_GTK_GTK_THEME_PROVIDER_H_
+#include <map>
#include <string>
#include <vector>
@@ -14,8 +15,10 @@
#include "skia/ext/skia_utils.h"
+class CairoCachedSurface;
class Profile;
+typedef struct _GdkDisplay GdkDisplay;
typedef struct _GtkStyle GtkStyle;
typedef struct _GtkWidget GtkWidget;
@@ -67,6 +70,11 @@ class GtkThemeProvider : public BrowserThemeProvider,
GtkWidget* fake_window() { return fake_window_; }
GtkWidget* fake_label() { return fake_label_.get(); }
+ // Returns a CairoCachedSurface for a particular Display. CairoCachedSurfaces
+ // (hopefully) live on the X server, instead of the client so we don't have
+ // to send the image to the server on each expose.
+ CairoCachedSurface* GetSurfaceNamed(int id, GtkWidget* widget_on_display);
+
protected:
// Possibly creates a theme specific version of theme_toolbar_default.
// (minimally acceptable version right now, which is just a fill of the bg
@@ -85,6 +93,9 @@ class GtkThemeProvider : public BrowserThemeProvider,
// the superclass.
virtual void SaveThemeBitmap(const std::string resource_name, int id);
+ // Additionally frees the CairoCachedSurfaces.
+ virtual void FreePlatformCaches();
+
// Handles signal from GTK that our theme has been changed.
static void OnStyleSet(GtkWidget* widget,
GtkStyle* previous_style,
@@ -97,6 +108,12 @@ class GtkThemeProvider : public BrowserThemeProvider,
void SetThemeTintFromGtk(const char* id, GdkColor* color,
const skia::HSL& default_tint);
+ // Split out from FreePlatformCaches so it can be called in our destructor;
+ // FreePlatformCaches() is called from the BrowserThemeProvider's destructor,
+ // but by the time ~BrowserThemeProvider() is run, the vtable no longer
+ // points to GtkThemeProvider's version.
+ void FreePerDisplaySurfaces();
+
// A notification from the GtkChromeButton GObject destructor that we should
// remove it from our internal list.
static void OnDestroyChromeButton(GtkWidget* button,
@@ -113,6 +130,11 @@ class GtkThemeProvider : public BrowserThemeProvider,
// A list of all GtkChromeButton instances. We hold on to these to notify
// them of theme changes.
std::vector<GtkWidget*> chrome_buttons_;
+
+ // Cairo surfaces for each GdkDisplay.
+ typedef std::map<int, CairoCachedSurface*> CairoCachedSurfaceMap;
+ typedef std::map<GdkDisplay*, CairoCachedSurfaceMap> PerDisplaySurfaceMap;
+ PerDisplaySurfaceMap per_display_surfaces_;
};
#endif // CHROME_BROWSER_GTK_GTK_THEME_PROVIDER_H_