summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorerg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-10 22:39:45 +0000
committererg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-10 22:39:45 +0000
commitb2fa86d298e0deade8c6819f54e28e62c756f4e1 (patch)
tree9f3f082b8e458de7a037bbd74826f57ac86c6f20 /chrome
parent9420c240cd8428c63530675e25e97702a007a848 (diff)
downloadchromium_src-b2fa86d298e0deade8c6819f54e28e62c756f4e1.zip
chromium_src-b2fa86d298e0deade8c6819f54e28e62c756f4e1.tar.gz
chromium_src-b2fa86d298e0deade8c6819f54e28e62c756f4e1.tar.bz2
GTK: Use color data from the MetaFrames class in newer versions of GTK+.
When codereviewing my r36867, evmar suggested that I implement our trying to match WM frames in terms of gtk_rc_get_style_by_paths(). This worked... on the version of gtk+ included with hardy. It notably doesn't work under the version included with Karmic. This is the original patch from CL 552092 with some cleanup, before I rewrote it. BUG=32173 TEST=New Wave has a dark border color under GNOME on Karmic. Review URL: http://codereview.chromium.org/564048 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38682 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/gtk/gtk_theme_provider.cc35
-rw-r--r--chrome/browser/gtk/gtk_theme_provider.h8
-rw-r--r--chrome/browser/gtk/meta_frames.cc25
-rw-r--r--chrome/browser/gtk/meta_frames.h38
-rwxr-xr-xchrome/chrome_browser.gypi2
5 files changed, 80 insertions, 28 deletions
diff --git a/chrome/browser/gtk/gtk_theme_provider.cc b/chrome/browser/gtk/gtk_theme_provider.cc
index 48353ec0..440720e 100644
--- a/chrome/browser/gtk/gtk_theme_provider.cc
+++ b/chrome/browser/gtk/gtk_theme_provider.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -15,6 +15,7 @@
#include "chrome/browser/profile.h"
#include "chrome/browser/gtk/cairo_cached_surface.h"
#include "chrome/browser/gtk/gtk_chrome_button.h"
+#include "chrome/browser/gtk/meta_frames.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/pref_service.h"
#include "chrome/common/notification_details.h"
@@ -101,19 +102,21 @@ GtkThemeProvider* GtkThemeProvider::GetFrom(Profile* profile) {
GtkThemeProvider::GtkThemeProvider()
: BrowserThemeProvider(),
- fake_window_(gtk_window_new(GTK_WINDOW_TOPLEVEL)) {
+ fake_window_(gtk_window_new(GTK_WINDOW_TOPLEVEL)),
+ fake_frame_(meta_frames_new()) {
fake_label_.Own(gtk_label_new(""));
fake_entry_.Own(gtk_entry_new());
// 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);
+ gtk_widget_realize(fake_frame_);
+ g_signal_connect(fake_frame_, "style-set", G_CALLBACK(&OnStyleSet), this);
}
GtkThemeProvider::~GtkThemeProvider() {
profile()->GetPrefs()->RemovePrefObserver(prefs::kUsesSystemTheme, this);
gtk_widget_destroy(fake_window_);
+ gtk_widget_destroy(fake_frame_);
fake_label_.Destroy();
fake_entry_.Destroy();
@@ -439,13 +442,15 @@ void GtkThemeProvider::LoadGtkValues() {
profile()->GetPrefs()->GetMutableDictionary(prefs::kCurrentThemeImages);
pref_images->Clear();
- GtkStyle* window_style = GetFrameStyle();
- GtkStyle* label_style = gtk_rc_get_style(fake_label_.get());
+ GtkStyle* frame_style = gtk_rc_get_style(fake_frame_);
+ GdkColor frame_color = frame_style->bg[GTK_STATE_SELECTED];
+ GdkColor inactive_frame_color = frame_style->bg[GTK_STATE_INSENSITIVE];
- GdkColor frame_color = window_style->bg[GTK_STATE_SELECTED];
- GdkColor inactive_frame_color = window_style->bg[GTK_STATE_INSENSITIVE];
+ GtkStyle* window_style = gtk_rc_get_style(fake_window_);
GdkColor toolbar_color = window_style->bg[GTK_STATE_NORMAL];
GdkColor button_color = window_style->bg[GTK_STATE_SELECTED];
+
+ GtkStyle* label_style = gtk_rc_get_style(fake_label_.get());
GdkColor label_color = label_style->text[GTK_STATE_NORMAL];
GtkSettings* settings = gtk_settings_get_default();
@@ -615,20 +620,6 @@ void GtkThemeProvider::LoadGtkValues() {
GdkToSkColor(&entry_style->text[GTK_STATE_ACTIVE]);
}
-GtkStyle* GtkThemeProvider::GetFrameStyle() {
- GtkStyle* window_style =
- gtk_rc_get_style_by_paths(gtk_widget_get_settings(fake_window_),
- NULL, "MetaFrames",
- G_TYPE_NONE);
- if (!window_style) {
- // Some themes don't specify the MetaFrames class, so do a normal lookup on
- // our main window.
- window_style = gtk_rc_get_style(fake_window_);
- }
-
- return window_style;
-}
-
void GtkThemeProvider::LoadDefaultValues() {
focus_ring_color_ = SkColorSetARGB(255, 229, 151, 0);
thumb_active_color_ = SkColorSetRGB(250, 248, 245);
diff --git a/chrome/browser/gtk/gtk_theme_provider.h b/chrome/browser/gtk/gtk_theme_provider.h
index 919c522..cc036f9 100644
--- a/chrome/browser/gtk/gtk_theme_provider.h
+++ b/chrome/browser/gtk/gtk_theme_provider.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 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.
@@ -133,11 +133,6 @@ class GtkThemeProvider : public BrowserThemeProvider,
// BrowserThemeProvider interface and the colors we send to webkit.
void LoadGtkValues();
- // Returns a GtkStyle* from which we get the colors for our frame. Checks for
- // the optional "MetaFrames" widget class before returning the default
- // GtkWindow one.
- GtkStyle* GetFrameStyle();
-
// Sets the values that we send to webkit to safe defaults.
void LoadDefaultValues();
@@ -174,6 +169,7 @@ class GtkThemeProvider : public BrowserThemeProvider,
// GtkWidgets that exist only so we can look at their properties (and take
// their colors).
GtkWidget* fake_window_;
+ GtkWidget* fake_frame_;
OwnedWidgetGtk fake_label_;
OwnedWidgetGtk fake_entry_;
diff --git a/chrome/browser/gtk/meta_frames.cc b/chrome/browser/gtk/meta_frames.cc
new file mode 100644
index 0000000..e95ac87
--- /dev/null
+++ b/chrome/browser/gtk/meta_frames.cc
@@ -0,0 +1,25 @@
+// Copyright (c) 2010 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/meta_frames.h"
+
+G_BEGIN_DECLS
+
+G_DEFINE_TYPE(MetaFrames, meta_frames, GTK_TYPE_WINDOW)
+
+static void meta_frames_class_init(MetaFramesClass* frames_class) {
+ // Noop since we don't declare anything.
+}
+
+static void meta_frames_init(MetaFrames* button) {
+}
+
+GtkWidget* meta_frames_new(void) {
+ GtkWindow* window =
+ GTK_WINDOW(g_object_new(meta_frames_get_type(), NULL));
+ window->type = GTK_WINDOW_TOPLEVEL;
+ return GTK_WIDGET(window);
+}
+
+G_END_DECLS
diff --git a/chrome/browser/gtk/meta_frames.h b/chrome/browser/gtk/meta_frames.h
new file mode 100644
index 0000000..ef828ef
--- /dev/null
+++ b/chrome/browser/gtk/meta_frames.h
@@ -0,0 +1,38 @@
+// Copyright (c) 2010 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.
+
+#ifndef CHROME_BROWSER_GTK_META_FRAMES_H_
+#define CHROME_BROWSER_GTK_META_FRAMES_H_
+
+#include <gdk/gdk.h>
+#include <gtk/gtkwindow.h>
+
+G_BEGIN_DECLS
+
+// For the sake of gtk+ theme integration, we define a class called
+// "MetaFrames," which is the name of a gobject class in the metacity window
+// manager. To actually get at those values, we need to have an object whose
+// gobject class name string matches the definitions in the gtkrc
+// file. MetaFrames derives from GtkWindow.
+//
+// TODO(erg): http://crbug.com/35317 for getting rid of this hack class, as we
+// should be able to use gtk_rc_get_style_by_path() but can't?
+
+typedef struct _MetaFrames MetaFrames;
+typedef struct _MetaFramesClass MetaFramesClass;
+
+struct _MetaFrames {
+ GtkWindow window;
+};
+
+struct _MetaFramesClass {
+ GtkWindowClass parent_class;
+};
+
+// Creates a GtkWindow object with the class name "MetaFrames".
+GtkWidget* meta_frames_new();
+
+G_END_DECLS
+
+#endif // CHROME_BROWSER_GTK_META_FRAMES_H_
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index b2e1918..af0d8de 100755
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1044,6 +1044,8 @@
'browser/gtk/menu_bar_helper.h',
'browser/gtk/menu_gtk.cc',
'browser/gtk/menu_gtk.h',
+ 'browser/gtk/meta_frames.cc',
+ 'browser/gtk/meta_frames.h',
'browser/gtk/nine_box.cc',
'browser/gtk/nine_box.h',
'browser/gtk/notifications/balloon_view_gtk.cc',