From 6b415126fd8f165e647d7483b889ad4134c76a84 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Mon, 23 Sep 2019 08:59:03 -0700 Subject: [PATCH] Improve Accessibility Reliability (#2609) * Remove WindowUiaProvider entry points Make TerminalAutomationPeer not crash the app if creation failed. * code format * prefer universal initialization Co-Authored-By: Dustin L. Howett (MSFT) --- src/cascadia/TerminalControl/TermControl.cpp | 12 +++++++++--- src/cascadia/WindowsTerminal/BaseWindow.h | 11 +++++++++++ src/cascadia/WindowsTerminal/IslandWindow.cpp | 10 ++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index ec3c4cf28..4a0146a2b 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -342,9 +342,15 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation Windows::UI::Xaml::Automation::Peers::AutomationPeer TermControl::OnCreateAutomationPeer() { - // create a custom automation peer with this code pattern: - // (https://docs.microsoft.com/en-us/windows/uwp/design/accessibility/custom-automation-peers) - return winrt::make(*this); + Windows::UI::Xaml::Automation::Peers::AutomationPeer autoPeer{ nullptr }; + try + { + // create a custom automation peer with this code pattern: + // (https://docs.microsoft.com/en-us/windows/uwp/design/accessibility/custom-automation-peers) + autoPeer = winrt::make(*this); + } + CATCH_LOG(); + return autoPeer; } ::Microsoft::Console::Types::IUiaData* TermControl::GetUiaData() const diff --git a/src/cascadia/WindowsTerminal/BaseWindow.h b/src/cascadia/WindowsTerminal/BaseWindow.h index 1ae388dcd..7703c0644 100644 --- a/src/cascadia/WindowsTerminal/BaseWindow.h +++ b/src/cascadia/WindowsTerminal/BaseWindow.h @@ -56,13 +56,24 @@ public: return HandleDpiChange(_window.get(), wparam, lparam); } + // TODO GitHub #2447: Properly attach WindowUiaProvider for signaling model + /* case WM_GETOBJECT: { return HandleGetObject(_window.get(), wparam, lparam); } + */ case WM_DESTROY: { + // TODO GitHub #2447: Properly attach WindowUiaProvider for signaling model + /* + // signal to uia that they can disconnect our uia provider + if (_pUiaProvider) + { + UiaReturnRawElementProvider(hWnd, 0, 0, NULL); + } + */ PostQuitMessage(0); return 0; } diff --git a/src/cascadia/WindowsTerminal/IslandWindow.cpp b/src/cascadia/WindowsTerminal/IslandWindow.cpp index 881054bb6..ff560a554 100644 --- a/src/cascadia/WindowsTerminal/IslandWindow.cpp +++ b/src/cascadia/WindowsTerminal/IslandWindow.cpp @@ -161,6 +161,16 @@ void IslandWindow::OnSize(const UINT width, const UINT height) { if (_interopWindowHandle != nullptr) { + // TODO GitHub #2447: Properly attach WindowUiaProvider for signaling model + /* + // set the text area to have focus for accessibility consumers + if (_pUiaProvider) + { + LOG_IF_FAILED(_pUiaProvider->SetTextAreaFocus()); + } + break; + */ + // send focus to the child window SetFocus(_interopWindowHandle); return 0; // eat the message