Index: chrome/browser/ui/panels/panel_browser_window_gtk.cc |
diff --git a/chrome/browser/ui/panels/panel_browser_window_gtk.cc b/chrome/browser/ui/panels/panel_browser_window_gtk.cc |
index d6461451f22d11be0b80bf688d5f647cd6c9b831..ded82d62b1cdc70d8251cb6eed084f8a42ed5602 100644 |
--- a/chrome/browser/ui/panels/panel_browser_window_gtk.cc |
+++ b/chrome/browser/ui/panels/panel_browser_window_gtk.cc |
@@ -8,6 +8,7 @@ |
#include "chrome/browser/ui/browser_list.h" |
#include "chrome/browser/ui/gtk/browser_titlebar.h" |
#include "chrome/browser/ui/gtk/custom_button.h" |
+#include "chrome/browser/ui/gtk/theme_service_gtk.h" |
#include "chrome/browser/ui/panels/panel.h" |
#include "chrome/browser/ui/panels/panel_bounds_animation.h" |
#include "chrome/browser/ui/panels/panel_browser_titlebar_gtk.h" |
@@ -16,27 +17,52 @@ |
#include "chrome/browser/ui/panels/panel_strip.h" |
#include "chrome/common/chrome_notification_types.h" |
#include "content/public/browser/notification_service.h" |
+#include "grit/theme_resources_standard.h" |
+#include "third_party/skia/include/core/SkShader.h" |
+#include "ui/gfx/canvas.h" |
+#include "ui/gfx/image/cairo_cached_surface.h" |
+#include "ui/gfx/image/image.h" |
+#include "ui/gfx/skia_util.h" |
using content::WebContents; |
namespace { |
-// RGB values for titlebar in draw attention state. A shade of orange. |
-const int kDrawAttentionR = 0xfa; |
-const int kDrawAttentionG = 0x98; |
-const int kDrawAttentionB = 0x3a; |
-const float kDrawAttentionRFraction = kDrawAttentionR / 255.0; |
-const float kDrawAttentionGFraction = kDrawAttentionG / 255.0; |
-const float kDrawAttentionBFraction = kDrawAttentionB / 255.0; |
- |
-// Markup for title text in draw attention state. Set to color white. |
-const char* const kDrawAttentionTitleMarkupPrefix = |
- "<span fgcolor='#ffffff'>"; |
-const char* const kDrawAttentionTitleMarkupSuffix = "</span>"; |
+// Colors used to draw titlebar and frame for drawing attention under default |
+// theme. It is also used in non-default theme since attention color is not |
+// defined in the theme. |
+const SkColor kAttentionBackgroundColorStart = SkColorSetRGB(0xff, 0xab, 0x57); |
+const SkColor kAttentionBackgroundColorEnd = SkColorSetRGB(0xe6, 0x9a, 0x4e); |
// Set minimium width for window really small. |
const int kMinWindowWidth = 26; |
+gfx::Image* CreateGradientImage(SkColor start_color, SkColor end_color) { |
+ // Though the height of titlebar, used for creating gradient, cannot be |
+ // pre-determined, we use a reasonably bigger value that is obtained from |
+ // the experimentation and should work for most cases. |
+ const int gradient_size = 32; |
+ SkShader* shader = gfx::CreateGradientShader( |
+ 0, gradient_size, start_color, end_color); |
+ SkPaint paint; |
+ paint.setStyle(SkPaint::kFill_Style); |
+ paint.setAntiAlias(true); |
+ paint.setShader(shader); |
+ shader->unref(); |
+ gfx::Canvas canvas(gfx::Size(1, gradient_size), true); |
+ canvas.DrawRect(gfx::Rect(0, 0, 1, gradient_size), paint); |
+ return new gfx::Image(canvas.ExtractBitmap()); |
+} |
+ |
+gfx::Image* GetAttentionBackgroundImage() { |
+ static gfx::Image* image = NULL; |
+ if (!image) { |
+ image = CreateGradientImage(kAttentionBackgroundColorStart, |
+ kAttentionBackgroundColorEnd); |
+ } |
+ return image; |
+} |
+ |
} // namespace |
NativePanel* Panel::CreateNativePanel(Browser* browser, Panel* panel, |
@@ -84,10 +110,24 @@ void PanelBrowserWindowGtk::Init() { |
content::Source<GtkWindow>(window())); |
} |
+bool PanelBrowserWindowGtk::ShouldDrawContentDropShadow() const { |
+ return !panel_->IsMinimized(); |
+} |
+ |
BrowserTitlebar* PanelBrowserWindowGtk::CreateBrowserTitlebar() { |
return new PanelBrowserTitlebarGtk(this, window()); |
} |
+PanelBrowserTitlebarGtk* PanelBrowserWindowGtk::GetPanelTitlebar() const { |
+ return static_cast<PanelBrowserTitlebarGtk*>(titlebar()); |
+} |
+ |
+PanelBrowserWindowGtk::PaintState PanelBrowserWindowGtk::GetPaintState() const { |
+ if (is_drawing_attention_) |
+ return PAINT_FOR_ATTENTION; |
+ return IsActive() ? PAINT_AS_ACTIVE : PAINT_AS_INACTIVE; |
+} |
+ |
bool PanelBrowserWindowGtk::GetWindowEdge(int x, int y, GdkWindowEdge* edge) { |
// Only detect the window edge when panels can be resized by the user. |
// This method is used by the base class to detect when the cursor has |
@@ -196,51 +236,53 @@ void PanelBrowserWindowGtk::OnSizeChanged(int width, int height) { |
content::NotificationService::NoDetails()); |
} |
-bool PanelBrowserWindowGtk::UseCustomFrame() { |
+bool PanelBrowserWindowGtk::UseCustomFrame() const { |
// We always use custom frame for panels. |
- return TRUE; |
+ return true; |
+} |
+ |
+bool PanelBrowserWindowGtk::UsingCustomPopupFrame() const { |
+ // We do not draw custom popup frame. |
+ return false; |
} |
void PanelBrowserWindowGtk::DrawPopupFrame(cairo_t* cr, |
GtkWidget* widget, |
GdkEventExpose* event) { |
- static_cast<PanelBrowserTitlebarGtk*>(titlebar())-> |
- UpdateMinimizeRestoreButtonVisibility(); |
- |
- BrowserWindowGtk::DrawPopupFrame(cr, widget, event); |
+ NOTREACHED(); |
+} |
+ |
+const gfx::Image* PanelBrowserWindowGtk::GetThemeFrameImage() const { |
+ PaintState paint_state = GetPaintState(); |
+ if (paint_state == PAINT_FOR_ATTENTION) |
+ return GetAttentionBackgroundImage(); |
+ |
+ ThemeServiceGtk* theme_provider = ThemeServiceGtk::GetFrom( |
+ browser()->profile()); |
+ if (theme_provider->UsingDefaultTheme()) { |
+ // We choose to use the window frame theme to paint panels for the default |
+ // theme. This is because the default tab theme does not work well for the |
+ // user to recognize active and inactive panels. |
+ return theme_provider->GetImageNamed(paint_state == PAINT_AS_ACTIVE ? |
+ IDR_THEME_FRAME : IDR_THEME_FRAME_INACTIVE); |
+ } |
- if (is_drawing_attention_) |
- DrawAttentionFrame(cr, widget, event); |
+ return theme_provider->GetImageNamed(paint_state == PAINT_AS_ACTIVE ? |
+ IDR_THEME_TOOLBAR : IDR_THEME_TAB_BACKGROUND); |
} |
void PanelBrowserWindowGtk::DrawCustomFrame(cairo_t* cr, |
GtkWidget* widget, |
GdkEventExpose* event) { |
- static_cast<PanelBrowserTitlebarGtk*>(titlebar())-> |
- UpdateMinimizeRestoreButtonVisibility(); |
- |
- BrowserWindowGtk::DrawCustomFrame(cr, widget, event); |
+ GetPanelTitlebar()->UpdateMinimizeRestoreButtonVisibility(); |
- if (is_drawing_attention_) |
- DrawAttentionFrame(cr, widget, event); |
-} |
- |
-void PanelBrowserWindowGtk::DrawAttentionFrame(cairo_t* cr, |
- GtkWidget* widget, |
- GdkEventExpose* event) { |
- cairo_set_source_rgb(cr, kDrawAttentionRFraction, |
- kDrawAttentionGFraction, |
- kDrawAttentionBFraction); |
- |
- GdkRectangle dest_rectangle = GetTitlebarRectForDrawAttention(); |
- GdkRegion* dest_region = gdk_region_rectangle(&dest_rectangle); |
- |
- gdk_region_intersect(dest_region, event->region); |
- gdk_cairo_region(cr, dest_region); |
+ gfx::CairoCachedSurface* surface = GetThemeFrameImage()->ToCairo(); |
- cairo_clip(cr); |
- cairo_paint(cr); |
- gdk_region_destroy(dest_region); |
+ surface->SetSource(cr, widget, 0, 0); |
+ cairo_pattern_set_extend(cairo_get_source(cr), CAIRO_EXTEND_REPEAT); |
+ cairo_rectangle(cr, event->area.x, event->area.y, |
+ event->area.width, event->area.height); |
+ cairo_fill(cr); |
} |
void PanelBrowserWindowGtk::ActiveWindowChanged(GdkWindow* active_window) { |
@@ -253,27 +295,6 @@ void PanelBrowserWindowGtk::ActiveWindowChanged(GdkWindow* active_window) { |
panel_->OnActiveStateChanged(is_active); |
} |
-BrowserWindowGtk::TitleDecoration PanelBrowserWindowGtk::GetWindowTitle( |
- std::string* title) const { |
- if (is_drawing_attention_) { |
- std::string title_original; |
- BrowserWindowGtk::TitleDecoration title_decoration = |
- BrowserWindowGtk::GetWindowTitle(&title_original); |
- DCHECK_EQ(BrowserWindowGtk::PLAIN_TEXT, title_decoration); |
- gchar* title_escaped = g_markup_escape_text(title_original.c_str(), -1); |
- gchar* title_with_markup = g_strconcat(kDrawAttentionTitleMarkupPrefix, |
- title_escaped, |
- kDrawAttentionTitleMarkupSuffix, |
- NULL); |
- *title = title_with_markup; |
- g_free(title_escaped); |
- g_free(title_with_markup); |
- return BrowserWindowGtk::PANGO_MARKUP; |
- } else { |
- return BrowserWindowGtk::GetWindowTitle(title); |
- } |
-} |
- |
void PanelBrowserWindowGtk::Observe( |
int type, |
const content::NotificationSource& source, |
@@ -411,11 +432,8 @@ void PanelBrowserWindowGtk::DrawAttention(bool draw_attention) { |
is_drawing_attention_ = draw_attention; |
- GdkRectangle rect = GetTitlebarRectForDrawAttention(); |
- gdk_window_invalidate_rect( |
- gtk_widget_get_window(GTK_WIDGET(window())), &rect, TRUE); |
- |
- UpdateTitleBar(); |
+ GetPanelTitlebar()->UpdateTextColor(); |
+ InvalidateWindow(); |
if ((panel_->attention_mode() & Panel::USE_SYSTEM_ATTENTION) != 0) |
::BrowserWindowGtk::FlashFrame(draw_attention); |
@@ -449,12 +467,6 @@ void PanelBrowserWindowGtk::DestroyPanelBrowser() { |
DestroyBrowser(); |
} |
-gfx::Size PanelBrowserWindowGtk::IconOnlySize() const { |
- GtkAllocation allocation; |
- gtk_widget_get_allocation(titlebar_widget(), &allocation); |
- return gfx::Size(titlebar()->IconOnlyWidth(), allocation.height); |
-} |
- |
void PanelBrowserWindowGtk::EnsurePanelFullyVisible() { |
gtk_window_present(window()); |
} |
@@ -505,7 +517,7 @@ bool PanelBrowserWindowGtk::IsAnimatingBounds() const { |
} |
void PanelBrowserWindowGtk::AnimationEnded(const ui::Animation* animation) { |
- titlebar()->SendEnterNotifyToCloseButtonIfUnderMouse(); |
+ GetPanelTitlebar()->SendEnterNotifyToCloseButtonIfUnderMouse(); |
panel_->manager()->OnPanelAnimationEnded(panel_.get()); |
} |
@@ -523,24 +535,6 @@ void PanelBrowserWindowGtk::AnimationProgressed( |
last_animation_progressed_bounds_ = new_bounds; |
} |
-GdkRectangle PanelBrowserWindowGtk::GetTitlebarRectForDrawAttention() const { |
- GdkRectangle rect; |
- rect.x = 0; |
- rect.y = 0; |
- // We get the window width and not the titlebar_widget() width because we'd |
- // like for the window borders on either side of the title bar to be the same |
- // color. |
- GtkAllocation window_allocation; |
- gtk_widget_get_allocation(GTK_WIDGET(window()), &window_allocation); |
- rect.width = window_allocation.width; |
- |
- GtkAllocation titlebar_allocation; |
- gtk_widget_get_allocation(titlebar_widget(), &titlebar_allocation); |
- rect.height = titlebar_allocation.height; |
- |
- return rect; |
-} |
- |
gboolean PanelBrowserWindowGtk::OnTitlebarButtonReleaseEvent( |
GtkWidget* widget, GdkEventButton* event) { |
if (event->button != 1) |
@@ -650,11 +644,7 @@ void NativePanelTestingGtk::FinishDragTitlebar() { |
} |
bool NativePanelTestingGtk::VerifyDrawingAttention() const { |
- std::string title; |
- BrowserWindowGtk::TitleDecoration decoration = |
- panel_browser_window_gtk_->GetWindowTitle(&title); |
- return panel_browser_window_gtk_->IsDrawingAttention() && |
- decoration == BrowserWindowGtk::PANGO_MARKUP; |
+ return panel_browser_window_gtk_->IsDrawingAttention(); |
} |
bool NativePanelTestingGtk::VerifyActiveState(bool is_active) { |
@@ -679,8 +669,8 @@ bool NativePanelTestingGtk::IsAnimatingBounds() const { |
bool NativePanelTestingGtk::IsButtonVisible( |
TitlebarButtonType button_type) const { |
- PanelBrowserTitlebarGtk* titlebar = static_cast<PanelBrowserTitlebarGtk*>( |
- panel_browser_window_gtk_->titlebar()); |
+ PanelBrowserTitlebarGtk* titlebar = |
+ panel_browser_window_gtk_->GetPanelTitlebar(); |
CustomDrawButton* button; |
switch (button_type) { |
case CLOSE_BUTTON: |