172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_UI_GTK_TABS_TAB_RENDERER_GTK_H_ 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_UI_GTK_TABS_TAB_RENDERER_GTK_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map> 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/owned_widget_gtk.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_observer.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_registrar.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/core/SkBitmap.h" 193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation_delegate.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/gtk/gtk_signal.h" 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas.h" 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/font.h" 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace gfx { 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Size; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace gfx 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CustomDrawButton; 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass GtkThemeService; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents; 323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace ui { 343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass SlideAnimation; 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ThemeProvider; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ThrobAnimation; 373f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass TabRendererGtk : public ui::AnimationDelegate, 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public NotificationObserver { 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Possible animation states. 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum AnimationState { 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ANIMATION_NONE, 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ANIMATION_WAITING, 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ANIMATION_LOADING 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class LoadingAnimation : public NotificationObserver { 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct Data { 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen explicit Data(ui::ThemeProvider* theme_provider); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Data(int loading, int waiting, int waiting_to_loading); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkBitmap* waiting_animation_frames; 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkBitmap* loading_animation_frames; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int loading_animation_frame_count; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int waiting_animation_frame_count; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int waiting_to_loading_frame_count_ratio; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen explicit LoadingAnimation(ui::ThemeProvider* theme_provider); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Used in unit tests to inject specific data. 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit LoadingAnimation(const LoadingAnimation::Data& data); 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual ~LoadingAnimation(); 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Advance the loading animation to the next frame, or hide the animation if 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the tab isn't loading. Returns |true| if the icon area needs to be 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // repainted. 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ValidateLoadingAnimation(AnimationState animation_state); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AnimationState animation_state() const { return animation_state_; } 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int animation_frame() const { return animation_frame_; } 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SkBitmap* waiting_animation_frames() const { 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return data_->waiting_animation_frames; 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SkBitmap* loading_animation_frames() const { 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return data_->loading_animation_frames; 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Provide NotificationObserver implementation. 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Observe(NotificationType type, 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<Data> data_; 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Used to listen for theme change notifications. 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationRegistrar registrar_; 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Gives us our throbber images. 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ui::ThemeProvider* theme_service_; 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Current state of the animation. 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AnimationState animation_state_; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The current index into the Animation image strip. 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int animation_frame_; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(LoadingAnimation); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen explicit TabRendererGtk(ui::ThemeProvider* theme_provider); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~TabRendererGtk(); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TabContents. If only the loading state was updated, the loading_only flag 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // should be specified. If other things change, set this flag to false to 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // update everything. 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void UpdateData(TabContents* contents, bool app, bool loading_only); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the blocked state of the tab. 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetBlocked(bool pinned); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_blocked() const; 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the mini-state of the tab. 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_mini(bool mini) { data_.mini = mini; } 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool mini() const { return data_.mini; } 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the app state of the tab. 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_app(bool app) { data_.app = app; } 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool app() const { return data_.app; } 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Are we in the process of animating a mini tab state change on this tab? 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_animating_mini_change(bool value) { 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data_.animating_mini_change = value; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Updates the display to reflect the contents of this TabRenderer's model. 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void UpdateFromModel(); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true if the Tab is selected, false otherwise. 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool IsSelected() const; 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true if the Tab is visible, false otherwise. 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool IsVisible() const; 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the visibility of the Tab. 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetVisible(bool visible) const; 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Paints the tab into |canvas|. 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Paint(gfx::Canvas* canvas); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Paints the tab into a SkBitmap. 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual SkBitmap PaintBitmap(); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Paints the tab, and keeps the result server-side. The returned surface must 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be freed with cairo_surface_destroy(). 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual cairo_surface_t* PaintToSurface(); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // There is no PaintNow available, so the fastest we can do is schedule a 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // paint with the windowing system. 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SchedulePaint(); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notifies the Tab that the close button has been clicked. 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void CloseButtonClicked(); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the bounds of the tab. 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetBounds(const gfx::Rect& bounds); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Provide NotificationObserver implementation. 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Observe(NotificationType type, 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Advance the loading animation to the next frame, or hide the animation if 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the tab isn't loading. Returns |true| if the icon area needs to be 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // repainted. 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ValidateLoadingAnimation(AnimationState animation_state); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Repaint only the area of the tab that contains the favicon. 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void PaintFaviconArea(GdkEventExpose* event); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns whether the Tab should display a favicon. 178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool ShouldShowIcon() const; 179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the minimum possible size of a single unselected Tab. 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static gfx::Size GetMinimumUnselectedSize(); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the minimum possible size of a selected Tab. Selected tabs must 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // always show a close button and have a larger minimum size than unselected 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // tabs. 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static gfx::Size GetMinimumSelectedSize(); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the preferred size of a single Tab, assuming space is 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // available. 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static gfx::Size GetStandardSize(); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the width for mini-tabs. Mini-tabs always have this width. 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static int GetMiniWidth(); 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Loads the images to be used for the tab background. 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void LoadTabImages(); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the colors used for painting text on the tabs. 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void SetSelectedTitleColor(SkColor color); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void SetUnselectedTitleColor(SkColor color); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static gfx::Font* title_font() { return title_font_; } 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the bounds of the Tab. 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int x() const { return bounds_.x(); } 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int y() const { return bounds_.y(); } 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int width() const { return bounds_.width(); } 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int height() const { return bounds_.height(); } 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect bounds() const { return bounds_; } 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect favicon_bounds() const { return favicon_bounds_; } 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the non-mirrored (LTR) bounds of this tab. 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect GetNonMirroredBounds(GtkWidget* parent) const; 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the requested bounds of the tab. 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect GetRequisition() const; 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* widget() const { return tab_.get(); } 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start/stop the mini-tab title animation. 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StartMiniTabTitleAnimation(); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StopMiniTabTitleAnimation(); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_vertical_offset(int offset) { background_offset_y_ = offset; } 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Rect& title_bounds() const { return title_bounds_; } 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Rect& close_button_bounds() const { return close_button_bounds_; } 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the title of the Tab. 2313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen string16 GetTitle() const; 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // enter-notify-event handler that signals when the mouse enters the tab. 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_1(TabRendererGtk, gboolean, OnEnterNotifyEvent, 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkEventCrossing*); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // leave-notify-event handler that signals when the mouse enters the tab. 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_1(TabRendererGtk, gboolean, OnLeaveNotifyEvent, 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkEventCrossing*); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen class FaviconCrashAnimation; 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The data structure used to hold cached bitmaps. We need to manually free 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the bitmap in CachedBitmap when we remove it from |cached_bitmaps_|. We 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // handle this when we replace images in the map and in the destructor. 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct CachedBitmap { 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int bg_offset_x; 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int bg_offset_y; 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkBitmap* bitmap; 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::map<std::pair<const SkBitmap*, const SkBitmap*>, CachedBitmap> 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BitmapCache; 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Model data. We store this here so that we don't need to ask the underlying 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // model, which is tricky since instances of this object can outlive the 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // corresponding objects in the underlying model. 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct TabData { 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabData() 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : is_default_favicon(false), 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch loading(false), 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch crashed(false), 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen incognito(false), 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch show_icon(true), 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mini(false), 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch blocked(false), 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch animating_mini_change(false), 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch app(false) { 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkBitmap favicon; 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_default_favicon; 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 title; 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool loading; 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool crashed; 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool incognito; 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool show_icon; 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool mini; 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool blocked; 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool animating_mini_change; 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool app; 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(jhawkins): Move into TabResources class. 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct TabImage { 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkBitmap* image_l; 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkBitmap* image_c; 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkBitmap* image_r; 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int l_width; 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int r_width; 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int y_offset; 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Overridden from ui::AnimationDelegate: 2953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen virtual void AnimationProgressed(const ui::Animation* animation); 2963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen virtual void AnimationCanceled(const ui::Animation* animation); 2973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen virtual void AnimationEnded(const ui::Animation* animation); 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Starts/Stops the crash animation. 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StartCrashAnimation(); 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StopCrashAnimation(); 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Return true if the crash animation is currently running. 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool IsPerformingCrashAnimation() const; 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set the temporary offset for the favicon. This is used during animation. 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetFaviconHidingOffset(int offset); 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void DisplayCrashedFavicon(); 310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void ResetCrashedFavicon(); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Generates the bounds for the interior items of the tab. 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Layout(); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the local bounds of the tab. This returns the rect 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // {0, 0, width(), height()} for now, as we don't yet support borders. 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect GetLocalBounds(); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Moves the close button widget within the GtkFixed container. 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void MoveCloseButtonWidget(); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the largest of the favicon, title text, and the close button. 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static int GetContentHeight(); 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A helper method for generating the masked bitmaps used to draw the curved 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // edges of tabs. We cache the generated bitmaps because they can take a 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // long time to compute. 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkBitmap* GetMaskedBitmap(const SkBitmap* mask, 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SkBitmap* background, 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int bg_offset_x, 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int bg_offset_y); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BitmapCache cached_bitmaps_; 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Paints the tab, minus the close button. 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PaintTab(GdkEventExpose* event); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Paint various portions of the Tab 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PaintTitle(gfx::Canvas* canvas); 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PaintIcon(gfx::Canvas* canvas); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PaintTabBackground(gfx::Canvas* canvas); 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PaintInactiveTabBackground(gfx::Canvas* canvas); 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PaintActiveTabBackground(gfx::Canvas* canvas); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PaintLoadingAnimation(gfx::Canvas* canvas); 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the number of favicon-size elements that can fit in the tab's 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // current size. 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int IconCapacity() const; 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns whether the Tab should display a close button. 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ShouldShowCloseBox() const; 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CustomDrawButton* MakeCloseButton(); 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Gets the throb value for the tab. When a tab is not selected the 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // active background is drawn at |GetThrobValue()|%. This is used for hover 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // and mini-tab title change effects. 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch double GetThrobValue(); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Handles the clicked signal for the close button. 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_0(TabRendererGtk, void, OnCloseButtonClicked); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Handles middle clicking the close button. 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_1(TabRendererGtk, gboolean, OnCloseButtonMouseRelease, 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkEventButton*); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // expose-event handler that redraws the tab. 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_1(TabRendererGtk, gboolean, OnExposeEvent, 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkEventExpose*); 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // size-allocate handler used to update the current bounds of the tab. 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHROMEGTK_CALLBACK_1(TabRendererGtk, void, OnSizeAllocate, GtkAllocation*); 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(jhawkins): Move to TabResources. 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void InitResources(); 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool initialized_; 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The bounds of various sections of the display. 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect favicon_bounds_; 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect title_bounds_; 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect close_button_bounds_; 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabData data_; 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static TabImage tab_active_; 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static TabImage tab_inactive_; 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static TabImage tab_alpha_; 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static gfx::Font* title_font_; 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static int title_font_height_; 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static int close_button_width_; 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static int close_button_height_; 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static SkColor selected_title_color_; 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static SkColor unselected_title_color_; 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The GtkDrawingArea we draw the tab on. 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OwnedWidgetGtk tab_; 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether we're showing the icon. It is cached so that we can detect when it 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // changes and layout appropriately. 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool showing_icon_; 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether we are showing the close button. It is cached so that we can 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // detect when it changes and layout appropriately. 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool showing_close_button_; 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The offset used to animate the favicon location. 410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int favicon_hiding_offset_; 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The animation object used to swap the favicon with the sad tab icon. 413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<FaviconCrashAnimation> crash_animation_; 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set when the crashed favicon should be displayed. 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool should_display_crashed_favicon_; 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The bounds of this Tab. 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect bounds_; 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The requested bounds of this tab. These bounds are relative to the 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // tabstrip. 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::Rect requisition_; 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Hover animation. 4263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen scoped_ptr<ui::SlideAnimation> hover_animation_; 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Animation used when the title of an inactive mini-tab changes. 4293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen scoped_ptr<ui::ThrobAnimation> mini_title_animation_; 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Contains the loading animation state. 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LoadingAnimation loading_animation_; 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The offset used to paint the tab theme images. 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int background_offset_x_; 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The vertical offset used to paint the tab theme images. Controlled by the 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // tabstrip and plumbed here to offset the theme image by the size of the 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // alignment in the BrowserTitlebar. 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int background_offset_y_; 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GtkThemeService* theme_service_; 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The close button. 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<CustomDrawButton> close_button_; 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The current color of the close button. 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkColor close_button_color_; 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Used to listen for theme change notifications. 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationRegistrar registrar_; 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(TabRendererGtk); 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif // CHROME_BROWSER_UI_GTK_TABS_TAB_RENDERER_GTK_H_ 457