diff options
author | erg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-10 22:39:45 +0000 |
---|---|---|
committer | erg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-10 22:39:45 +0000 |
commit | b2fa86d298e0deade8c6819f54e28e62c756f4e1 (patch) | |
tree | 9f3f082b8e458de7a037bbd74826f57ac86c6f20 /chrome | |
parent | 9420c240cd8428c63530675e25e97702a007a848 (diff) | |
download | chromium_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.cc | 35 | ||||
-rw-r--r-- | chrome/browser/gtk/gtk_theme_provider.h | 8 | ||||
-rw-r--r-- | chrome/browser/gtk/meta_frames.cc | 25 | ||||
-rw-r--r-- | chrome/browser/gtk/meta_frames.h | 38 | ||||
-rwxr-xr-x | chrome/chrome_browser.gypi | 2 |
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', |