Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Unified Diff: chrome/browser/ui/libgtk2ui/gtk2_border.cc

Issue 131513005: linux_aura: Use GTK button borders in GTK theme mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: forgotten Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/libgtk2ui/gtk2_border.cc
diff --git a/chrome/browser/ui/libgtk2ui/gtk2_border.cc b/chrome/browser/ui/libgtk2ui/gtk2_border.cc
new file mode 100644
index 0000000000000000000000000000000000000000..57b6f5da5c0aa506a4d56bac684d4b3cb1d8e5d3
--- /dev/null
+++ b/chrome/browser/ui/libgtk2ui/gtk2_border.cc
@@ -0,0 +1,127 @@
+// Copyright 2014 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/libgtk2ui/gtk2_border.h"
+
+#include <gtk/gtk.h>
+
+#include "chrome/browser/ui/libgtk2ui/gtk2_ui.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/image/image_skia_source.h"
+#include "ui/views/controls/button/custom_button.h"
+
+namespace libgtk2ui {
+
+namespace {
+
+GtkStateType ViewsToGtkState(views::Button::ButtonState state) {
+ switch (state) {
+ case views::Button::STATE_HOVERED:
+ return GTK_STATE_PRELIGHT;
+ case views::Button::STATE_PRESSED:
+ return GTK_STATE_ACTIVE;
+ case views::Button::STATE_DISABLED:
+ return GTK_STATE_INSENSITIVE;
+ default:
+ return GTK_STATE_NORMAL;
+ }
+}
+
+class ButtonImageSkiaSource : public gfx::ImageSkiaSource {
+ public:
+ ButtonImageSkiaSource(const Gtk2UI* gtk2_ui,
+ GtkStateType state,
+ const gfx::Size& size)
+ : gtk2_ui_(gtk2_ui),
+ state_(state),
+ size_(size) {
+ }
+
+ virtual ~ButtonImageSkiaSource() {
+ }
+
+ virtual gfx::ImageSkiaRep GetImageForScale(float scale) OVERRIDE {
+ int w = size_.width() * scale;
+ int h = size_.height() * scale;
+ return gfx::ImageSkiaRep(
+ gtk2_ui_->DrawGtkButtonBorder(state_, w, h), scale);
+ }
+
+ private:
+ const Gtk2UI* gtk2_ui_;
+ GtkStateType state_;
sky 2014/01/22 20:23:59 nit: const and this and size_.
+ gfx::Size size_;
+
+ DISALLOW_COPY_AND_ASSIGN(ButtonImageSkiaSource);
+};
+
+} // namespace
+
+Gtk2Border::Gtk2Border(Gtk2UI* gtk2_ui,
+ views::CustomButton* owning_button,
+ views::Border* border)
+ : gtk2_ui_(gtk2_ui),
+ use_gtk_(gtk2_ui_->GetUseSystemTheme()),
+ owning_button_(owning_button),
+ border_(border) {
+ gtk2_ui_->AddGtkBorder(this);
+}
+
+Gtk2Border::~Gtk2Border() {
+ gtk2_ui_->RemoveGtkBorder(this);
+}
+
+void Gtk2Border::InvalidateAndSetUsesGtk(bool use_gtk) {
+ hovered_ = gfx::ImageSkia();
+ pressed_ = gfx::ImageSkia();
+
+ // Our owning view must have its layout invalidated because the insets could
+ // have changed.
+ owning_button_->InvalidateLayout();
+
+ use_gtk_ = use_gtk;
+}
+
+void Gtk2Border::Paint(const views::View& view, gfx::Canvas* canvas) {
+ if (!use_gtk_) {
+ border_->Paint(view, canvas);
+ return;
+ }
+
+ DCHECK_EQ(&view, owning_button_);
+ GtkStateType state = ViewsToGtkState(owning_button_->state());
+
+ if (state == GTK_STATE_PRELIGHT) {
+ if (hovered_.isNull() || hovered_.size() != view.size()) {
+ hovered_ = gfx::ImageSkia(
+ new ButtonImageSkiaSource(gtk2_ui_, state, view.size()), view.size());
+ }
+
+ canvas->DrawImageInt(hovered_, 0, 0);
+ } else if (state == GTK_STATE_ACTIVE) {
+ if (pressed_.isNull() || pressed_.size() != view.size()) {
+ pressed_ = gfx::ImageSkia(
+ new ButtonImageSkiaSource(gtk2_ui_, state, view.size()), view.size());
+ }
+
+ canvas->DrawImageInt(pressed_, 0, 0);
+ }
+}
+
+gfx::Insets Gtk2Border::GetInsets() const {
+ if (!use_gtk_)
+ return border_->GetInsets();
+
+ return gtk2_ui_->GetButtonInsets();
+}
+
+gfx::Size Gtk2Border::GetMinimumSize() const {
+ if (!use_gtk_)
+ return border_->GetMinimumSize();
+
+ gfx::Insets insets = GetInsets();
+ return gfx::Size(insets.width(), insets.height());
+}
+
+} // namespace libgtk2ui

Powered by Google App Engine
This is Rietveld 408576698