summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorerg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-30 21:35:43 +0000
committererg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-30 21:35:43 +0000
commit1c25e879bed12692e57e954b288fa4c4d9c6d5e2 (patch)
treedad94b7ce3a6f087b95cf25ee1a4ee8b7e595afc /chrome
parent174cec74c38d2bb5d861e0e570d69b5dc3bef173 (diff)
downloadchromium_src-1c25e879bed12692e57e954b288fa4c4d9c6d5e2.zip
chromium_src-1c25e879bed12692e57e954b288fa4c4d9c6d5e2.tar.gz
chromium_src-1c25e879bed12692e57e954b288fa4c4d9c6d5e2.tar.bz2
GTK: Popup windows that use the custom frame should use the tab image instead of the frame.
This is how mac does things, and Miranda is going to change the windows version, too. BUG=21672 TEST=none Review URL: http://codereview.chromium.org/1775012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@46121 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/gtk/browser_titlebar.cc11
-rw-r--r--chrome/browser/gtk/browser_window_gtk.cc124
-rw-r--r--chrome/browser/gtk/browser_window_gtk.h14
3 files changed, 109 insertions, 40 deletions
diff --git a/chrome/browser/gtk/browser_titlebar.cc b/chrome/browser/gtk/browser_titlebar.cc
index 9f0030d..4261981 100644
--- a/chrome/browser/gtk/browser_titlebar.cc
+++ b/chrome/browser/gtk/browser_titlebar.cc
@@ -421,8 +421,8 @@ void BrowserTitlebar::UpdateTitlebarAlignment() {
}
void BrowserTitlebar::UpdateTextColor() {
- if (app_mode_title_) {
- if (theme_provider_ && theme_provider_->UseGtkTheme()) {
+ if (app_mode_title_ && theme_provider_) {
+ if (theme_provider_->UseGtkTheme()) {
// We don't really have any good options here.
//
// Colors from window manager themes aren't exposed in GTK; the window
@@ -448,9 +448,10 @@ void BrowserTitlebar::UpdateTextColor() {
&frame_color, &gfx::kGdkWhite, &gfx::kGdkBlack);
gtk_util::SetLabelColor(app_mode_title_, &text_color);
} else {
- // TODO(tc): Seems like this color should be themable, but it's hardcoded
- // to white on Windows. http://crbug.com/18093
- gtk_util::SetLabelColor(app_mode_title_, &gfx::kGdkWhite);
+ GdkColor text_color = theme_provider_->GetGdkColor(window_has_focus_ ?
+ BrowserThemeProvider::COLOR_TAB_TEXT :
+ BrowserThemeProvider::COLOR_BACKGROUND_TAB_TEXT);
+ gtk_util::SetLabelColor(app_mode_title_, &text_color);
}
}
}
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc
index dfddbd8..04a4f9a 100644
--- a/chrome/browser/gtk/browser_window_gtk.cc
+++ b/chrome/browser/gtk/browser_window_gtk.cc
@@ -391,42 +391,15 @@ BrowserWindowGtk::~BrowserWindowGtk() {
gboolean BrowserWindowGtk::OnCustomFrameExpose(GtkWidget* widget,
GdkEventExpose* event,
BrowserWindowGtk* window) {
- GtkThemeProvider* theme_provider = GtkThemeProvider::GetFrom(
- window->browser()->profile());
-
// Draw the default background.
cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window));
gdk_cairo_rectangle(cr, &event->area);
cairo_clip(cr);
- bool off_the_record = window->browser()->profile()->IsOffTheRecord();
- int image_name;
- if (window->IsActive()) {
- image_name = off_the_record ? IDR_THEME_FRAME_INCOGNITO : IDR_THEME_FRAME;
+ if (window->UsingCustomPopupFrame()) {
+ DrawPopupFrame(cr, widget, event, window);
} else {
- image_name = off_the_record ?
- IDR_THEME_FRAME_INCOGNITO_INACTIVE : IDR_THEME_FRAME_INACTIVE;
- }
- CairoCachedSurface* surface = theme_provider->GetSurfaceNamed(
- image_name, widget);
- if (event->area.y < surface->Height()) {
- surface->SetSource(cr,
- 0,
- window->UseCustomFrame() ? 0 : -kCustomFrameBackgroundVerticalOffset);
- // The frame background isn't tiled vertically.
- cairo_pattern_set_extend(cairo_get_source(cr), CAIRO_EXTEND_REPEAT);
- cairo_rectangle(cr, event->area.x, event->area.y,
- event->area.width, surface->Height() - event->area.y);
- cairo_fill(cr);
- }
-
- if (theme_provider->HasCustomImage(IDR_THEME_FRAME_OVERLAY) &&
- !off_the_record) {
- CairoCachedSurface* theme_overlay = theme_provider->GetSurfaceNamed(
- window->IsActive() ? IDR_THEME_FRAME_OVERLAY
- : IDR_THEME_FRAME_OVERLAY_INACTIVE, widget);
- theme_overlay->SetSource(cr, 0, 0);
- cairo_paint(cr);
+ DrawCustomFrame(cr, widget, event, window);
}
DrawContentShadow(cr, window);
@@ -569,6 +542,78 @@ void BrowserWindowGtk::DrawContentShadow(cairo_t* cr,
cairo_fill(cr);
}
+// static
+void BrowserWindowGtk::DrawPopupFrame(cairo_t* cr,
+ GtkWidget* widget,
+ GdkEventExpose* event,
+ BrowserWindowGtk* window) {
+ GtkThemeProvider* theme_provider = GtkThemeProvider::GetFrom(
+ window->browser()->profile());
+
+ // In popups, we use the tab images for the background, as that's legible
+ // for text to be written on.
+ int image_name;
+ if (window->IsActive()) {
+ image_name = IDR_THEME_TOOLBAR;
+ } else {
+ bool off_the_record = window->browser()->profile()->IsOffTheRecord();
+ image_name = off_the_record ? IDR_THEME_TAB_BACKGROUND_INCOGNITO :
+ IDR_THEME_TAB_BACKGROUND;
+ }
+
+ CairoCachedSurface* surface = theme_provider->GetSurfaceNamed(
+ image_name, widget);
+ if (event->area.y < surface->Height()) {
+ surface->SetSource(cr,
+ 0,
+ window->UseCustomFrame() ? 0 : -kCustomFrameBackgroundVerticalOffset);
+ cairo_pattern_set_extend(cairo_get_source(cr), CAIRO_EXTEND_REFLECT);
+ cairo_rectangle(cr, event->area.x, event->area.y,
+ event->area.width, event->area.height);
+ cairo_fill(cr);
+ }
+}
+
+// static
+void BrowserWindowGtk::DrawCustomFrame(cairo_t* cr,
+ GtkWidget* widget,
+ GdkEventExpose* event,
+ BrowserWindowGtk* window) {
+ GtkThemeProvider* theme_provider = GtkThemeProvider::GetFrom(
+ window->browser()->profile());
+
+ bool off_the_record = window->browser()->profile()->IsOffTheRecord();
+ int image_name;
+ if (window->IsActive()) {
+ image_name = off_the_record ? IDR_THEME_FRAME_INCOGNITO : IDR_THEME_FRAME;
+ } else {
+ image_name = off_the_record ? IDR_THEME_FRAME_INCOGNITO_INACTIVE :
+ IDR_THEME_FRAME_INACTIVE;
+ }
+
+ CairoCachedSurface* surface = theme_provider->GetSurfaceNamed(
+ image_name, widget);
+ if (event->area.y < surface->Height()) {
+ surface->SetSource(cr,
+ 0,
+ window->UseCustomFrame() ? 0 : -kCustomFrameBackgroundVerticalOffset);
+ // The frame background isn't tiled vertically.
+ cairo_pattern_set_extend(cairo_get_source(cr), CAIRO_EXTEND_REPEAT);
+ cairo_rectangle(cr, event->area.x, event->area.y,
+ event->area.width, surface->Height() - event->area.y);
+ cairo_fill(cr);
+ }
+
+ if (theme_provider->HasCustomImage(IDR_THEME_FRAME_OVERLAY) &&
+ !off_the_record) {
+ CairoCachedSurface* theme_overlay = theme_provider->GetSurfaceNamed(
+ window->IsActive() ? IDR_THEME_FRAME_OVERLAY
+ : IDR_THEME_FRAME_OVERLAY_INACTIVE, widget);
+ theme_overlay->SetSource(cr, 0, 0);
+ cairo_paint(cr);
+ }
+}
+
void BrowserWindowGtk::Show() {
// The Browser associated with this browser window must become the active
// browser at the time Show() is called. This is the natural behaviour under
@@ -1556,14 +1601,16 @@ void BrowserWindowGtk::SetBackgroundColor() {
Profile* profile = browser()->profile();
GtkThemeProvider* theme_provider = GtkThemeProvider::GetFrom(profile);
int frame_color_id;
- if (IsActive()) {
+ if (UsingCustomPopupFrame()) {
+ frame_color_id = BrowserThemeProvider::COLOR_TOOLBAR;
+ } else if (IsActive()) {
frame_color_id = browser()->profile()->IsOffTheRecord()
- ? BrowserThemeProvider::COLOR_FRAME_INCOGNITO
- : BrowserThemeProvider::COLOR_FRAME;
+ ? BrowserThemeProvider::COLOR_FRAME_INCOGNITO
+ : BrowserThemeProvider::COLOR_FRAME;
} else {
frame_color_id = browser()->profile()->IsOffTheRecord()
- ? BrowserThemeProvider::COLOR_FRAME_INCOGNITO_INACTIVE
- : BrowserThemeProvider::COLOR_FRAME_INACTIVE;
+ ? BrowserThemeProvider::COLOR_FRAME_INCOGNITO_INACTIVE
+ : BrowserThemeProvider::COLOR_FRAME_INACTIVE;
}
SkColor frame_color = theme_provider->GetColor(frame_color_id);
@@ -1971,6 +2018,13 @@ bool BrowserWindowGtk::IsBookmarkBarSupported() const {
return browser_->SupportsWindowFeature(Browser::FEATURE_BOOKMARKBAR);
}
+bool BrowserWindowGtk::UsingCustomPopupFrame() const {
+ GtkThemeProvider* theme_provider = GtkThemeProvider::GetFrom(
+ browser()->profile());
+ return !theme_provider->UseGtkTheme() &&
+ browser()->type() & Browser::TYPE_POPUP;
+}
+
bool BrowserWindowGtk::GetWindowEdge(int x, int y, GdkWindowEdge* edge) {
if (!UseCustomFrame())
return false;
diff --git a/chrome/browser/gtk/browser_window_gtk.h b/chrome/browser/gtk/browser_window_gtk.h
index d193d13..b8f1188 100644
--- a/chrome/browser/gtk/browser_window_gtk.h
+++ b/chrome/browser/gtk/browser_window_gtk.h
@@ -262,6 +262,16 @@ class BrowserWindowGtk : public BrowserWindow,
// border during an expose.
static void DrawContentShadow(cairo_t* cr, BrowserWindowGtk* window);
+ // Draws the tab image as the frame so we can write legible text.
+ static void DrawPopupFrame(cairo_t* cr,
+ GtkWidget* widget, GdkEventExpose* event,
+ BrowserWindowGtk* window);
+
+ // Draws the normal custom frame using theme_frame.
+ static void DrawCustomFrame(cairo_t* cr,
+ GtkWidget* widget, GdkEventExpose* event,
+ BrowserWindowGtk* window);
+
// Callback for accelerator activation. |user_data| stores the command id
// of the matched accelerator.
static gboolean OnGtkAccelerator(GtkAccelGroup* accel_group,
@@ -314,6 +324,10 @@ class BrowserWindowGtk : public BrowserWindow,
bool IsToolbarSupported() const;
bool IsBookmarkBarSupported() const;
+ // Whether we should draw the tab background instead of the theme_frame
+ // background because this window is a popup.
+ bool UsingCustomPopupFrame() const;
+
// Checks to see if the mouse pointer at |x|, |y| is over the border of the
// custom frame (a spot that should trigger a window resize). Returns true if
// it should and sets |edge|.