diff --git a/src/cascadia/PublicTerminalCore/HwndTerminal.cpp b/src/cascadia/PublicTerminalCore/HwndTerminal.cpp index 46c0a98b60..9ccc7b66d0 100644 --- a/src/cascadia/PublicTerminalCore/HwndTerminal.cpp +++ b/src/cascadia/PublicTerminalCore/HwndTerminal.cpp @@ -320,8 +320,7 @@ IRawElementProviderSimple* HwndTerminal::_GetUiaProvider() noexcept { // If TermControlUiaProvider throws during construction, // we don't want to try constructing an instance again and again. - // _uiaProviderInitialized helps us prevent this. - if (!_uiaProviderInitialized) + if (!_uiaProvider) { try { @@ -330,7 +329,6 @@ IRawElementProviderSimple* HwndTerminal::_GetUiaProvider() noexcept _uiaEngine = std::make_unique<::Microsoft::Console::Render::UiaEngine>(_uiaProvider.Get()); LOG_IF_FAILED(_uiaEngine->Enable()); _renderer->AddRenderEngine(_uiaEngine.get()); - _uiaProviderInitialized = true; } catch (...) { @@ -724,7 +722,7 @@ try { modifiers |= ControlKeyStates::EnhancedKey; } - if (vkey && keyDown && _uiaProviderInitialized) + if (vkey && keyDown && _uiaProvider) { _uiaProvider->RecordKeyEvent(vkey); } @@ -836,12 +834,20 @@ void __stdcall TerminalSetFocus(void* terminal) { auto publicTerminal = static_cast(terminal); publicTerminal->_focused = true; + if (auto uiaEngine = publicTerminal->_uiaEngine.get()) + { + LOG_IF_FAILED(uiaEngine->Enable()); + } } void __stdcall TerminalKillFocus(void* terminal) { auto publicTerminal = static_cast(terminal); publicTerminal->_focused = false; + if (auto uiaEngine = publicTerminal->_uiaEngine.get()) + { + LOG_IF_FAILED(uiaEngine->Disable()); + } } // Routine Description: diff --git a/src/cascadia/PublicTerminalCore/HwndTerminal.hpp b/src/cascadia/PublicTerminalCore/HwndTerminal.hpp index 68b172247c..6df223e804 100644 --- a/src/cascadia/PublicTerminalCore/HwndTerminal.hpp +++ b/src/cascadia/PublicTerminalCore/HwndTerminal.hpp @@ -83,7 +83,6 @@ private: std::unique_ptr<::Microsoft::Console::Render::UiaEngine> _uiaEngine; bool _focused{ false }; - bool _uiaProviderInitialized{ false }; std::chrono::milliseconds _multiClickTime; unsigned int _multiClickCounter{}; diff --git a/src/cascadia/PublicTerminalCore/HwndTerminalAutomationPeer.hpp b/src/cascadia/PublicTerminalCore/HwndTerminalAutomationPeer.hpp index a0bfff53ff..7bb7f59470 100644 --- a/src/cascadia/PublicTerminalCore/HwndTerminalAutomationPeer.hpp +++ b/src/cascadia/PublicTerminalCore/HwndTerminalAutomationPeer.hpp @@ -6,17 +6,10 @@ Module Name: - HwndTerminalAutomationPeer.hpp Abstract: -- This module provides UI Automation access to the TermControl +- This module provides UI Automation access to the HwndTerminal to support both automation tests and accessibility (screen - reading) applications. This mainly interacts with ScreenInfoUiaProvider - to allow for shared code between ConHost and Windows Terminal - accessibility providers. -- Based on the Custom Automation Peers guide on msdn - (https://docs.microsoft.com/en-us/windows/uwp/design/accessibility/custom-automation-peers) -- Wraps the UIAutomationCore ITextProvider - (https://docs.microsoft.com/en-us/windows/win32/api/uiautomationcore/nn-uiautomationcore-itextprovider) - with a XAML ITextProvider - (https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.automation.provider.itextprovider) + reading) applications. This mainly interacts with TermControlUiaProvider + to allow for shared code with Windows Terminal accessibility providers. Author(s): - Carlos Zamora (CaZamor) 2022