From a09f126aeff3217781342c0306f847b71ba69ed6 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 21 Jun 2022 11:19:52 +0200 Subject: [PATCH] fix: WCO respects maximizable/closable/minimizable --- shell/browser/native_window_views.cc | 15 +++++++++++++ .../ui/views/win_caption_button_container.cc | 21 ++++++++++++++++++- .../ui/views/win_caption_button_container.h | 10 ++++----- shell/browser/ui/views/win_frame_view.h | 4 ++++ 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/shell/browser/native_window_views.cc b/shell/browser/native_window_views.cc index bcb9f10c53fc4..096b2555d39ae 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -875,6 +875,11 @@ bool NativeWindowViews::IsMovable() { void NativeWindowViews::SetMinimizable(bool minimizable) { #if defined(OS_WIN) FlipWindowStyle(GetAcceleratedWidget(), minimizable, WS_MINIMIZEBOX); + if (titlebar_overlay_enabled()) { + auto* frame_view = + static_cast(widget()->non_client_view()->frame_view()); + frame_view->caption_button_container()->UpdateButtons(); + } #endif minimizable_ = minimizable; } @@ -890,6 +895,11 @@ bool NativeWindowViews::IsMinimizable() { void NativeWindowViews::SetMaximizable(bool maximizable) { #if defined(OS_WIN) FlipWindowStyle(GetAcceleratedWidget(), maximizable, WS_MAXIMIZEBOX); + if (titlebar_overlay_enabled()) { + auto* frame_view = + static_cast(widget()->non_client_view()->frame_view()); + frame_view->caption_button_container()->UpdateButtons(); + } #endif maximizable_ = maximizable; } @@ -925,6 +935,11 @@ void NativeWindowViews::SetClosable(bool closable) { } else { EnableMenuItem(menu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); } + if (titlebar_overlay_enabled()) { + auto* frame_view = + static_cast(widget()->non_client_view()->frame_view()); + frame_view->caption_button_container()->UpdateButtons(); + } #endif } diff --git a/shell/browser/ui/views/win_caption_button_container.cc b/shell/browser/ui/views/win_caption_button_container.cc index 9995c9741279c..62ce6d9e5b880 100644 --- a/shell/browser/ui/views/win_caption_button_container.cc +++ b/shell/browser/ui/views/win_caption_button_container.cc @@ -148,11 +148,30 @@ void WinCaptionButtonContainer::UpdateButtons() { restore_button_->SetVisible(is_maximized); maximize_button_->SetVisible(!is_maximized); + const bool minimizable = frame_view_->window()->IsMinimizable(); + minimize_button_->SetEnabled(minimizable); + // In touch mode, windows cannot be taken out of fullscreen or tiled mode, so // the maximize/restore button should be disabled. const bool is_touch = ui::TouchUiController::Get()->touch_ui(); restore_button_->SetEnabled(!is_touch); - maximize_button_->SetEnabled(!is_touch); + + // The maximize button should only be enabled if the window is + // maximizable *and* touch mode is disabled. + const bool maximizable = frame_view_->window()->IsMaximizable(); + maximize_button_->SetEnabled(!is_touch && maximizable); + + const bool closable = frame_view_->window()->IsClosable(); + close_button_->SetEnabled(closable); + + // If all three of closable, maximizable, and minimizable are disabled, + // Windows natively only shows the disabled closable button. Copy that + // behavior here. + if (!maximizable && !closable && !minimizable) { + minimize_button_->SetVisible(false); + maximize_button_->SetVisible(false); + } + InvalidateLayout(); } } // namespace electron diff --git a/shell/browser/ui/views/win_caption_button_container.h b/shell/browser/ui/views/win_caption_button_container.h index 9a40ae1be3415..d9a8fa7ca6f54 100644 --- a/shell/browser/ui/views/win_caption_button_container.h +++ b/shell/browser/ui/views/win_caption_button_container.h @@ -41,6 +41,11 @@ class WinCaptionButtonContainer : public views::View, gfx::Size GetButtonSize() const; void SetButtonSize(gfx::Size size); + // Sets caption button visibility and enabled state based on window state. + // Only one of maximize or restore button should ever be visible at the same + // time, and both are disabled in tablet UI mode. + void UpdateButtons(); + private: // views::View: void AddedToWidget() override; @@ -52,11 +57,6 @@ class WinCaptionButtonContainer : public views::View, void ResetWindowControls(); - // Sets caption button visibility and enabled state based on window state. - // Only one of maximize or restore button should ever be visible at the same - // time, and both are disabled in tablet UI mode. - void UpdateButtons(); - WinFrameView* const frame_view_; WinCaptionButton* const minimize_button_; WinCaptionButton* const maximize_button_; diff --git a/shell/browser/ui/views/win_frame_view.h b/shell/browser/ui/views/win_frame_view.h index 76b8e64bd184e..a4dd7d83a5b69 100644 --- a/shell/browser/ui/views/win_frame_view.h +++ b/shell/browser/ui/views/win_frame_view.h @@ -13,6 +13,7 @@ #include "shell/browser/native_window_views.h" #include "shell/browser/ui/views/frameless_view.h" #include "shell/browser/ui/views/win_caption_button.h" +#include "shell/browser/ui/views/win_caption_button_container.h" namespace electron { @@ -43,6 +44,9 @@ class WinFrameView : public FramelessView { NativeWindowViews* window() const { return window_; } views::Widget* frame() const { return frame_; } + WinCaptionButtonContainer* caption_button_container() { + return caption_button_container_; + } bool IsMaximized() const;