From 24fe6103e06d58a7cb89d4d28790f5c26f764230 Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Tue, 15 Feb 2022 08:55:11 -0800 Subject: [PATCH 01/38] Sub out default window proc with our own pseudo window proc. --- .../base/InteractivityFactory.cpp | 28 +++++++++++++++++-- .../base/InteractivityFactory.hpp | 11 ++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/interactivity/base/InteractivityFactory.cpp b/src/interactivity/base/InteractivityFactory.cpp index 3c69ebb46bf..96712a57306 100644 --- a/src/interactivity/base/InteractivityFactory.cpp +++ b/src/interactivity/base/InteractivityFactory.cpp @@ -324,6 +324,8 @@ using namespace Microsoft::Console::Interactivity; return status; } + + // Method Description: // - Attempts to instantiate a "pseudo window" for when we're operating in // pseudoconsole mode. There are some tools (cygwin & derivatives) that use @@ -339,7 +341,7 @@ using namespace Microsoft::Console::Interactivity; hwnd = nullptr; ApiLevel level; NTSTATUS status = ApiDetector::DetectNtUserWindow(&level); - ; + if (NT_SUCCESS(status)) { try @@ -350,11 +352,11 @@ using namespace Microsoft::Console::Interactivity; { case ApiLevel::Win32: pseudoClass.lpszClassName = PSEUDO_WINDOW_CLASS; - pseudoClass.lpfnWndProc = DefWindowProc; + pseudoClass.lpfnWndProc = s_PseudoWindowProc; RegisterClass(&pseudoClass); // Attempt to create window hwnd = CreateWindowExW( - 0, PSEUDO_WINDOW_CLASS, nullptr, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, HWND_DESKTOP, nullptr, nullptr, nullptr); + 0, PSEUDO_WINDOW_CLASS, nullptr, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, HWND_DESKTOP, nullptr, nullptr, this); if (hwnd == nullptr) { DWORD const gle = GetLastError(); @@ -381,4 +383,24 @@ using namespace Microsoft::Console::Interactivity; return status; } + +[[nodiscard]] LRESULT CALLBACK InteractivityFactory::s_PseudoWindowProc(_In_ HWND hWnd, _In_ UINT Message, _In_ WPARAM wParam, _In_ LPARAM lParam) +{ + // Dispatch the message to the specific class instance + InteractivityFactory* const pFactory = reinterpret_cast(GetWindowLongPtrW(hWnd, GWLP_USERDATA)); + if (pFactory != nullptr) + { + return pFactory->PseudoWindowProc(hWnd, Message, wParam, lParam); + } + + // If we get this far, call the default window proc + return DefWindowProcW(hWnd, Message, wParam, lParam); +} + +[[nodiscard]] LRESULT CALLBACK InteractivityFactory::PseudoWindowProc(_In_ HWND hWnd, _In_ UINT Message, _In_ WPARAM wParam, _In_ LPARAM lParam) +{ + // If we get this far, call the default window proc + return DefWindowProcW(hWnd, Message, wParam, lParam); +} + #pragma endregion diff --git a/src/interactivity/base/InteractivityFactory.hpp b/src/interactivity/base/InteractivityFactory.hpp index bf08158343f..60badcdc9ff 100644 --- a/src/interactivity/base/InteractivityFactory.hpp +++ b/src/interactivity/base/InteractivityFactory.hpp @@ -28,5 +28,16 @@ namespace Microsoft::Console::Interactivity [[nodiscard]] NTSTATUS CreateInputServices(_Inout_ std::unique_ptr& services); [[nodiscard]] NTSTATUS CreatePseudoWindow(HWND& hwnd); + + // Wndproc + [[nodiscard]] static LRESULT CALLBACK s_PseudoWindowProc(_In_ HWND hwnd, + _In_ UINT uMsg, + _In_ WPARAM wParam, + _In_ LPARAM lParam); + [[nodiscard]] LRESULT CALLBACK PseudoWindowProc(_In_ HWND, + _In_ UINT uMsg, + _In_ WPARAM wParam, + _In_ LPARAM lParam); + }; } From 861683c6d3acad01a7c33e0998a8b3366a9f01ea Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Tue, 15 Feb 2022 09:25:06 -0800 Subject: [PATCH 02/38] sneak out the messages to the output thread. --- src/host/VtIo.cpp | 1 + .../base/InteractivityFactory.cpp | 24 +++++++++++++++++++ .../base/InteractivityFactory.hpp | 4 ++++ src/interactivity/base/ServiceLocator.cpp | 12 ++++++++++ .../inc/IInteractivityFactory.hpp | 1 + src/interactivity/inc/ServiceLocator.hpp | 1 + 6 files changed, 43 insertions(+) diff --git a/src/host/VtIo.cpp b/src/host/VtIo.cpp index 5b482ecd185..89b8aea0387 100644 --- a/src/host/VtIo.cpp +++ b/src/host/VtIo.cpp @@ -215,6 +215,7 @@ bool VtIo::IsUsingVt() const g.pRender->AddRenderEngine(_pVtRenderEngine.get()); g.getConsoleInformation().GetActiveOutputBuffer().SetTerminalConnection(_pVtRenderEngine.get()); g.getConsoleInformation().GetActiveInputBuffer()->SetTerminalConnection(_pVtRenderEngine.get()); + ServiceLocator::SetPseudoWindowCallback([&](std::wstring_view text){LOG_IF_FAILED(_pVtRenderEngine->WriteTerminalW(text));}); } CATCH_RETURN(); } diff --git a/src/interactivity/base/InteractivityFactory.cpp b/src/interactivity/base/InteractivityFactory.cpp index 96712a57306..89cf901abc5 100644 --- a/src/interactivity/base/InteractivityFactory.cpp +++ b/src/interactivity/base/InteractivityFactory.cpp @@ -399,8 +399,32 @@ using namespace Microsoft::Console::Interactivity; [[nodiscard]] LRESULT CALLBACK InteractivityFactory::PseudoWindowProc(_In_ HWND hWnd, _In_ UINT Message, _In_ WPARAM wParam, _In_ LPARAM lParam) { + switch (Message) + { + case WM_SHOWWINDOW: + if (lParam == 0) // Message came directly from someone calling ShowWindow on us. + { + if (wParam) // If TRUE, we're being shown + { + _WritePseudoWindowCallback(L"\x1b[1t"); + } + else // If FALSE, we're being hidden + { + _WritePseudoWindowCallback(L"\x1b[2t"); + } + } + break; + } // If we get this far, call the default window proc return DefWindowProcW(hWnd, Message, wParam, lParam); } +void InteractivityFactory::_WritePseudoWindowCallback(std::wstring_view text) +{ + if (_pseudoWindowMessageCallback) + { + _pseudoWindowMessageCallback(text); + } +} + #pragma endregion diff --git a/src/interactivity/base/InteractivityFactory.hpp b/src/interactivity/base/InteractivityFactory.hpp index 60badcdc9ff..25028f58e4d 100644 --- a/src/interactivity/base/InteractivityFactory.hpp +++ b/src/interactivity/base/InteractivityFactory.hpp @@ -28,6 +28,7 @@ namespace Microsoft::Console::Interactivity [[nodiscard]] NTSTATUS CreateInputServices(_Inout_ std::unique_ptr& services); [[nodiscard]] NTSTATUS CreatePseudoWindow(HWND& hwnd); + void SetPseudoWindowCallback(std::function func); // Wndproc [[nodiscard]] static LRESULT CALLBACK s_PseudoWindowProc(_In_ HWND hwnd, @@ -39,5 +40,8 @@ namespace Microsoft::Console::Interactivity _In_ WPARAM wParam, _In_ LPARAM lParam); + private: + void _WritePseudoWindowCallback(std::wstring_view text); + std::function _pseudoWindowMessageCallback; }; } diff --git a/src/interactivity/base/ServiceLocator.cpp b/src/interactivity/base/ServiceLocator.cpp index 49a89e3e81c..3dbd434b96d 100644 --- a/src/interactivity/base/ServiceLocator.cpp +++ b/src/interactivity/base/ServiceLocator.cpp @@ -296,6 +296,18 @@ Globals& ServiceLocator::LocateGlobals() return s_globals; } +void ServiceLocator::SetPseudoWindowCallback(std::function func) +{ + // Force the whole window to be put together first. + // We don't really need the handle, we just want to leverage the setup steps. + (void)LocatePseudoWindow(); + + if (s_interactivityFactory) + { + s_interactivityFactory->SetPseudoWindowCallback(func); + } +} + // Method Description: // - Retrieves the pseudo console window, or attempts to instantiate one. // Arguments: diff --git a/src/interactivity/inc/IInteractivityFactory.hpp b/src/interactivity/inc/IInteractivityFactory.hpp index 4996f30d689..22eea577c10 100644 --- a/src/interactivity/inc/IInteractivityFactory.hpp +++ b/src/interactivity/inc/IInteractivityFactory.hpp @@ -42,6 +42,7 @@ namespace Microsoft::Console::Interactivity [[nodiscard]] virtual NTSTATUS CreateSystemConfigurationProvider(_Inout_ std::unique_ptr& provider) = 0; [[nodiscard]] virtual NTSTATUS CreateInputServices(_Inout_ std::unique_ptr& services) = 0; + virtual void SetPseudoWindowCallback(std::function func) = 0; [[nodiscard]] virtual NTSTATUS CreatePseudoWindow(HWND& hwnd) = 0; }; diff --git a/src/interactivity/inc/ServiceLocator.hpp b/src/interactivity/inc/ServiceLocator.hpp index cbcbdd8f0b0..31233790e20 100644 --- a/src/interactivity/inc/ServiceLocator.hpp +++ b/src/interactivity/inc/ServiceLocator.hpp @@ -89,6 +89,7 @@ namespace Microsoft::Console::Interactivity static Globals& LocateGlobals(); + static void SetPseudoWindowCallback(std::function func); static HWND LocatePseudoWindow(); protected: From 8d24f236d2cd342de711b8f678bfb54210f58aa8 Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Tue, 15 Feb 2022 09:47:20 -0800 Subject: [PATCH 03/38] Piping... piping.... doo doo doo doo... doo-doo. --- src/cascadia/TerminalCore/ITerminalApi.hpp | 2 ++ src/cascadia/TerminalCore/Terminal.hpp | 2 ++ src/cascadia/TerminalCore/TerminalApi.cpp | 11 +++++++++++ src/cascadia/TerminalCore/TerminalDispatch.cpp | 17 +++++++++++++++++ src/cascadia/TerminalCore/TerminalDispatch.hpp | 5 +++++ src/host/outputStream.cpp | 12 ++++++++++++ src/host/outputStream.hpp | 1 + src/terminal/adapter/DispatchTypes.hpp | 2 ++ src/terminal/adapter/InteractDispatch.cpp | 6 ++++++ src/terminal/adapter/adaptDispatch.cpp | 6 ++++++ src/terminal/adapter/conGetSet.hpp | 1 + src/terminal/adapter/ut_adapter/adapterTest.cpp | 7 +++++++ 12 files changed, 72 insertions(+) diff --git a/src/cascadia/TerminalCore/ITerminalApi.hpp b/src/cascadia/TerminalCore/ITerminalApi.hpp index ebff6fd2072..89f64fda17f 100644 --- a/src/cascadia/TerminalCore/ITerminalApi.hpp +++ b/src/cascadia/TerminalCore/ITerminalApi.hpp @@ -67,6 +67,8 @@ namespace Microsoft::Terminal::Core virtual void PushGraphicsRendition(const ::Microsoft::Console::VirtualTerminal::VTParameters options) = 0; virtual void PopGraphicsRendition() = 0; + virtual void ShowWindow(bool showOrHide) = 0; + protected: ITerminalApi() = default; }; diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index 5a6d328ecf8..36eb20b3532 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -136,6 +136,8 @@ class Microsoft::Terminal::Core::Terminal final : void PushGraphicsRendition(const ::Microsoft::Console::VirtualTerminal::VTParameters options) override; void PopGraphicsRendition() override; + void ShowWindow(bool showOrHide) override; + #pragma endregion #pragma region ITerminalInput diff --git a/src/cascadia/TerminalCore/TerminalApi.cpp b/src/cascadia/TerminalCore/TerminalApi.cpp index 6e89bce460a..6ae34e2a8de 100644 --- a/src/cascadia/TerminalCore/TerminalApi.cpp +++ b/src/cascadia/TerminalCore/TerminalApi.cpp @@ -570,3 +570,14 @@ void Terminal::PopGraphicsRendition() const TextAttribute current = _buffer->GetCurrentAttributes(); _buffer->SetCurrentAttributes(_sgrStack.Pop(current)); } + +// Method Description: +// - Reacts to a client asking us to show or hide the window. +// Arguments: +// - showOrHide - True for show. False for hide. +// Return Value: +// - +void Terminal::ShowWindow(bool showOrHide) +{ + showOrHide; +} diff --git a/src/cascadia/TerminalCore/TerminalDispatch.cpp b/src/cascadia/TerminalCore/TerminalDispatch.cpp index 6adf0daed61..3a59831214d 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.cpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.cpp @@ -722,3 +722,20 @@ bool TerminalDispatch::HardReset() return true; } + +bool TerminalDispatch::WindowManipulation(const DispatchTypes::WindowManipulationType function, + const VTParameter /*parameter1*/, + const VTParameter /*parameter2*/) +{ + switch (function) + { + case DispatchTypes::WindowManipulationType::DeIconifyWindow: + _terminalApi.ShowWindow(true); + return true; + case DispatchTypes::WindowManipulationType::IconifyWindow: + _terminalApi.ShowWindow(false); + return true; + default: + return false; + } +} diff --git a/src/cascadia/TerminalCore/TerminalDispatch.hpp b/src/cascadia/TerminalCore/TerminalDispatch.hpp index 1ec29bf8e08..579c7a01b43 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.hpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.hpp @@ -64,6 +64,11 @@ class TerminalDispatch : public Microsoft::Console::VirtualTerminal::TermDispatc bool SoftReset() override; // DECSTR bool HardReset() override; // RIS + // DTTERM_WindowManipulation + bool WindowManipulation(const DispatchTypes::WindowManipulationType /*function*/, + const VTParameter /*parameter1*/, + const VTParameter /*parameter2*/) override; + bool EnableVT200MouseMode(const bool enabled) override; // ?1000 bool EnableUTF8ExtendedMouseMode(const bool enabled) override; // ?1005 bool EnableSGRExtendedMouseMode(const bool enabled) override; // ?1006 diff --git a/src/host/outputStream.cpp b/src/host/outputStream.cpp index cbae4519159..becc8bb9275 100644 --- a/src/host/outputStream.cpp +++ b/src/host/outputStream.cpp @@ -503,6 +503,18 @@ void ConhostInternalGetSet::SetCursorStyle(const CursorType style) _io.GetActiveOutputBuffer().GetTextBuffer().GetCursor().SetType(style); } +// Routine Description: +// - Shows or hides the active window when asked. +// Arguments: +// - showOrHide - True for show, False for hide. Matching WM_SHOWWINDOW lParam. +// Return Value: +// - +void ConhostInternalGetSet::ShowWindow(bool showOrHide) +{ + auto hwnd = ServiceLocator::LocateConsoleWindow()->GetWindowHandle(); + LOG_IF_WIN32_BOOL_FALSE(PostMessageW(hwnd, WM_SHOWWINDOW, showOrHide, 0)); +} + // Routine Description: // - Forces the renderer to repaint the screen. If the input screen buffer is // not the active one, then just do nothing. We only want to redraw the diff --git a/src/host/outputStream.hpp b/src/host/outputStream.hpp index 458e1ab550f..dfe5721f11b 100644 --- a/src/host/outputStream.hpp +++ b/src/host/outputStream.hpp @@ -77,6 +77,7 @@ class ConhostInternalGetSet final : public Microsoft::Console::VirtualTerminal:: CursorType GetUserDefaultCursorStyle() const override; void SetCursorStyle(CursorType const style) override; + void ShowWindow(bool showOrHide) override; void RefreshWindow() override; bool ResizeWindow(const size_t width, const size_t height) override; void SuppressResizeRepaint() override; diff --git a/src/terminal/adapter/DispatchTypes.hpp b/src/terminal/adapter/DispatchTypes.hpp index 4510626f50b..eecaa4df84c 100644 --- a/src/terminal/adapter/DispatchTypes.hpp +++ b/src/terminal/adapter/DispatchTypes.hpp @@ -406,6 +406,8 @@ namespace Microsoft::Console::VirtualTerminal::DispatchTypes enum WindowManipulationType : size_t { Invalid = 0, + DeIconifyWindow = 1, + IconifyWindow = 2, RefreshWindow = 7, ResizeWindowInCharacters = 8, }; diff --git a/src/terminal/adapter/InteractDispatch.cpp b/src/terminal/adapter/InteractDispatch.cpp index 81b7290dc7c..2c053a2d215 100644 --- a/src/terminal/adapter/InteractDispatch.cpp +++ b/src/terminal/adapter/InteractDispatch.cpp @@ -100,6 +100,12 @@ bool InteractDispatch::WindowManipulation(const DispatchTypes::WindowManipulatio // MSFT:13271146 - QueryScreenSize switch (function) { + case DispatchTypes::WindowManipulationType::DeIconifyWindow: + _pConApi->ShowWindow(true); + return true; + case DispatchTypes::WindowManipulationType::IconifyWindow: + _pConApi->ShowWindow(false); + return true; case DispatchTypes::WindowManipulationType::RefreshWindow: _pConApi->RefreshWindow(); return true; diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index 48d89483f01..0e0ca3eb5e4 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -2179,6 +2179,12 @@ bool AdaptDispatch::WindowManipulation(const DispatchTypes::WindowManipulationTy // MSFT:13271146 - QueryScreenSize switch (function) { + case DispatchTypes::WindowManipulationType::DeIconifyWindow: + _pConApi->ShowWindow(true); + return true; + case DispatchTypes::WindowManipulationType::IconifyWindow: + _pConApi->ShowWindow(false); + return true; case DispatchTypes::WindowManipulationType::RefreshWindow: _pConApi->RefreshWindow(); return true; diff --git a/src/terminal/adapter/conGetSet.hpp b/src/terminal/adapter/conGetSet.hpp index 1cfe0d2613b..2eafa90877d 100644 --- a/src/terminal/adapter/conGetSet.hpp +++ b/src/terminal/adapter/conGetSet.hpp @@ -78,6 +78,7 @@ namespace Microsoft::Console::VirtualTerminal virtual void SetCursorStyle(const CursorType style) = 0; virtual void WriteControlInput(const KeyEvent key) = 0; virtual void RefreshWindow() = 0; + virtual void ShowWindow(bool showOrHide) = 0; virtual void SetConsoleOutputCP(const unsigned int codepage) = 0; virtual unsigned int GetConsoleOutputCP() const = 0; diff --git a/src/terminal/adapter/ut_adapter/adapterTest.cpp b/src/terminal/adapter/ut_adapter/adapterTest.cpp index f102b168e87..3b763b31456 100644 --- a/src/terminal/adapter/ut_adapter/adapterTest.cpp +++ b/src/terminal/adapter/ut_adapter/adapterTest.cpp @@ -312,6 +312,12 @@ class TestGetSet final : public ConGetSet VERIFY_ARE_EQUAL(_expectedCursorStyle, cursorType); } + void ShowWindow(bool showOrHide) override + { + Log::Comment(L"ShowWindow MOCK called..."); + VERIFY_ARE_EQUAL(_expectedShowWindow, showOrHide); + } + void RefreshWindow() override { Log::Comment(L"RefreshWindow MOCK called..."); @@ -641,6 +647,7 @@ class TestGetSet final : public ConGetSet bool _setConsoleOutputCPResult = false; bool _getConsoleOutputCPResult = false; bool _moveToBottomResult = false; + bool _expectedShowWindow = false; bool _getColorTableEntryResult = false; bool _setColorTableEntryResult = false; From 48e37a518b0c999ce67e4d9a96898cd828812bf6 Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Tue, 15 Feb 2022 09:54:16 -0800 Subject: [PATCH 04/38] More piping... --- src/cascadia/TerminalControl/ControlCore.cpp | 3 +++ src/cascadia/TerminalCore/Terminal.cpp | 5 +++++ src/cascadia/TerminalCore/Terminal.hpp | 2 ++ src/cascadia/TerminalCore/TerminalApi.cpp | 5 ++++- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index 27202a114e0..f57e6b02406 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -108,6 +108,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation auto pfnTerminalTaskbarProgressChanged = std::bind(&ControlCore::_terminalTaskbarProgressChanged, this); _terminal->TaskbarProgressChangedCallback(pfnTerminalTaskbarProgressChanged); + auto pfnShowWindowChanged = [&](bool foo){ foo;}; + _terminal->SetShowWindowCallback(pfnShowWindowChanged); + // MSFT 33353327: Initialize the renderer in the ctor instead of Initialize(). // We need the renderer to be ready to accept new engines before the SwapChainPanel is ready to go. // If we wait, a screen reader may try to get the AutomationPeer (aka the UIA Engine), and we won't be able to attach diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index d03bcbb3abb..ab92135781c 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -1212,6 +1212,11 @@ void Microsoft::Terminal::Core::Terminal::TaskbarProgressChangedCallback(std::fu _pfnTaskbarProgressChanged.swap(pfn); } +void Terminal::SetShowWindowCallback(std::function pfn) noexcept +{ + _pfnShowWindowChanged.swap(pfn); +} + // Method Description: // - Sets the cursor to be currently on. On/Off is tracked independently of // cursor visibility (hidden/visible). On/off is controlled by the cursor diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index 36eb20b3532..7085be01f1d 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -207,6 +207,7 @@ class Microsoft::Terminal::Core::Terminal final : void SetCursorPositionChangedCallback(std::function pfn) noexcept; void SetBackgroundCallback(std::function pfn) noexcept; void TaskbarProgressChangedCallback(std::function pfn) noexcept; + void SetShowWindowCallback(std::function pfn) noexcept; void SetCursorOn(const bool isOn); bool IsCursorBlinkingAllowed() const noexcept; @@ -274,6 +275,7 @@ class Microsoft::Terminal::Core::Terminal final : std::function _pfnCursorPositionChanged; std::function)> _pfnTabColorChanged; std::function _pfnTaskbarProgressChanged; + std::function _pfnShowWindowChanged; RenderSettings _renderSettings; std::unique_ptr<::Microsoft::Console::VirtualTerminal::StateMachine> _stateMachine; diff --git a/src/cascadia/TerminalCore/TerminalApi.cpp b/src/cascadia/TerminalCore/TerminalApi.cpp index 6ae34e2a8de..6b2e1ddbf28 100644 --- a/src/cascadia/TerminalCore/TerminalApi.cpp +++ b/src/cascadia/TerminalCore/TerminalApi.cpp @@ -579,5 +579,8 @@ void Terminal::PopGraphicsRendition() // - void Terminal::ShowWindow(bool showOrHide) { - showOrHide; + if (_pfnShowWindowChanged) + { + _pfnShowWindowChanged(showOrHide); + } } From 9ab0c75fb72abdb229b1ae6575c52ae7b4977e69 Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Tue, 15 Feb 2022 11:47:30 -0800 Subject: [PATCH 05/38] Core stuff? --- src/cascadia/TerminalControl/ControlCore.cpp | 8 +++++++- src/cascadia/TerminalControl/ControlCore.h | 2 ++ src/cascadia/TerminalControl/ControlCore.idl | 1 + src/cascadia/TerminalControl/EventArgs.h | 12 ++++++++++++ src/cascadia/TerminalControl/EventArgs.idl | 5 +++++ 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index f57e6b02406..72eba7d282a 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -108,7 +108,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation auto pfnTerminalTaskbarProgressChanged = std::bind(&ControlCore::_terminalTaskbarProgressChanged, this); _terminal->TaskbarProgressChangedCallback(pfnTerminalTaskbarProgressChanged); - auto pfnShowWindowChanged = [&](bool foo){ foo;}; + auto pfnShowWindowChanged = std::bind(&ControlCore::_terminalShowWindowChanged, this, std::placeholders::_1); _terminal->SetShowWindowCallback(pfnShowWindowChanged); // MSFT 33353327: Initialize the renderer in the ctor instead of Initialize(). @@ -1262,6 +1262,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation _TaskbarProgressChangedHandlers(*this, nullptr); } + void ControlCore::_terminalShowWindowChanged(bool showOrHide) + { + auto showWindow = winrt::make_self(showOrHide); + _ShowWindowChangedHandlers(*this, *showWindow); + } + bool ControlCore::HasSelection() const { return _terminal->IsSelectionActive(); diff --git a/src/cascadia/TerminalControl/ControlCore.h b/src/cascadia/TerminalControl/ControlCore.h index 2a86c2585cd..13062342bfa 100644 --- a/src/cascadia/TerminalControl/ControlCore.h +++ b/src/cascadia/TerminalControl/ControlCore.h @@ -192,6 +192,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation TYPED_EVENT(TransparencyChanged, IInspectable, Control::TransparencyChangedEventArgs); TYPED_EVENT(ReceivedOutput, IInspectable, IInspectable); TYPED_EVENT(FoundMatch, IInspectable, Control::FoundResultsArgs); + TYPED_EVENT(ShowWindowChanged, IInspectable, Control::ShowWindowArgs); // clang-format on private: @@ -261,6 +262,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation const int bufferSize); void _terminalCursorPositionChanged(); void _terminalTaskbarProgressChanged(); + void _terminalShowWindowChanged(bool showOrHide); #pragma endregion #pragma region RendererCallbacks diff --git a/src/cascadia/TerminalControl/ControlCore.idl b/src/cascadia/TerminalControl/ControlCore.idl index a8b3e14234d..390eadaf313 100644 --- a/src/cascadia/TerminalControl/ControlCore.idl +++ b/src/cascadia/TerminalControl/ControlCore.idl @@ -120,6 +120,7 @@ namespace Microsoft.Terminal.Control event Windows.Foundation.TypedEventHandler TransparencyChanged; event Windows.Foundation.TypedEventHandler ReceivedOutput; event Windows.Foundation.TypedEventHandler FoundMatch; + event Windows.Foundation.TypedEventHandler ShowWindowChanged; }; } diff --git a/src/cascadia/TerminalControl/EventArgs.h b/src/cascadia/TerminalControl/EventArgs.h index 0b9e80b0882..d64e0b91062 100644 --- a/src/cascadia/TerminalControl/EventArgs.h +++ b/src/cascadia/TerminalControl/EventArgs.h @@ -145,4 +145,16 @@ namespace winrt::Microsoft::Terminal::Control::implementation WINRT_PROPERTY(bool, FoundMatch); }; + + struct ShowWindowArgs : public ShowWindowArgsT + { + public: + ShowWindowArgs(const bool showOrHide) : + _ShowOrHide(showOrHide) + { + + } + + WINRT_PROPERTY(bool, ShowOrHide); + } } diff --git a/src/cascadia/TerminalControl/EventArgs.idl b/src/cascadia/TerminalControl/EventArgs.idl index 377c6535cf4..059b1b4db1b 100644 --- a/src/cascadia/TerminalControl/EventArgs.idl +++ b/src/cascadia/TerminalControl/EventArgs.idl @@ -74,4 +74,9 @@ namespace Microsoft.Terminal.Control { Boolean FoundMatch { get; }; } + + runtime class ShowWindowArgs + { + Boolean ShowOrHide { get; }; + } } From 3d1ad436aa67ea2afaf77d237b3948c865a07cdf Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Tue, 15 Feb 2022 11:54:19 -0800 Subject: [PATCH 06/38] I swear I just get more lost. --- src/cascadia/TerminalControl/EventArgs.cpp | 1 + src/cascadia/TerminalControl/EventArgs.h | 1 + src/cascadia/TerminalControl/TermControl.h | 1 + 3 files changed, 3 insertions(+) diff --git a/src/cascadia/TerminalControl/EventArgs.cpp b/src/cascadia/TerminalControl/EventArgs.cpp index 28417c4eb33..665ea17f448 100644 --- a/src/cascadia/TerminalControl/EventArgs.cpp +++ b/src/cascadia/TerminalControl/EventArgs.cpp @@ -12,3 +12,4 @@ #include "RendererWarningArgs.g.cpp" #include "TransparencyChangedEventArgs.g.cpp" #include "FoundResultsArgs.g.cpp" +#include "ShowWindowArgs.g.cpp" diff --git a/src/cascadia/TerminalControl/EventArgs.h b/src/cascadia/TerminalControl/EventArgs.h index d64e0b91062..e4d66f743c0 100644 --- a/src/cascadia/TerminalControl/EventArgs.h +++ b/src/cascadia/TerminalControl/EventArgs.h @@ -12,6 +12,7 @@ #include "RendererWarningArgs.g.h" #include "TransparencyChangedEventArgs.g.h" #include "FoundResultsArgs.g.h" +#include "ShowWindowArgs.g.h" namespace winrt::Microsoft::Terminal::Control::implementation { diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 95aa82cdb92..d3d224b347f 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -121,6 +121,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation PROJECTED_FORWARDED_TYPED_EVENT(TabColorChanged, IInspectable, IInspectable, _core, TabColorChanged); PROJECTED_FORWARDED_TYPED_EVENT(SetTaskbarProgress, IInspectable, IInspectable, _core, TaskbarProgressChanged); PROJECTED_FORWARDED_TYPED_EVENT(ConnectionStateChanged, IInspectable, IInspectable, _core, ConnectionStateChanged); + PROJECTED_FORWARDED_TYPED_EVENT(ShowWindowChanged, IInspectable, Control::ShowWindowArgs, _core, ShowWindowChanged); PROJECTED_FORWARDED_TYPED_EVENT(PasteFromClipboard, IInspectable, Control::PasteFromClipboardEventArgs, _interactivity, PasteFromClipboard); From 9c67d94016f25ffe115127e17c6d87c31dfde346 Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Tue, 15 Feb 2022 12:03:14 -0800 Subject: [PATCH 07/38] write island trigger --- src/cascadia/WindowsTerminal/IslandWindow.cpp | 9 +++++++++ src/cascadia/WindowsTerminal/IslandWindow.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/cascadia/WindowsTerminal/IslandWindow.cpp b/src/cascadia/WindowsTerminal/IslandWindow.cpp index cbd2509385c..29e3792ba79 100644 --- a/src/cascadia/WindowsTerminal/IslandWindow.cpp +++ b/src/cascadia/WindowsTerminal/IslandWindow.cpp @@ -813,6 +813,15 @@ void IslandWindow::SetAlwaysOnTop(const bool alwaysOnTop) } } +void IslandWindow::ShowWindowChanged(const bool showOrHide) +{ + const auto hwnd = GetHandle(); + if (hwnd) + { + PostMessage(hwnd, WM_SYSCOMMAND, showOrHide ? SC_RESTORE : SC_MINIMIZE, 0); + } +} + // Method Description // - Flash the taskbar icon, indicating to the user that something needs their attention void IslandWindow::FlashTaskbar() diff --git a/src/cascadia/WindowsTerminal/IslandWindow.h b/src/cascadia/WindowsTerminal/IslandWindow.h index 53c00121d15..3ce924ec119 100644 --- a/src/cascadia/WindowsTerminal/IslandWindow.h +++ b/src/cascadia/WindowsTerminal/IslandWindow.h @@ -42,6 +42,7 @@ class IslandWindow : void FocusModeChanged(const bool focusMode); void FullscreenChanged(const bool fullscreen); void SetAlwaysOnTop(const bool alwaysOnTop); + void ShowWindowChanged(const bool showOrHide); void FlashTaskbar(); void SetTaskbarProgress(const size_t state, const size_t progress); From 687cdda756b8283c0ac59469e84585cc695261d9 Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Thu, 17 Feb 2022 12:44:22 -0800 Subject: [PATCH 08/38] more piping --- src/cascadia/TerminalApp/AppLogic.h | 1 + src/cascadia/TerminalApp/AppLogic.idl | 1 + src/cascadia/TerminalApp/TerminalPage.cpp | 13 +++++++++++++ src/cascadia/TerminalApp/TerminalPage.h | 3 +++ src/cascadia/TerminalApp/TerminalPage.idl | 1 + src/cascadia/TerminalControl/TermControl.idl | 2 ++ src/cascadia/WindowsTerminal/AppHost.cpp | 7 +++++++ src/cascadia/WindowsTerminal/AppHost.h | 3 +++ 8 files changed, 31 insertions(+) diff --git a/src/cascadia/TerminalApp/AppLogic.h b/src/cascadia/TerminalApp/AppLogic.h index 1d43f113ba5..5f833d91a0b 100644 --- a/src/cascadia/TerminalApp/AppLogic.h +++ b/src/cascadia/TerminalApp/AppLogic.h @@ -207,6 +207,7 @@ namespace winrt::TerminalApp::implementation FORWARDED_TYPED_EVENT(CloseRequested, Windows::Foundation::IInspectable, Windows::Foundation::IInspectable, _root, CloseRequested); FORWARDED_TYPED_EVENT(OpenSystemMenu, Windows::Foundation::IInspectable, Windows::Foundation::IInspectable, _root, OpenSystemMenu); FORWARDED_TYPED_EVENT(QuitRequested, Windows::Foundation::IInspectable, Windows::Foundation::IInspectable, _root, QuitRequested); + FORWARDED_TYPED_EVENT(ShowWindowChanged, Windows::Foundation::IInspectable, winrt::Microsoft::Terminal::Control::ShowWindowArgs, _root, ShowWindowChanged); #ifdef UNIT_TESTING friend class TerminalAppLocalTests::CommandlineTest; diff --git a/src/cascadia/TerminalApp/AppLogic.idl b/src/cascadia/TerminalApp/AppLogic.idl index 57e7a914e25..8db2806abb3 100644 --- a/src/cascadia/TerminalApp/AppLogic.idl +++ b/src/cascadia/TerminalApp/AppLogic.idl @@ -130,5 +130,6 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler OpenSystemMenu; event Windows.Foundation.TypedEventHandler QuitRequested; event Windows.Foundation.TypedEventHandler SystemMenuChangeRequested; + event Windows.Foundation.TypedEventHandler ShowWindowChanged; } } diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 630378a5d07..966525f4168 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -1423,6 +1423,8 @@ namespace winrt::TerminalApp::implementation term.SetTaskbarProgress({ get_weak(), &TerminalPage::_SetTaskbarProgressHandler }); term.ConnectionStateChanged({ get_weak(), &TerminalPage::_ConnectionStateChangedHandler }); + + term.ShowWindowChanged({get_weak(), &TerminalPage::_ShowWindowChangedHandler }); } // Method Description: @@ -2335,6 +2337,17 @@ namespace winrt::TerminalApp::implementation _SetTaskbarProgressHandlers(*this, nullptr); } + // Method Description: + // - Send an event (which will be caught by AppHost) to change the show window state of the entire hosting window + // Arguments: + // - sender (not used) + // - args: the arguments specifying how to set the display status to ShowWindow for our window handle + winrt::fire_and_forget TerminalPage::_ShowWindowChangedHandler(const IInspectable /*sender*/, const Microsoft::Terminal::Control::ShowWindowArgs args) + { + co_await resume_foreground(Dispatcher()); + _ShowWindowChangedHandlers(*this, args); + } + // Method Description: // - Paste text from the Windows Clipboard to the focused terminal void TerminalPage::_PasteText() diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index a1867178590..069426af0b6 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -154,6 +154,7 @@ namespace winrt::TerminalApp::implementation TYPED_EVENT(CloseRequested, IInspectable, IInspectable); TYPED_EVENT(OpenSystemMenu, IInspectable, IInspectable); TYPED_EVENT(QuitRequested, IInspectable, IInspectable); + TYPED_EVENT(ShowWindowChanged, IInspectable, winrt::Microsoft::Terminal::Control::ShowWindowArgs) private: friend struct TerminalPageT; // for Xaml to bind events @@ -430,6 +431,8 @@ namespace winrt::TerminalApp::implementation static bool _IsMessageDismissed(const winrt::Microsoft::Terminal::Settings::Model::InfoBarMessage& message); static void _DismissMessage(const winrt::Microsoft::Terminal::Settings::Model::InfoBarMessage& message); + winrt::fire_and_forget _ShowWindowChangedHandler(const IInspectable sender, const winrt::Microsoft::Terminal::Control::ShowWindowArgs args); + #pragma region ActionHandlers // These are all defined in AppActionHandlers.cpp #define ON_ALL_ACTIONS(action) DECLARE_ACTION_HANDLER(action); diff --git a/src/cascadia/TerminalApp/TerminalPage.idl b/src/cascadia/TerminalApp/TerminalPage.idl index 979483d0ad8..af95d9a0c95 100644 --- a/src/cascadia/TerminalApp/TerminalPage.idl +++ b/src/cascadia/TerminalApp/TerminalPage.idl @@ -59,5 +59,6 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler SummonWindowRequested; event Windows.Foundation.TypedEventHandler CloseRequested; event Windows.Foundation.TypedEventHandler OpenSystemMenu; + event Windows.Foundation.TypedEventHandler ShowWindowChanged; } } diff --git a/src/cascadia/TerminalControl/TermControl.idl b/src/cascadia/TerminalControl/TermControl.idl index 307dd965530..b52dbf194d1 100644 --- a/src/cascadia/TerminalControl/TermControl.idl +++ b/src/cascadia/TerminalControl/TermControl.idl @@ -46,6 +46,8 @@ namespace Microsoft.Terminal.Control // We expose this and ConnectionState here so that it might eventually be data bound. event Windows.Foundation.TypedEventHandler ConnectionStateChanged; + event Windows.Foundation.TypedEventHandler ShowWindowChanged; + Boolean CopySelectionToClipboard(Boolean singleLine, Windows.Foundation.IReference formats); void PasteTextFromClipboard(); void ClearBuffer(ClearBufferType clearType); diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index f1380679c38..0db76905639 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -364,6 +364,7 @@ void AppHost::Initialize() _logic.SummonWindowRequested({ this, &AppHost::_SummonWindowRequested }); _logic.OpenSystemMenu({ this, &AppHost::_OpenSystemMenu }); _logic.QuitRequested({ this, &AppHost::_RequestQuitAll }); + _logic.ShowWindowChanged({ this, &AppHost::_ShowWindowChanged}); _window->UpdateTitle(_logic.Title()); @@ -1319,6 +1320,12 @@ void AppHost::_QuitAllRequested(const winrt::Windows::Foundation::IInspectable&, args.BeforeQuitAllAction(_SaveWindowLayouts()); } +void AppHost:: _ShowWindowChanged(const winrt::Windows::Foundation::IInspectable& sender, + const winrt::Microsoft::Terminal::Control::ShowWindowArgs& args) +{ + _window->ShowWindowChanged(args.ShowOrHide); +} + void AppHost::_SummonWindowRequested(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Windows::Foundation::IInspectable&) { diff --git a/src/cascadia/WindowsTerminal/AppHost.h b/src/cascadia/WindowsTerminal/AppHost.h index debc0c3a807..208535d7305 100644 --- a/src/cascadia/WindowsTerminal/AppHost.h +++ b/src/cascadia/WindowsTerminal/AppHost.h @@ -110,6 +110,9 @@ class AppHost void _QuitAllRequested(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Microsoft::Terminal::Remoting::QuitAllRequestedArgs& args); + void _ShowWindowChanged(const winrt::Windows::Foundation::IInspectable& sender, + const winrt::Microsoft::Terminal::Control::ShowWindowArgs& args); + void _CreateNotificationIcon(); void _DestroyNotificationIcon(); void _ShowNotificationIconRequested(); From 4f0637127805d668084fdd0de125c722bf1c18ff Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Thu, 17 Feb 2022 13:13:36 -0800 Subject: [PATCH 09/38] make it blend --- src/cascadia/TerminalApp/TerminalPage.idl | 2 +- src/cascadia/TerminalControl/EventArgs.h | 13 ++++++------- src/cascadia/TerminalControl/EventArgs.idl | 2 +- src/cascadia/TerminalCore/TerminalDispatch.hpp | 6 +++--- src/cascadia/WindowsTerminal/AppHost.cpp | 4 ++-- src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest | 5 +++++ src/host/ft_host/InitTests.cpp | 2 +- src/interactivity/base/InteractivityFactory.cpp | 5 +++++ 8 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/cascadia/TerminalApp/TerminalPage.idl b/src/cascadia/TerminalApp/TerminalPage.idl index af95d9a0c95..90d317c1d98 100644 --- a/src/cascadia/TerminalApp/TerminalPage.idl +++ b/src/cascadia/TerminalApp/TerminalPage.idl @@ -59,6 +59,6 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler SummonWindowRequested; event Windows.Foundation.TypedEventHandler CloseRequested; event Windows.Foundation.TypedEventHandler OpenSystemMenu; - event Windows.Foundation.TypedEventHandler ShowWindowChanged; + event Windows.Foundation.TypedEventHandler ShowWindowChanged; } } diff --git a/src/cascadia/TerminalControl/EventArgs.h b/src/cascadia/TerminalControl/EventArgs.h index e4d66f743c0..0d7c6d4a005 100644 --- a/src/cascadia/TerminalControl/EventArgs.h +++ b/src/cascadia/TerminalControl/EventArgs.h @@ -149,13 +149,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation struct ShowWindowArgs : public ShowWindowArgsT { - public: - ShowWindowArgs(const bool showOrHide) : + public: + ShowWindowArgs(const bool showOrHide) : _ShowOrHide(showOrHide) - { - - } + { + } - WINRT_PROPERTY(bool, ShowOrHide); - } + WINRT_PROPERTY(bool, ShowOrHide); + }; } diff --git a/src/cascadia/TerminalControl/EventArgs.idl b/src/cascadia/TerminalControl/EventArgs.idl index 059b1b4db1b..62ed095c8f4 100644 --- a/src/cascadia/TerminalControl/EventArgs.idl +++ b/src/cascadia/TerminalControl/EventArgs.idl @@ -75,7 +75,7 @@ namespace Microsoft.Terminal.Control Boolean FoundMatch { get; }; } - runtime class ShowWindowArgs + runtimeclass ShowWindowArgs { Boolean ShowOrHide { get; }; } diff --git a/src/cascadia/TerminalCore/TerminalDispatch.hpp b/src/cascadia/TerminalCore/TerminalDispatch.hpp index 579c7a01b43..2b7e8094132 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.hpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.hpp @@ -65,9 +65,9 @@ class TerminalDispatch : public Microsoft::Console::VirtualTerminal::TermDispatc bool HardReset() override; // RIS // DTTERM_WindowManipulation - bool WindowManipulation(const DispatchTypes::WindowManipulationType /*function*/, - const VTParameter /*parameter1*/, - const VTParameter /*parameter2*/) override; + bool WindowManipulation(const ::Microsoft::Console::VirtualTerminal::DispatchTypes::WindowManipulationType /*function*/, + const ::Microsoft::Console::VirtualTerminal::VTParameter /*parameter1*/, + const ::Microsoft::Console::VirtualTerminal::VTParameter /*parameter2*/) override; bool EnableVT200MouseMode(const bool enabled) override; // ?1000 bool EnableUTF8ExtendedMouseMode(const bool enabled) override; // ?1005 diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index 0db76905639..8737f29919a 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -1320,10 +1320,10 @@ void AppHost::_QuitAllRequested(const winrt::Windows::Foundation::IInspectable&, args.BeforeQuitAllAction(_SaveWindowLayouts()); } -void AppHost:: _ShowWindowChanged(const winrt::Windows::Foundation::IInspectable& sender, +void AppHost:: _ShowWindowChanged(const winrt::Windows::Foundation::IInspectable&, const winrt::Microsoft::Terminal::Control::ShowWindowArgs& args) { - _window->ShowWindowChanged(args.ShowOrHide); + _window->ShowWindowChanged(args.ShowOrHide()); } void AppHost::_SummonWindowRequested(const winrt::Windows::Foundation::IInspectable& sender, diff --git a/src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest b/src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest index 47612326b28..8e1afe241f0 100644 --- a/src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest +++ b/src/cascadia/ut_app/TerminalApp.Unit.Tests.manifest @@ -14,6 +14,11 @@ + + + diff --git a/src/host/ft_host/InitTests.cpp b/src/host/ft_host/InitTests.cpp index ea738dd8fa3..f3d062c8878 100644 --- a/src/host/ft_host/InitTests.cpp +++ b/src/host/ft_host/InitTests.cpp @@ -25,7 +25,7 @@ static FILE* std_in = nullptr; // This will automatically try to terminate the job object (and all of the // binaries under test that are children) whenever this class gets shut down. // also closes the FILE pointers created by reopening stdin and stdout. -auto OnAppExitKillJob = wil::scope_exit([&] { +auto OnAppExitKillJob = wil::scope_exit([] { if (std_out != nullptr) { fclose(std_out); diff --git a/src/interactivity/base/InteractivityFactory.cpp b/src/interactivity/base/InteractivityFactory.cpp index 89cf901abc5..ff7a55b27b9 100644 --- a/src/interactivity/base/InteractivityFactory.cpp +++ b/src/interactivity/base/InteractivityFactory.cpp @@ -384,6 +384,11 @@ using namespace Microsoft::Console::Interactivity; return status; } +void InteractivityFactory::SetPseudoWindowCallback(std::function func) +{ + _pseudoWindowMessageCallback = func; +} + [[nodiscard]] LRESULT CALLBACK InteractivityFactory::s_PseudoWindowProc(_In_ HWND hWnd, _In_ UINT Message, _In_ WPARAM wParam, _In_ LPARAM lParam) { // Dispatch the message to the specific class instance From da8775b7667fb37903d54a5098cf648a107dcb73 Mon Sep 17 00:00:00 2001 From: Michael Niksa Date: Thu, 17 Feb 2022 13:26:07 -0800 Subject: [PATCH 10/38] format! --- src/cascadia/TerminalApp/TerminalPage.cpp | 2 +- .../TerminalCore/TerminalDispatch.cpp | 16 ++++++------ src/cascadia/WindowsTerminal/AppHost.cpp | 6 ++--- src/host/VtIo.cpp | 2 +- .../base/InteractivityFactory.cpp | 26 +++++++++---------- .../base/InteractivityFactory.hpp | 2 +- src/interactivity/base/ServiceLocator.cpp | 2 +- 7 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 966525f4168..3273d0a241c 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -1424,7 +1424,7 @@ namespace winrt::TerminalApp::implementation term.ConnectionStateChanged({ get_weak(), &TerminalPage::_ConnectionStateChangedHandler }); - term.ShowWindowChanged({get_weak(), &TerminalPage::_ShowWindowChangedHandler }); + term.ShowWindowChanged({ get_weak(), &TerminalPage::_ShowWindowChangedHandler }); } // Method Description: diff --git a/src/cascadia/TerminalCore/TerminalDispatch.cpp b/src/cascadia/TerminalCore/TerminalDispatch.cpp index 3a59831214d..3955ed0ae1c 100644 --- a/src/cascadia/TerminalCore/TerminalDispatch.cpp +++ b/src/cascadia/TerminalCore/TerminalDispatch.cpp @@ -729,13 +729,13 @@ bool TerminalDispatch::WindowManipulation(const DispatchTypes::WindowManipulatio { switch (function) { - case DispatchTypes::WindowManipulationType::DeIconifyWindow: - _terminalApi.ShowWindow(true); - return true; - case DispatchTypes::WindowManipulationType::IconifyWindow: - _terminalApi.ShowWindow(false); - return true; - default: - return false; + case DispatchTypes::WindowManipulationType::DeIconifyWindow: + _terminalApi.ShowWindow(true); + return true; + case DispatchTypes::WindowManipulationType::IconifyWindow: + _terminalApi.ShowWindow(false); + return true; + default: + return false; } } diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index 8737f29919a..4ac42f6617a 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -364,7 +364,7 @@ void AppHost::Initialize() _logic.SummonWindowRequested({ this, &AppHost::_SummonWindowRequested }); _logic.OpenSystemMenu({ this, &AppHost::_OpenSystemMenu }); _logic.QuitRequested({ this, &AppHost::_RequestQuitAll }); - _logic.ShowWindowChanged({ this, &AppHost::_ShowWindowChanged}); + _logic.ShowWindowChanged({ this, &AppHost::_ShowWindowChanged }); _window->UpdateTitle(_logic.Title()); @@ -1320,8 +1320,8 @@ void AppHost::_QuitAllRequested(const winrt::Windows::Foundation::IInspectable&, args.BeforeQuitAllAction(_SaveWindowLayouts()); } -void AppHost:: _ShowWindowChanged(const winrt::Windows::Foundation::IInspectable&, - const winrt::Microsoft::Terminal::Control::ShowWindowArgs& args) +void AppHost::_ShowWindowChanged(const winrt::Windows::Foundation::IInspectable&, + const winrt::Microsoft::Terminal::Control::ShowWindowArgs& args) { _window->ShowWindowChanged(args.ShowOrHide()); } diff --git a/src/host/VtIo.cpp b/src/host/VtIo.cpp index 89b8aea0387..53dff729a8a 100644 --- a/src/host/VtIo.cpp +++ b/src/host/VtIo.cpp @@ -215,7 +215,7 @@ bool VtIo::IsUsingVt() const g.pRender->AddRenderEngine(_pVtRenderEngine.get()); g.getConsoleInformation().GetActiveOutputBuffer().SetTerminalConnection(_pVtRenderEngine.get()); g.getConsoleInformation().GetActiveInputBuffer()->SetTerminalConnection(_pVtRenderEngine.get()); - ServiceLocator::SetPseudoWindowCallback([&](std::wstring_view text){LOG_IF_FAILED(_pVtRenderEngine->WriteTerminalW(text));}); + ServiceLocator::SetPseudoWindowCallback([&](std::wstring_view text) { LOG_IF_FAILED(_pVtRenderEngine->WriteTerminalW(text)); }); } CATCH_RETURN(); } diff --git a/src/interactivity/base/InteractivityFactory.cpp b/src/interactivity/base/InteractivityFactory.cpp index ff7a55b27b9..73e982c3c5f 100644 --- a/src/interactivity/base/InteractivityFactory.cpp +++ b/src/interactivity/base/InteractivityFactory.cpp @@ -324,8 +324,6 @@ using namespace Microsoft::Console::Interactivity; return status; } - - // Method Description: // - Attempts to instantiate a "pseudo window" for when we're operating in // pseudoconsole mode. There are some tools (cygwin & derivatives) that use @@ -341,7 +339,7 @@ using namespace Microsoft::Console::Interactivity; hwnd = nullptr; ApiLevel level; NTSTATUS status = ApiDetector::DetectNtUserWindow(&level); - + if (NT_SUCCESS(status)) { try @@ -391,7 +389,7 @@ void InteractivityFactory::SetPseudoWindowCallback(std::function(GetWindowLongPtrW(hWnd, GWLP_USERDATA)); if (pFactory != nullptr) { @@ -406,18 +404,18 @@ void InteractivityFactory::SetPseudoWindowCallback(std::function