2b8b034b89
This PR makes use of the UiaRenderer by attaching it to the TerminalControl and setting up selectionChanged events for accessibility. Part 1: attaching the UiaRenderer The uiaRenderer is treated very similarly to the dxRenderer. We have a unique_ptr ref to it in the TermControl. This gets populated when the TermControlAutomationPeer is created (thus enabling accessibility). To prevent every TermControl from sending signals simultaneously, we specifically only enable whichever one is in an active pane. The UiaRenderer needs to send encoded events to the automation provider (in this case, TermControlAutomationPeer). We needed our own automation events so that we can reuse this model for ConHost. This is the purpose of IUiaEventDispatcher. We need a dispatcher for the UiaRenderer. Otherwise, we would do a lot of work to find out when to fire an event, but we wouldn't have a way of doing that. Part 2: hooking up selection events This provides a little bit of polish to hooking it up before. Primarily to actually make it work. This includes returning S_FALSE instead of E_NOTIMPL. The main thing here really is just how to detect if a selection has changed. This also shows how clean adding more events will be in the future!
70 lines
3.1 KiB
C++
70 lines
3.1 KiB
C++
/*++
|
|
Copyright (c) Microsoft Corporation
|
|
Licensed under the MIT license.
|
|
|
|
Module Name:
|
|
- TermControlAutomationPeer.h
|
|
|
|
Abstract:
|
|
- This module provides UI Automation access to the TermControl
|
|
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)
|
|
|
|
Author(s):
|
|
- Carlos Zamora (CaZamor) 2019
|
|
--*/
|
|
|
|
#pragma once
|
|
|
|
#include "TermControl.h"
|
|
#include "TermControlAutomationPeer.g.h"
|
|
#include <winrt/Microsoft.Terminal.TerminalControl.h>
|
|
#include "TermControlUiaProvider.hpp"
|
|
#include "../types/IUiaEventDispatcher.h"
|
|
|
|
namespace winrt::Microsoft::Terminal::TerminalControl::implementation
|
|
{
|
|
struct TermControlAutomationPeer :
|
|
public TermControlAutomationPeerT<TermControlAutomationPeer>,
|
|
::Microsoft::Console::Types::IUiaEventDispatcher
|
|
{
|
|
public:
|
|
TermControlAutomationPeer(winrt::Microsoft::Terminal::TerminalControl::implementation::TermControl* owner);
|
|
|
|
winrt::hstring GetClassNameCore() const;
|
|
winrt::Windows::UI::Xaml::Automation::Peers::AutomationControlType GetAutomationControlTypeCore() const;
|
|
winrt::hstring GetLocalizedControlTypeCore() const;
|
|
winrt::Windows::Foundation::IInspectable GetPatternCore(winrt::Windows::UI::Xaml::Automation::Peers::PatternInterface patternInterface) const;
|
|
|
|
#pragma region IUiaEventDispatcher
|
|
void SignalSelectionChanged() override;
|
|
void SignalTextChanged() override;
|
|
void SignalCursorChanged() override;
|
|
#pragma endregion
|
|
|
|
#pragma region ITextProvider Pattern
|
|
Windows::UI::Xaml::Automation::Provider::ITextRangeProvider RangeFromPoint(Windows::Foundation::Point screenLocation);
|
|
Windows::UI::Xaml::Automation::Provider::ITextRangeProvider RangeFromChild(Windows::UI::Xaml::Automation::Provider::IRawElementProviderSimple childElement);
|
|
winrt::com_array<Windows::UI::Xaml::Automation::Provider::ITextRangeProvider> GetVisibleRanges();
|
|
winrt::com_array<Windows::UI::Xaml::Automation::Provider::ITextRangeProvider> GetSelection();
|
|
Windows::UI::Xaml::Automation::SupportedTextSelection SupportedTextSelection();
|
|
Windows::UI::Xaml::Automation::Provider::ITextRangeProvider DocumentRange();
|
|
#pragma endregion
|
|
|
|
RECT GetBoundingRectWrapped();
|
|
|
|
private:
|
|
::Microsoft::WRL::ComPtr<::Microsoft::Terminal::TermControlUiaProvider> _uiaProvider;
|
|
|
|
winrt::com_array<Windows::UI::Xaml::Automation::Provider::ITextRangeProvider> WrapArrayOfTextRangeProviders(SAFEARRAY* textRanges);
|
|
};
|
|
}
|