From 64c98db02427b6832a899a8dabf3bdfbf604c122 Mon Sep 17 00:00:00 2001 From: "Dustin L. Howett (MSFT)" Date: Wed, 2 Oct 2019 10:27:07 -0700 Subject: [PATCH] Propagate window style changes to the titlebar and minmax (#3025) Fixes #1780 --- .../TerminalApp/MinMaxCloseControl.cpp | 25 +++++++++++-------- src/cascadia/TerminalApp/MinMaxCloseControl.h | 3 +-- .../TerminalApp/MinMaxCloseControl.idl | 5 ++-- src/cascadia/TerminalApp/TitlebarControl.cpp | 7 ++++-- src/cascadia/TerminalApp/TitlebarControl.h | 2 ++ src/cascadia/TerminalApp/TitlebarControl.idl | 8 ++++++ .../WindowsTerminal/NonClientIslandWindow.cpp | 14 ++++++++--- 7 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/cascadia/TerminalApp/MinMaxCloseControl.cpp b/src/cascadia/TerminalApp/MinMaxCloseControl.cpp index bacdd5367..391ec79d5 100644 --- a/src/cascadia/TerminalApp/MinMaxCloseControl.cpp +++ b/src/cascadia/TerminalApp/MinMaxCloseControl.cpp @@ -19,16 +19,6 @@ namespace winrt::TerminalApp::implementation InitializeComponent(); } - void MinMaxCloseControl::Maximize() - { - VisualStateManager::GoToState(MaximizeButton(), L"WindowStateMaximized", false); - } - - void MinMaxCloseControl::RestoreDown() - { - VisualStateManager::GoToState(MaximizeButton(), L"WindowStateNormal", false); - } - // These event handlers simply forward each buttons click events up to the // events we've exposed. void MinMaxCloseControl::_MinimizeClick(winrt::Windows::Foundation::IInspectable const& sender, @@ -48,6 +38,21 @@ namespace winrt::TerminalApp::implementation _closeClickHandlers(*this, e); } + void MinMaxCloseControl::SetWindowVisualState(WindowVisualState visualState) + { + switch (visualState) + { + case WindowVisualState::WindowVisualStateMaximized: + winrt::Windows::UI::Xaml::VisualStateManager::GoToState(MaximizeButton(), L"WindowStateMaximized", false); + break; + case WindowVisualState::WindowVisualStateNormal: + case WindowVisualState::WindowVisualStateIconified: + default: + winrt::Windows::UI::Xaml::VisualStateManager::GoToState(MaximizeButton(), L"WindowStateNormal", false); + break; + } + } + DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(MinMaxCloseControl, MinimizeClick, _minimizeClickHandlers, TerminalApp::MinMaxCloseControl, RoutedEventArgs); DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(MinMaxCloseControl, MaximizeClick, _maximizeClickHandlers, TerminalApp::MinMaxCloseControl, RoutedEventArgs); DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(MinMaxCloseControl, CloseClick, _closeClickHandlers, TerminalApp::MinMaxCloseControl, RoutedEventArgs); diff --git a/src/cascadia/TerminalApp/MinMaxCloseControl.h b/src/cascadia/TerminalApp/MinMaxCloseControl.h index 032d216be..4ee7ced32 100644 --- a/src/cascadia/TerminalApp/MinMaxCloseControl.h +++ b/src/cascadia/TerminalApp/MinMaxCloseControl.h @@ -18,8 +18,7 @@ namespace winrt::TerminalApp::implementation { MinMaxCloseControl(); - void Maximize(); - void RestoreDown(); + void SetWindowVisualState(WindowVisualState visualState); void _MinimizeClick(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e); diff --git a/src/cascadia/TerminalApp/MinMaxCloseControl.idl b/src/cascadia/TerminalApp/MinMaxCloseControl.idl index 97bbba522..c0ccb370f 100644 --- a/src/cascadia/TerminalApp/MinMaxCloseControl.idl +++ b/src/cascadia/TerminalApp/MinMaxCloseControl.idl @@ -1,14 +1,15 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. +import "..\TitlebarControl.idl"; + namespace TerminalApp { [default_interface] runtimeclass MinMaxCloseControl : Windows.UI.Xaml.Controls.StackPanel { MinMaxCloseControl(); - void Maximize(); - void RestoreDown(); + void SetWindowVisualState(WindowVisualState visualState); event Windows.Foundation.TypedEventHandler MinimizeClick; event Windows.Foundation.TypedEventHandler MaximizeClick; diff --git a/src/cascadia/TerminalApp/TitlebarControl.cpp b/src/cascadia/TerminalApp/TitlebarControl.cpp index a7c016a16..0207705d8 100644 --- a/src/cascadia/TerminalApp/TitlebarControl.cpp +++ b/src/cascadia/TerminalApp/TitlebarControl.cpp @@ -59,12 +59,10 @@ namespace winrt::TerminalApp::implementation ::GetWindowPlacement(_window, &placement); if (placement.showCmd == SW_SHOWNORMAL) { - MinMaxCloseControl().Maximize(); ::PostMessage(_window, WM_SYSCOMMAND, SC_MAXIMIZE | flag, lParam); } else if (placement.showCmd == SW_SHOWMAXIMIZED) { - MinMaxCloseControl().RestoreDown(); ::PostMessage(_window, WM_SYSCOMMAND, SC_RESTORE | flag, lParam); } } @@ -92,4 +90,9 @@ namespace winrt::TerminalApp::implementation ::PostQuitMessage(0); } + void TitlebarControl::SetWindowVisualState(WindowVisualState visualState) + { + MinMaxCloseControl().SetWindowVisualState(visualState); + } + } diff --git a/src/cascadia/TerminalApp/TitlebarControl.h b/src/cascadia/TerminalApp/TitlebarControl.h index 52be68e48..105807622 100644 --- a/src/cascadia/TerminalApp/TitlebarControl.h +++ b/src/cascadia/TerminalApp/TitlebarControl.h @@ -20,6 +20,8 @@ namespace winrt::TerminalApp::implementation Windows::UI::Xaml::UIElement Content(); void Content(Windows::UI::Xaml::UIElement content); + void SetWindowVisualState(WindowVisualState visualState); + void Root_SizeChanged(const IInspectable& sender, Windows::UI::Xaml::SizeChangedEventArgs const& e); void Minimize_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e); diff --git a/src/cascadia/TerminalApp/TitlebarControl.idl b/src/cascadia/TerminalApp/TitlebarControl.idl index 476a8107b..477ad56b3 100644 --- a/src/cascadia/TerminalApp/TitlebarControl.idl +++ b/src/cascadia/TerminalApp/TitlebarControl.idl @@ -3,9 +3,17 @@ namespace TerminalApp { + enum WindowVisualState + { + WindowVisualStateNormal = 0, + WindowVisualStateMaximized, + WindowVisualStateIconified + }; + [default_interface] runtimeclass TitlebarControl : Windows.UI.Xaml.Controls.Grid { TitlebarControl(UInt64 parentWindowHandle); + void SetWindowVisualState(WindowVisualState visualState); Windows.UI.Xaml.UIElement Content; Windows.UI.Xaml.Controls.Border DragBar { get; }; diff --git a/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp b/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp index 8ff0f7fad..bb9ee0c05 100644 --- a/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp +++ b/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp @@ -667,6 +667,17 @@ bool NonClientIslandWindow::_HandleWindowPosChanging(WINDOWPOS* const windowPos) return false; } + const auto windowStyle = GetWindowStyle(_window.get()); + const auto isMaximized = WI_IsFlagSet(windowStyle, WS_MAXIMIZE); + const auto isIconified = WI_IsFlagSet(windowStyle, WS_ICONIC); + + if (_titlebar) + { + _titlebar.SetWindowVisualState(isMaximized ? winrt::TerminalApp::WindowVisualState::WindowVisualStateMaximized : + isIconified ? winrt::TerminalApp::WindowVisualState::WindowVisualStateIconified : + winrt::TerminalApp::WindowVisualState::WindowVisualStateNormal); + } + // Figure out the suggested dimensions RECT rcSuggested; rcSuggested.left = windowPos->x; @@ -714,9 +725,6 @@ bool NonClientIslandWindow::_HandleWindowPosChanging(WINDOWPOS* const windowPos) } } - const auto windowStyle = GetWindowStyle(_window.get()); - const auto isMaximized = WI_IsFlagSet(windowStyle, WS_MAXIMIZE); - // If we're about to maximize the window, determine how much we're about to // overhang by, and adjust for that. // We need to do this because maximized windows will typically overhang the