Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: WCO respects maximizable/closable/minimizable #34733

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 15 additions & 0 deletions shell/browser/native_window_views.cc
Expand Up @@ -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<WinFrameView*>(widget()->non_client_view()->frame_view());
frame_view->caption_button_container()->UpdateButtons();
}
#endif
minimizable_ = minimizable;
}
Expand All @@ -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<WinFrameView*>(widget()->non_client_view()->frame_view());
frame_view->caption_button_container()->UpdateButtons();
}
#endif
maximizable_ = maximizable;
}
Expand Down Expand Up @@ -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<WinFrameView*>(widget()->non_client_view()->frame_view());
frame_view->caption_button_container()->UpdateButtons();
}
#endif
}

Expand Down
21 changes: 20 additions & 1 deletion shell/browser/ui/views/win_caption_button_container.cc
Expand Up @@ -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
10 changes: 5 additions & 5 deletions shell/browser/ui/views/win_caption_button_container.h
Expand Up @@ -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;
Expand All @@ -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_;
Expand Down
4 changes: 4 additions & 0 deletions shell/browser/ui/views/win_frame_view.h
Expand Up @@ -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 {

Expand Down Expand Up @@ -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;

Expand Down