Commit 27713d2c authored by Tom Anderson's avatar Tom Anderson Committed by Commit Bot

Support inactive-styled GTK frame buttons

Please see the demo:
https://bugs.chromium.org/p/chromium/issues/detail?id=753067#c9

BUG=753067
R=erg@chromium.org,sky@chromium.org

Change-Id: Idfc5d9a37f73b22c35339140ad858f4615849556
Reviewed-on: https://chromium-review.googlesource.com/626856Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarElliot Glaysher <erg@chromium.org>
Commit-Queue: Thomas Anderson <thomasanderson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#496492}
parent 255eda8f
...@@ -160,8 +160,12 @@ class NavButtonImageSource : public gfx::ImageSkiaSource { ...@@ -160,8 +160,12 @@ class NavButtonImageSource : public gfx::ImageSkiaSource {
public: public:
NavButtonImageSource(chrome::FrameButtonDisplayType type, NavButtonImageSource(chrome::FrameButtonDisplayType type,
views::Button::ButtonState state, views::Button::ButtonState state,
bool active,
gfx::Size button_size) gfx::Size button_size)
: type_(type), state_(state), button_size_(button_size) {} : type_(type),
state_(state),
active_(active),
button_size_(button_size) {}
~NavButtonImageSource() override {} ~NavButtonImageSource() override {}
...@@ -176,6 +180,10 @@ class NavButtonImageSource : public gfx::ImageSkiaSource { ...@@ -176,6 +180,10 @@ class NavButtonImageSource : public gfx::ImageSkiaSource {
gtk_style_context_add_class(button_context, gtk_style_context_add_class(button_context,
ButtonStyleClassFromButtonType(type_)); ButtonStyleClassFromButtonType(type_));
GtkStateFlags button_state = GtkStateFlagsFromButtonState(state_); GtkStateFlags button_state = GtkStateFlagsFromButtonState(state_);
if (!active_) {
button_state =
static_cast<GtkStateFlags>(button_state | GTK_STATE_FLAG_BACKDROP);
}
gtk_style_context_set_state(button_context, button_state); gtk_style_context_set_state(button_context, button_state);
// Gtk doesn't support fractional scale factors, but chrome does. // Gtk doesn't support fractional scale factors, but chrome does.
...@@ -225,6 +233,7 @@ class NavButtonImageSource : public gfx::ImageSkiaSource { ...@@ -225,6 +233,7 @@ class NavButtonImageSource : public gfx::ImageSkiaSource {
private: private:
chrome::FrameButtonDisplayType type_; chrome::FrameButtonDisplayType type_;
views::Button::ButtonState state_; views::Button::ButtonState state_;
bool active_;
gfx::Size button_size_; gfx::Size button_size_;
}; };
...@@ -234,7 +243,9 @@ NavButtonProviderGtk3::NavButtonProviderGtk3() {} ...@@ -234,7 +243,9 @@ NavButtonProviderGtk3::NavButtonProviderGtk3() {}
NavButtonProviderGtk3::~NavButtonProviderGtk3() {} NavButtonProviderGtk3::~NavButtonProviderGtk3() {}
void NavButtonProviderGtk3::RedrawImages(int top_area_height, bool maximized) { void NavButtonProviderGtk3::RedrawImages(int top_area_height,
bool maximized,
bool active) {
auto header_context = auto header_context =
GetStyleContextFromCss("GtkHeaderBar#headerbar.header-bar.titlebar"); GetStyleContextFromCss("GtkHeaderBar#headerbar.header-bar.titlebar");
...@@ -301,7 +312,8 @@ void NavButtonProviderGtk3::RedrawImages(int top_area_height, bool maximized) { ...@@ -301,7 +312,8 @@ void NavButtonProviderGtk3::RedrawImages(int top_area_height, bool maximized) {
for (size_t state = 0; state < views::Button::STATE_COUNT; state++) { for (size_t state = 0; state < views::Button::STATE_COUNT; state++) {
button_images_[type][state] = gfx::ImageSkia( button_images_[type][state] = gfx::ImageSkia(
std::make_unique<NavButtonImageSource>( std::make_unique<NavButtonImageSource>(
type, static_cast<views::Button::ButtonState>(state), size), type, static_cast<views::Button::ButtonState>(state), active,
size),
size); size);
} }
} }
......
...@@ -21,7 +21,7 @@ class LIBGTKUI_EXPORT NavButtonProviderGtk3 : public views::NavButtonProvider { ...@@ -21,7 +21,7 @@ class LIBGTKUI_EXPORT NavButtonProviderGtk3 : public views::NavButtonProvider {
~NavButtonProviderGtk3() override; ~NavButtonProviderGtk3() override;
// views::NavButtonProvider: // views::NavButtonProvider:
void RedrawImages(int top_area_height, bool maximized) override; void RedrawImages(int top_area_height, bool maximized, bool active) override;
gfx::ImageSkia GetImage(chrome::FrameButtonDisplayType type, gfx::ImageSkia GetImage(chrome::FrameButtonDisplayType type,
views::Button::ButtonState state) const override; views::Button::ButtonState state) const override;
gfx::Insets GetNavButtonMargin( gfx::Insets GetNavButtonMargin(
......
...@@ -104,6 +104,7 @@ class BrowserNonClientFrameView : public views::NonClientFrameView, ...@@ -104,6 +104,7 @@ class BrowserNonClientFrameView : public views::NonClientFrameView,
} }
// views::NonClientFrameView: // views::NonClientFrameView:
void ActivationChanged(bool active) override;
bool DoesIntersectRect(const views::View* target, bool DoesIntersectRect(const views::View* target,
const gfx::Rect& rect) const override; const gfx::Rect& rect) const override;
...@@ -111,7 +112,6 @@ class BrowserNonClientFrameView : public views::NonClientFrameView, ...@@ -111,7 +112,6 @@ class BrowserNonClientFrameView : public views::NonClientFrameView,
// views::NonClientFrameView: // views::NonClientFrameView:
void ViewHierarchyChanged( void ViewHierarchyChanged(
const ViewHierarchyChangedDetails& details) override; const ViewHierarchyChangedDetails& details) override;
void ActivationChanged(bool active) override;
// ProfileAttributesStorage::Observer: // ProfileAttributesStorage::Observer:
void OnProfileAdded(const base::FilePath& profile_path) override; void OnProfileAdded(const base::FilePath& profile_path) override;
......
...@@ -284,7 +284,11 @@ void OpaqueBrowserFrameView::UpdateWindowTitle() { ...@@ -284,7 +284,11 @@ void OpaqueBrowserFrameView::UpdateWindowTitle() {
window_title_->SchedulePaint(); window_title_->SchedulePaint();
} }
void OpaqueBrowserFrameView::SizeConstraintsChanged() { void OpaqueBrowserFrameView::SizeConstraintsChanged() {}
void OpaqueBrowserFrameView::ActivationChanged(bool active) {
BrowserNonClientFrameView::ActivationChanged(active);
MaybeRedrawFrameButtons();
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
...@@ -693,7 +697,8 @@ views::ImageButton* OpaqueBrowserFrameView::GetButtonFromDisplayType( ...@@ -693,7 +697,8 @@ views::ImageButton* OpaqueBrowserFrameView::GetButtonFromDisplayType(
void OpaqueBrowserFrameView::MaybeRedrawFrameButtons() { void OpaqueBrowserFrameView::MaybeRedrawFrameButtons() {
if (ShouldRenderNativeNavButtons()) { if (ShouldRenderNativeNavButtons()) {
nav_button_provider_->RedrawImages(GetTopAreaHeight(), IsMaximized()); nav_button_provider_->RedrawImages(GetTopAreaHeight(), IsMaximized(),
ShouldPaintAsActive());
for (auto type : { for (auto type : {
chrome::FrameButtonDisplayType::kMinimize, chrome::FrameButtonDisplayType::kMinimize,
IsMaximized() ? chrome::FrameButtonDisplayType::kRestore IsMaximized() ? chrome::FrameButtonDisplayType::kRestore
......
...@@ -64,6 +64,7 @@ class OpaqueBrowserFrameView : public BrowserNonClientFrameView, ...@@ -64,6 +64,7 @@ class OpaqueBrowserFrameView : public BrowserNonClientFrameView,
void UpdateWindowIcon() override; void UpdateWindowIcon() override;
void UpdateWindowTitle() override; void UpdateWindowTitle() override;
void SizeConstraintsChanged() override; void SizeConstraintsChanged() override;
void ActivationChanged(bool active) override;
// views::View: // views::View:
void GetAccessibleNodeData(ui::AXNodeData* node_data) override; void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
......
...@@ -130,7 +130,7 @@ class TestNavButtonProvider : public views::NavButtonProvider { ...@@ -130,7 +130,7 @@ class TestNavButtonProvider : public views::NavButtonProvider {
~TestNavButtonProvider() override {} ~TestNavButtonProvider() override {}
void RedrawImages(int top_area_height, bool maximized) override { void RedrawImages(int top_area_height, bool maximized, bool active) override {
ASSERT_EQ(false, maximized); // This only tests the restored state. ASSERT_EQ(false, maximized); // This only tests the restored state.
} }
......
...@@ -22,9 +22,13 @@ class NavButtonProvider { ...@@ -22,9 +22,13 @@ class NavButtonProvider {
public: public:
virtual ~NavButtonProvider() {} virtual ~NavButtonProvider() {}
// If |top_area_height| is different from the cached top area // Redraws all images and updates all size state. |top_area_height|
// height, redraws all button images at the new size. // is the total available height to render the buttons, and buttons
virtual void RedrawImages(int top_area_height, bool maximized) = 0; // may be drawn larger when more height is available. |active|
// indicates if the window the buttons reside in has activation.
virtual void RedrawImages(int top_area_height,
bool maximized,
bool active) = 0;
// Gets the cached button image corresponding to |type| and |state|. // Gets the cached button image corresponding to |type| and |state|.
virtual gfx::ImageSkia GetImage(chrome::FrameButtonDisplayType type, virtual gfx::ImageSkia GetImage(chrome::FrameButtonDisplayType type,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment