diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index 9eb81fc8b6f..38de95593ed 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -1687,6 +1687,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation // _renderer will always exist since it's introduced in the ctor _renderer->AddRenderEngine(pEngine); } + void ControlCore::DetachUiaEngine(::Microsoft::Console::Render::IRenderEngine* const pEngine) + { + _renderer->RemoveRenderEngine(pEngine); + } bool ControlCore::IsInReadOnlyMode() const { diff --git a/src/cascadia/TerminalControl/ControlCore.h b/src/cascadia/TerminalControl/ControlCore.h index a6f572b22f1..6e8eb9f95a6 100644 --- a/src/cascadia/TerminalControl/ControlCore.h +++ b/src/cascadia/TerminalControl/ControlCore.h @@ -196,6 +196,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation bool& selectionNeedsToBeCopied); void AttachUiaEngine(::Microsoft::Console::Render::IRenderEngine* const pEngine); + void DetachUiaEngine(::Microsoft::Console::Render::IRenderEngine* const pEngine); bool IsInReadOnlyMode() const; void ToggleReadOnlyMode(); diff --git a/src/cascadia/TerminalControl/ControlCore.idl b/src/cascadia/TerminalControl/ControlCore.idl index d69923c5f6f..cabd0550609 100644 --- a/src/cascadia/TerminalControl/ControlCore.idl +++ b/src/cascadia/TerminalControl/ControlCore.idl @@ -71,8 +71,6 @@ namespace Microsoft.Terminal.Control void UpdateSettings(IControlSettings settings, IControlAppearance appearance); void ApplyAppearance(Boolean focused); - void Detach(); - IControlSettings Settings { get; }; IControlAppearance FocusedAppearance { get; }; IControlAppearance UnfocusedAppearance { get; }; diff --git a/src/cascadia/TerminalControl/ControlInteractivity.cpp b/src/cascadia/TerminalControl/ControlInteractivity.cpp index bb3b0837b92..77f4b1de9fc 100644 --- a/src/cascadia/TerminalControl/ControlInteractivity.cpp +++ b/src/cascadia/TerminalControl/ControlInteractivity.cpp @@ -61,9 +61,24 @@ namespace winrt::Microsoft::Terminal::Control::implementation return _guid; } + void ControlInteractivity::Detach() + { + if (_uiaEngine) + { + LOG_IF_FAILED(_uiaEngine->Disable()); + } + + _core->Detach(); + } + void ControlInteractivity::Reparent(const Microsoft::Terminal::Control::IKeyBindings& keyBindings) { _core->Reparent(keyBindings); + + /*if (_uiaEngine) + { + _uiaEngine->Reparent(); + }*/ } // Method Description: @@ -677,7 +692,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation try { const auto autoPeer = winrt::make_self(this); - + if (_uiaEngine) + { + _core->DetachUiaEngine(_uiaEngine.get()); + } _uiaEngine = std::make_unique<::Microsoft::Console::Render::UiaEngine>(autoPeer.get()); _core->AttachUiaEngine(_uiaEngine.get()); return *autoPeer; diff --git a/src/cascadia/TerminalControl/ControlInteractivity.h b/src/cascadia/TerminalControl/ControlInteractivity.h index 705fb469502..f67545d4c31 100644 --- a/src/cascadia/TerminalControl/ControlInteractivity.h +++ b/src/cascadia/TerminalControl/ControlInteractivity.h @@ -45,6 +45,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation Control::ControlCore Core(); void Close(); + void Detach(); Control::InteractivityAutomationPeer OnCreateAutomationPeer(); ::Microsoft::Console::Render::IRenderData* GetRenderData() const; diff --git a/src/cascadia/TerminalControl/ControlInteractivity.idl b/src/cascadia/TerminalControl/ControlInteractivity.idl index 2882f4cd819..a60c2069fef 100644 --- a/src/cascadia/TerminalControl/ControlInteractivity.idl +++ b/src/cascadia/TerminalControl/ControlInteractivity.idl @@ -25,6 +25,7 @@ namespace Microsoft.Terminal.Control Guid Id { get; }; void Reparent(Microsoft.Terminal.Control.IKeyBindings keyBindings); + void Detach(); void Close(); InteractivityAutomationPeer OnCreateAutomationPeer(); diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index e66e2eeb08d..4482db48056 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -2068,7 +2068,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation void TermControl::Detach() { _revokers = {}; - _core.Detach(); + _interactivity.Detach(); _detached = true; } diff --git a/src/renderer/base/renderer.cpp b/src/renderer/base/renderer.cpp index 0739a9281bb..f3b9517d899 100644 --- a/src/renderer/base/renderer.cpp +++ b/src/renderer/base/renderer.cpp @@ -1306,6 +1306,20 @@ void Renderer::AddRenderEngine(_In_ IRenderEngine* const pEngine) THROW_HR_MSG(E_UNEXPECTED, "engines array is full"); } +void Renderer::RemoveRenderEngine(_In_ IRenderEngine* const pEngine) +{ + THROW_HR_IF_NULL(E_INVALIDARG, pEngine); + + for (auto& p : _engines) + { + if (p == pEngine) + { + p = nullptr; + return; + } + } +} + // Method Description: // - Registers a callback for when the background color is changed // Arguments: diff --git a/src/renderer/base/renderer.hpp b/src/renderer/base/renderer.hpp index f85b279abeb..e41101f7bf5 100644 --- a/src/renderer/base/renderer.hpp +++ b/src/renderer/base/renderer.hpp @@ -82,6 +82,7 @@ namespace Microsoft::Console::Render void WaitUntilCanRender(); void AddRenderEngine(_In_ IRenderEngine* const pEngine); + void RemoveRenderEngine(_In_ IRenderEngine* const pEngine); void SetBackgroundColorChangedCallback(std::function pfn); void SetFrameColorChangedCallback(std::function pfn);