| Index: chrome/browser/ui/gtk/custom_button.cc
|
| diff --git a/chrome/browser/ui/gtk/custom_button.cc b/chrome/browser/ui/gtk/custom_button.cc
|
| deleted file mode 100644
|
| index 2a8140b932bf932bfbaabcd9a19dc0fd8520082a..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/gtk/custom_button.cc
|
| +++ /dev/null
|
| @@ -1,397 +0,0 @@
|
| -// Copyright (c) 2012 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/ui/gtk/custom_button.h"
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/debug/trace_event.h"
|
| -#include "base/logging.h"
|
| -#include "chrome/browser/chrome_notification_types.h"
|
| -#include "chrome/browser/ui/gtk/gtk_chrome_button.h"
|
| -#include "chrome/browser/ui/gtk/gtk_theme_service.h"
|
| -#include "chrome/browser/ui/gtk/gtk_util.h"
|
| -#include "content/public/browser/notification_source.h"
|
| -#include "grit/theme_resources.h"
|
| -#include "grit/ui_resources.h"
|
| -#include "third_party/skia/include/core/SkBitmap.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/gtk_util.h"
|
| -#include "ui/gfx/image/cairo_cached_surface.h"
|
| -#include "ui/gfx/image/image.h"
|
| -#include "ui/gfx/skbitmap_operations.h"
|
| -
|
| -namespace {
|
| -
|
| -GdkPixbuf* GetImage(int resource_id) {
|
| - if (!resource_id)
|
| - return NULL;
|
| - return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
|
| - resource_id, ui::ResourceBundle::RTL_ENABLED).ToGdkPixbuf();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -CustomDrawButtonBase::CustomDrawButtonBase(GtkThemeService* theme_provider,
|
| - int normal_id,
|
| - int pressed_id,
|
| - int hover_id,
|
| - int disabled_id)
|
| - : paint_override_(-1),
|
| - normal_id_(normal_id),
|
| - pressed_id_(pressed_id),
|
| - hover_id_(hover_id),
|
| - disabled_id_(disabled_id),
|
| - theme_service_(theme_provider),
|
| - flipped_(false) {
|
| - for (int i = 0; i < (GTK_STATE_INSENSITIVE + 1); ++i)
|
| - surfaces_[i].reset(new gfx::CairoCachedSurface);
|
| - background_image_.reset(new gfx::CairoCachedSurface);
|
| -
|
| - if (theme_provider) {
|
| - // Load images by pretending that we got a BROWSER_THEME_CHANGED
|
| - // notification.
|
| - theme_provider->InitThemesFor(this);
|
| -
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
|
| - content::Source<ThemeService>(theme_provider));
|
| - } else {
|
| - // Load the button images from the resource bundle.
|
| - surfaces_[GTK_STATE_NORMAL]->UsePixbuf(GetImage(normal_id_));
|
| - surfaces_[GTK_STATE_ACTIVE]->UsePixbuf(GetImage(pressed_id_));
|
| - surfaces_[GTK_STATE_PRELIGHT]->UsePixbuf(GetImage(hover_id_));
|
| - surfaces_[GTK_STATE_SELECTED]->UsePixbuf(NULL);
|
| - surfaces_[GTK_STATE_INSENSITIVE]->UsePixbuf(GetImage(disabled_id_));
|
| - }
|
| -}
|
| -
|
| -CustomDrawButtonBase::~CustomDrawButtonBase() {
|
| -}
|
| -
|
| -int CustomDrawButtonBase::Width() const {
|
| - return surfaces_[0]->Width();
|
| -}
|
| -
|
| -int CustomDrawButtonBase::Height() const {
|
| - return surfaces_[0]->Height();
|
| -}
|
| -
|
| -gboolean CustomDrawButtonBase::OnExpose(GtkWidget* widget,
|
| - GdkEventExpose* e,
|
| - gdouble hover_state) {
|
| - TRACE_EVENT0("ui::gtk", "CustomDrawButtonBase::OnExpose");
|
| - int paint_state = paint_override_ >= 0 ?
|
| - paint_override_ : gtk_widget_get_state(widget);
|
| -
|
| - // If the paint state is PRELIGHT then set it to NORMAL (we will paint the
|
| - // hover state according to |hover_state_|).
|
| - if (paint_state == GTK_STATE_PRELIGHT)
|
| - paint_state = GTK_STATE_NORMAL;
|
| - bool animating_hover = hover_state > 0.0 &&
|
| - paint_state == GTK_STATE_NORMAL;
|
| - gfx::CairoCachedSurface* pixbuf = PixbufForState(paint_state);
|
| - gfx::CairoCachedSurface* hover_pixbuf = PixbufForState(GTK_STATE_PRELIGHT);
|
| -
|
| - if (!pixbuf || !pixbuf->valid())
|
| - return FALSE;
|
| - if (animating_hover && (!hover_pixbuf || !hover_pixbuf->valid()))
|
| - return FALSE;
|
| -
|
| - cairo_t* cairo_context = gdk_cairo_create(GDK_DRAWABLE(
|
| - gtk_widget_get_window(widget)));
|
| - GtkAllocation allocation;
|
| - gtk_widget_get_allocation(widget, &allocation);
|
| - cairo_translate(cairo_context, allocation.x, allocation.y);
|
| -
|
| - if (flipped_) {
|
| - // Horizontally flip the image for non-LTR/RTL reasons.
|
| - cairo_translate(cairo_context, allocation.width, 0.0f);
|
| - cairo_scale(cairo_context, -1.0f, 1.0f);
|
| - }
|
| -
|
| - // The widget might be larger than the pixbuf. Paint the pixbuf flush with the
|
| - // start of the widget (left for LTR, right for RTL) and its bottom.
|
| - gfx::Rect bounds = gfx::Rect(0, 0, pixbuf->Width(), 0);
|
| - int x = gtk_util::MirroredLeftPointForRect(widget, bounds);
|
| - int y = allocation.height - pixbuf->Height();
|
| -
|
| - if (background_image_->valid()) {
|
| - background_image_->SetSource(cairo_context, widget, x, y);
|
| - cairo_paint(cairo_context);
|
| - }
|
| -
|
| - pixbuf->SetSource(cairo_context, widget, x, y);
|
| - cairo_paint(cairo_context);
|
| -
|
| - if (animating_hover) {
|
| - hover_pixbuf->SetSource(cairo_context, widget, x, y);
|
| - cairo_paint_with_alpha(cairo_context, hover_state);
|
| - }
|
| -
|
| - cairo_destroy(cairo_context);
|
| -
|
| - GtkWidget* child = gtk_bin_get_child(GTK_BIN(widget));
|
| - if (child)
|
| - gtk_container_propagate_expose(GTK_CONTAINER(widget), child, e);
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| -void CustomDrawButtonBase::SetBackground(SkColor color,
|
| - const SkBitmap& image,
|
| - const SkBitmap& mask) {
|
| - if (image.isNull() || mask.isNull()) {
|
| - if (background_image_->valid()) {
|
| - background_image_->UsePixbuf(NULL);
|
| - }
|
| - } else {
|
| - SkBitmap img =
|
| - SkBitmapOperations::CreateButtonBackground(color, image, mask);
|
| -
|
| - GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(img);
|
| - background_image_->UsePixbuf(pixbuf);
|
| - g_object_unref(pixbuf);
|
| - }
|
| -}
|
| -
|
| -void CustomDrawButtonBase::Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - DCHECK(theme_service_);
|
| - DCHECK(chrome::NOTIFICATION_BROWSER_THEME_CHANGED == type);
|
| -
|
| - surfaces_[GTK_STATE_NORMAL]->UsePixbuf(normal_id_ ?
|
| - theme_service_->GetRTLEnabledPixbufNamed(normal_id_) : NULL);
|
| - surfaces_[GTK_STATE_ACTIVE]->UsePixbuf(pressed_id_ ?
|
| - theme_service_->GetRTLEnabledPixbufNamed(pressed_id_) : NULL);
|
| - surfaces_[GTK_STATE_PRELIGHT]->UsePixbuf(hover_id_ ?
|
| - theme_service_->GetRTLEnabledPixbufNamed(hover_id_) : NULL);
|
| - surfaces_[GTK_STATE_SELECTED]->UsePixbuf(NULL);
|
| - surfaces_[GTK_STATE_INSENSITIVE]->UsePixbuf(disabled_id_ ?
|
| - theme_service_->GetRTLEnabledPixbufNamed(disabled_id_) : NULL);
|
| -}
|
| -
|
| -gfx::CairoCachedSurface* CustomDrawButtonBase::PixbufForState(int state) {
|
| - gfx::CairoCachedSurface* pixbuf = surfaces_[state].get();
|
| -
|
| - // Fall back to the default image if we don't have one for this state.
|
| - if (!pixbuf || !pixbuf->valid())
|
| - pixbuf = surfaces_[GTK_STATE_NORMAL].get();
|
| -
|
| - return pixbuf;
|
| -}
|
| -
|
| -// CustomDrawHoverController ---------------------------------------------------
|
| -
|
| -CustomDrawHoverController::CustomDrawHoverController(GtkWidget* widget)
|
| - : slide_animation_(this),
|
| - widget_(NULL) {
|
| - Init(widget);
|
| -}
|
| -
|
| -CustomDrawHoverController::CustomDrawHoverController()
|
| - : slide_animation_(this),
|
| - widget_(NULL) {
|
| -}
|
| -
|
| -CustomDrawHoverController::~CustomDrawHoverController() {
|
| -}
|
| -
|
| -void CustomDrawHoverController::Init(GtkWidget* widget) {
|
| - DCHECK(widget_ == NULL);
|
| - widget_ = widget;
|
| - g_signal_connect(widget_, "enter-notify-event",
|
| - G_CALLBACK(OnEnterThunk), this);
|
| - g_signal_connect(widget_, "leave-notify-event",
|
| - G_CALLBACK(OnLeaveThunk), this);
|
| -}
|
| -
|
| -void CustomDrawHoverController::AnimationProgressed(
|
| - const gfx::Animation* animation) {
|
| - gtk_widget_queue_draw(widget_);
|
| -}
|
| -
|
| -gboolean CustomDrawHoverController::OnEnter(
|
| - GtkWidget* widget,
|
| - GdkEventCrossing* event) {
|
| - slide_animation_.Show();
|
| - return FALSE;
|
| -}
|
| -
|
| -gboolean CustomDrawHoverController::OnLeave(
|
| - GtkWidget* widget,
|
| - GdkEventCrossing* event) {
|
| - // When the user is holding a mouse button, we don't want to animate.
|
| - if (event->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK))
|
| - slide_animation_.Reset();
|
| - else
|
| - slide_animation_.Hide();
|
| - return FALSE;
|
| -}
|
| -
|
| -// CustomDrawButton ------------------------------------------------------------
|
| -
|
| -CustomDrawButton::CustomDrawButton(int normal_id,
|
| - int pressed_id,
|
| - int hover_id,
|
| - int disabled_id)
|
| - : button_base_(NULL, normal_id, pressed_id, hover_id, disabled_id),
|
| - theme_service_(NULL),
|
| - forcing_chrome_theme_(false) {
|
| - Init();
|
| -
|
| - // Initialize the theme stuff with no theme_provider.
|
| - SetBrowserTheme();
|
| -}
|
| -
|
| -CustomDrawButton::CustomDrawButton(GtkThemeService* theme_provider,
|
| - int normal_id,
|
| - int pressed_id,
|
| - int hover_id,
|
| - int disabled_id,
|
| - const char* stock_id,
|
| - GtkIconSize stock_size)
|
| - : button_base_(theme_provider, normal_id, pressed_id, hover_id,
|
| - disabled_id),
|
| - theme_service_(theme_provider),
|
| - forcing_chrome_theme_(false) {
|
| - native_widget_.Own(gtk_image_new_from_stock(stock_id, stock_size));
|
| -
|
| - Init();
|
| -
|
| - theme_service_->InitThemesFor(this);
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
|
| - content::Source<ThemeService>(theme_provider));
|
| -}
|
| -
|
| -CustomDrawButton::CustomDrawButton(GtkThemeService* theme_provider,
|
| - int normal_id,
|
| - int pressed_id,
|
| - int hover_id,
|
| - int disabled_id,
|
| - GtkWidget* native_widget)
|
| - : button_base_(theme_provider, normal_id, pressed_id, hover_id,
|
| - disabled_id),
|
| - native_widget_(native_widget),
|
| - theme_service_(theme_provider),
|
| - forcing_chrome_theme_(false) {
|
| - Init();
|
| -
|
| - theme_service_->InitThemesFor(this);
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
|
| - content::Source<ThemeService>(theme_provider));
|
| -}
|
| -
|
| -CustomDrawButton::~CustomDrawButton() {
|
| - widget_.Destroy();
|
| - native_widget_.Destroy();
|
| -}
|
| -
|
| -void CustomDrawButton::Init() {
|
| - widget_.Own(gtk_chrome_button_new());
|
| - gtk_widget_set_can_focus(widget(), FALSE);
|
| - g_signal_connect(widget(), "expose-event",
|
| - G_CALLBACK(OnCustomExposeThunk), this);
|
| - hover_controller_.Init(widget());
|
| -}
|
| -
|
| -void CustomDrawButton::ForceChromeTheme() {
|
| - forcing_chrome_theme_ = true;
|
| - SetBrowserTheme();
|
| -}
|
| -
|
| -void CustomDrawButton::Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - DCHECK(chrome::NOTIFICATION_BROWSER_THEME_CHANGED == type);
|
| - SetBrowserTheme();
|
| -}
|
| -
|
| -GtkAllocation CustomDrawButton::WidgetAllocation() const {
|
| - GtkAllocation allocation;
|
| - gtk_widget_get_allocation(widget_.get(), &allocation);
|
| - return allocation;
|
| -}
|
| -
|
| -int CustomDrawButton::SurfaceWidth() const {
|
| - return button_base_.Width();
|
| -}
|
| -
|
| -int CustomDrawButton::SurfaceHeight() const {
|
| - return button_base_.Height();
|
| -}
|
| -
|
| -void CustomDrawButton::SetPaintOverride(GtkStateType state) {
|
| - button_base_.set_paint_override(state);
|
| - gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(widget()), state);
|
| - gtk_widget_queue_draw(widget());
|
| -}
|
| -
|
| -void CustomDrawButton::UnsetPaintOverride() {
|
| - button_base_.set_paint_override(-1);
|
| - gtk_chrome_button_unset_paint_state(GTK_CHROME_BUTTON(widget()));
|
| - gtk_widget_queue_draw(widget());
|
| -}
|
| -
|
| -void CustomDrawButton::SetBackground(SkColor color,
|
| - const SkBitmap& image,
|
| - const SkBitmap& mask) {
|
| - button_base_.SetBackground(color, image, mask);
|
| -}
|
| -
|
| -gboolean CustomDrawButton::OnCustomExpose(GtkWidget* sender,
|
| - GdkEventExpose* e) {
|
| - UNSHIPPED_TRACE_EVENT0("ui::gtk", "CustomDrawButtonBase::OnCustomExpose");
|
| - if (UseGtkTheme()) {
|
| - // Continue processing this expose event.
|
| - return FALSE;
|
| - } else {
|
| - double hover_state = hover_controller_.GetCurrentValue();
|
| - return button_base_.OnExpose(sender, e, hover_state);
|
| - }
|
| -}
|
| -
|
| -// static
|
| -CustomDrawButton* CustomDrawButton::CloseButtonBar(
|
| - GtkThemeService* theme_provider) {
|
| - CustomDrawButton* button = new CustomDrawButton(theme_provider,
|
| - IDR_CLOSE_1, IDR_CLOSE_1_P, IDR_CLOSE_1_H, 0,
|
| - GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
|
| - return button;
|
| -}
|
| -
|
| -// static
|
| -CustomDrawButton* CustomDrawButton::CloseButtonBubble(
|
| - GtkThemeService* theme_provider) {
|
| - CustomDrawButton* button = new CustomDrawButton(theme_provider,
|
| - IDR_CLOSE_2, IDR_CLOSE_2_P, IDR_CLOSE_2_H, 0,
|
| - GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
|
| - return button;
|
| -}
|
| -
|
| -void CustomDrawButton::SetBrowserTheme() {
|
| - if (UseGtkTheme()) {
|
| - if (native_widget_.get())
|
| - gtk_button_set_image(GTK_BUTTON(widget()), native_widget_.get());
|
| - gtk_widget_set_size_request(widget(), -1, -1);
|
| - gtk_widget_set_app_paintable(widget(), FALSE);
|
| - } else {
|
| - if (native_widget_.get())
|
| - gtk_button_set_image(GTK_BUTTON(widget()), NULL);
|
| - gtk_widget_set_size_request(widget(), button_base_.Width(),
|
| - button_base_.Height());
|
| -
|
| - gtk_widget_set_app_paintable(widget(), TRUE);
|
| - }
|
| -
|
| - gtk_chrome_button_set_use_gtk_rendering(
|
| - GTK_CHROME_BUTTON(widget()), UseGtkTheme());
|
| -}
|
| -
|
| -bool CustomDrawButton::UseGtkTheme() {
|
| - return !forcing_chrome_theme_ && theme_service_ &&
|
| - theme_service_->UsingNativeTheme();
|
| -}
|
|
|