diff --git a/src/cascadia/TerminalApp/AppLogic.cpp b/src/cascadia/TerminalApp/AppLogic.cpp index c2b24d029..7e5949577 100644 --- a/src/cascadia/TerminalApp/AppLogic.cpp +++ b/src/cascadia/TerminalApp/AppLogic.cpp @@ -1565,6 +1565,11 @@ namespace winrt::TerminalApp::implementation return _root->IsQuakeWindow(); } + void AppLogic::RequestExitFullscreen() + { + _root->SetFullscreen(false); + } + bool AppLogic::GetMinimizeToNotificationArea() { if constexpr (Feature_NotificationIcon::IsEnabled()) diff --git a/src/cascadia/TerminalApp/AppLogic.h b/src/cascadia/TerminalApp/AppLogic.h index 9301a6698..7c1681db1 100644 --- a/src/cascadia/TerminalApp/AppLogic.h +++ b/src/cascadia/TerminalApp/AppLogic.h @@ -91,6 +91,7 @@ namespace winrt::TerminalApp::implementation void SetPersistedLayoutIdx(const uint32_t idx); void SetNumberOfOpenWindows(const uint64_t num); bool IsQuakeWindow() const noexcept; + void RequestExitFullscreen(); Windows::Foundation::Size GetLaunchDimensions(uint32_t dpi); bool CenterOnLaunch(); diff --git a/src/cascadia/TerminalApp/AppLogic.idl b/src/cascadia/TerminalApp/AppLogic.idl index e6aa40788..973e8aa1a 100644 --- a/src/cascadia/TerminalApp/AppLogic.idl +++ b/src/cascadia/TerminalApp/AppLogic.idl @@ -74,6 +74,7 @@ namespace TerminalApp void SetPersistedLayoutIdx(UInt32 idx); void SetNumberOfOpenWindows(UInt64 num); void RenameFailed(); + void RequestExitFullscreen(); Boolean IsQuakeWindow(); Windows.Foundation.Size GetLaunchDimensions(UInt32 dpi); diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 03d798e8c..bd9787f04 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -2535,9 +2535,7 @@ namespace winrt::TerminalApp::implementation // - void TerminalPage::ToggleFullscreen() { - _isFullscreen = !_isFullscreen; - _UpdateTabView(); - _FullscreenChangedHandlers(*this, nullptr); + SetFullscreen(!_isFullscreen); } // Method Description: @@ -2754,6 +2752,17 @@ namespace winrt::TerminalApp::implementation return _isAlwaysOnTop; } + void TerminalPage::SetFullscreen(bool newFullscreen) + { + if (_isFullscreen == newFullscreen) + { + return; + } + _isFullscreen = newFullscreen; + _UpdateTabView(); + _FullscreenChangedHandlers(*this, nullptr); + } + HRESULT TerminalPage::_OnNewConnection(const ConptyConnection& connection) { // We need to be on the UI thread in order for _OpenNewTab to run successfully. diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index 291efb6a7..cf9477d2e 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -83,6 +83,7 @@ namespace winrt::TerminalApp::implementation bool FocusMode() const; bool Fullscreen() const; bool AlwaysOnTop() const; + void SetFullscreen(bool); void SetStartupActions(std::vector& actions); diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index 849c4e804..544c33e55 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -84,6 +84,7 @@ AppHost::AppHost() noexcept : _window->WindowMoved({ this, &AppHost::_WindowMoved }); _window->HotkeyPressed({ this, &AppHost::_GlobalHotkeyPressed }); _window->SetAlwaysOnTop(_logic.GetInitialAlwaysOnTop()); + _window->ShouldExitFullscreen({ &_logic, &winrt::TerminalApp::AppLogic::RequestExitFullscreen }); _window->MakeWindow(); _GetWindowLayoutRequestedToken = _windowManager.GetWindowLayoutRequested([this](auto&&, const winrt::Microsoft::Terminal::Remoting::GetWindowLayoutArgs& args) { diff --git a/src/cascadia/WindowsTerminal/IslandWindow.cpp b/src/cascadia/WindowsTerminal/IslandWindow.cpp index a28ccaa21..a9c2dbb4b 100644 --- a/src/cascadia/WindowsTerminal/IslandWindow.cpp +++ b/src/cascadia/WindowsTerminal/IslandWindow.cpp @@ -606,6 +606,15 @@ long IslandWindow::_calculateTotalSize(const bool isWidth, const long clientSize } break; } + case WM_SYSCOMMAND: + { + if (wparam == SC_RESTORE && _fullscreen) + { + _ShouldExitFullscreenHandlers(); + return 0; + } + break; + } case WM_MENUCOMMAND: { _NotifyNotificationIconMenuItemSelectedHandlers((HMENU)lparam, (UINT)wparam); diff --git a/src/cascadia/WindowsTerminal/IslandWindow.h b/src/cascadia/WindowsTerminal/IslandWindow.h index 0ac7b1e0b..15d652551 100644 --- a/src/cascadia/WindowsTerminal/IslandWindow.h +++ b/src/cascadia/WindowsTerminal/IslandWindow.h @@ -73,6 +73,7 @@ public: WINRT_CALLBACK(NotifyShowNotificationIconContextMenu, winrt::delegate); WINRT_CALLBACK(NotifyNotificationIconMenuItemSelected, winrt::delegate); WINRT_CALLBACK(NotifyReAddNotificationIcon, winrt::delegate); + WINRT_CALLBACK(ShouldExitFullscreen, winrt::delegate); WINRT_CALLBACK(WindowMoved, winrt::delegate);