From be52880620fefa8701f6ee254c7faee239a3889e Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Tue, 20 Aug 2019 17:50:34 -0700 Subject: [PATCH] Accessibility: Add BoundingRects to UiaTextRanges (#2423) --- src/cascadia/TerminalControl/TermControl.cpp | 10 ++++++ src/cascadia/TerminalControl/TermControl.h | 2 ++ .../TermControlAutomationPeer.cpp | 2 +- .../TermControlUiaProvider.cpp | 18 +++++++++-- .../TermControlUiaProvider.hpp | 11 ++++++- src/cascadia/TerminalControl/UiaTextRange.cpp | 31 +++++++++++++++++-- src/cascadia/TerminalControl/UiaTextRange.hpp | 1 + src/types/UiaTextRangeBase.cpp | 2 +- src/types/UiaTextRangeBase.hpp | 2 +- 9 files changed, 70 insertions(+), 9 deletions(-) diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 757f03b93e..66a068b748 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -352,6 +352,16 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation return _terminal.get(); } + const FontInfo TermControl::GetActualFont() const + { + return _actualFont; + } + + const Windows::UI::Xaml::Thickness TermControl::GetPadding() const + { + return _swapChainPanel.Margin(); + } + void TermControl::SwapChainChanged() { if (!_initializedTerminal) diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 969584407c..14a9e4045b 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -73,6 +73,8 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation Windows::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer(); ::Microsoft::Console::Types::IUiaData* GetUiaData() const; + const FontInfo GetActualFont() const; + const Windows::UI::Xaml::Thickness GetPadding() const; static Windows::Foundation::Point GetProposedDimensions(Microsoft::Terminal::Settings::IControlSettings const& settings, const uint32_t dpi); diff --git a/src/cascadia/TerminalControl/TermControlAutomationPeer.cpp b/src/cascadia/TerminalControl/TermControlAutomationPeer.cpp index dcd677752b..585eb32cfa 100644 --- a/src/cascadia/TerminalControl/TermControlAutomationPeer.cpp +++ b/src/cascadia/TerminalControl/TermControlAutomationPeer.cpp @@ -29,7 +29,7 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation { TermControlAutomationPeer::TermControlAutomationPeer(winrt::Microsoft::Terminal::TerminalControl::implementation::TermControl const& owner) : TermControlAutomationPeerT(owner), // pass owner to FrameworkElementAutomationPeer - _uiaProvider{ owner.GetUiaData(), std::bind(&TermControlAutomationPeer::GetBoundingRectWrapped, this) } {}; + _uiaProvider{ owner, std::bind(&TermControlAutomationPeer::GetBoundingRectWrapped, this) } {}; winrt::hstring TermControlAutomationPeer::GetClassNameCore() const { diff --git a/src/cascadia/TerminalControl/TermControlUiaProvider.cpp b/src/cascadia/TerminalControl/TermControlUiaProvider.cpp index eaac4ad4f7..19298e8621 100644 --- a/src/cascadia/TerminalControl/TermControlUiaProvider.cpp +++ b/src/cascadia/TerminalControl/TermControlUiaProvider.cpp @@ -3,14 +3,16 @@ #include "pch.h" #include "TermControlUiaProvider.hpp" +#include "TermControl.h" using namespace Microsoft::Terminal; using namespace Microsoft::Console::Types; -TermControlUiaProvider::TermControlUiaProvider(_In_ IUiaData* pData, +TermControlUiaProvider::TermControlUiaProvider(_In_ winrt::Microsoft::Terminal::TerminalControl::implementation::TermControl const& termControl, _In_ std::function GetBoundingRect) : _getBoundingRect(GetBoundingRect), - ScreenInfoUiaProviderBase(THROW_HR_IF_NULL(E_INVALIDARG, pData)) + _termControl(termControl), + ScreenInfoUiaProviderBase(THROW_HR_IF_NULL(E_INVALIDARG, termControl.GetUiaData())) { // TODO GitHub #1914: Re-attach Tracing to UIA Tree //Tracing::s_TraceUia(nullptr, ApiCall::Constructor, nullptr); @@ -78,7 +80,17 @@ IFACEMETHODIMP TermControlUiaProvider::get_FragmentRoot(_COM_Outptr_result_maybe return S_OK; } -std::deque TermControlUiaProvider::GetSelectionRanges(_In_ IRawElementProviderSimple* pProvider) +const COORD TermControlUiaProvider::GetFontSize() const +{ + return _termControl.GetActualFont().GetSize(); +} + +const winrt::Windows::UI::Xaml::Thickness TermControlUiaProvider::GetPadding() const +{ + return _termControl.GetPadding(); +} + +std::deque TermControlUiaProvider::GetSelectionRanges(_In_ IRawElementProviderSimple* const pProvider) { std::deque result; diff --git a/src/cascadia/TerminalControl/TermControlUiaProvider.hpp b/src/cascadia/TerminalControl/TermControlUiaProvider.hpp index e536fb9396..b71211502b 100644 --- a/src/cascadia/TerminalControl/TermControlUiaProvider.hpp +++ b/src/cascadia/TerminalControl/TermControlUiaProvider.hpp @@ -23,12 +23,17 @@ Author(s): #include "..\types\UiaTextRangeBase.hpp" #include "UiaTextRange.hpp" +namespace winrt::Microsoft::Terminal::TerminalControl::implementation +{ + struct TermControl; +} + namespace Microsoft::Terminal { class TermControlUiaProvider : public Microsoft::Console::Types::ScreenInfoUiaProviderBase { public: - TermControlUiaProvider(_In_ Microsoft::Console::Types::IUiaData* pData, + TermControlUiaProvider(_In_ winrt::Microsoft::Terminal::TerminalControl::implementation::TermControl const& termControl, _In_ std::function GetBoundingRect); // IRawElementProviderFragment methods @@ -37,6 +42,9 @@ namespace Microsoft::Terminal IFACEMETHODIMP get_BoundingRectangle(_Out_ UiaRect* pRect) override; IFACEMETHODIMP get_FragmentRoot(_COM_Outptr_result_maybenull_ IRawElementProviderFragmentRoot** ppProvider) override; + const COORD GetFontSize() const; + const winrt::Windows::UI::Xaml::Thickness GetPadding() const; + protected: std::deque GetSelectionRanges(_In_ IRawElementProviderSimple* pProvider) override; @@ -59,5 +67,6 @@ namespace Microsoft::Terminal private: std::function _getBoundingRect; + winrt::Microsoft::Terminal::TerminalControl::implementation::TermControl const& _termControl; }; } diff --git a/src/cascadia/TerminalControl/UiaTextRange.cpp b/src/cascadia/TerminalControl/UiaTextRange.cpp index 5eb9c8ac12..93133347a7 100644 --- a/src/cascadia/TerminalControl/UiaTextRange.cpp +++ b/src/cascadia/TerminalControl/UiaTextRange.cpp @@ -186,12 +186,39 @@ void UiaTextRange::_ChangeViewport(const SMALL_RECT /*NewWindow*/) // TODO GitHub #2361: Update viewport when calling UiaTextRangeBase::ScrollIntoView() } -void UiaTextRange::_TranslatePointToScreen(LPPOINT /*clientPoint*/) const +// Method Description: +// - Transform coordinates relative to the client to relative to the screen +// Arguments: +// - clientPoint: coordinates relative to the client where +// (0,0) is the top-left of the app window +// Return Value: +// - +void UiaTextRange::_TranslatePointToScreen(LPPOINT clientPoint) const { - // TODO GitHub #2103: NON-HWND IMPLEMENTATION OF CLIENTTOSCREEN() + auto provider = static_cast(_pProvider.get()); + + // update based on TermControl location (important for Panes) + UiaRect boundingRect; + THROW_IF_FAILED(provider->get_BoundingRectangle(&boundingRect)); + clientPoint->x += gsl::narrow(boundingRect.left); + clientPoint->y += gsl::narrow(boundingRect.top); + + // update based on TermControl padding + auto padding = provider->GetPadding(); + clientPoint->x += gsl::narrow(padding.Left); + clientPoint->y += gsl::narrow(padding.Top); } void UiaTextRange::_TranslatePointFromScreen(LPPOINT /*screenPoint*/) const { // TODO GitHub #2103: NON-HWND IMPLEMENTATION OF SCREENTOCLIENT() } + +const COORD UiaTextRange::_getScreenFontSize() const +{ + // Do NOT get the font info from IRenderData. It is a dummy font info. + // Instead, the font info is saved in the TermControl. So we have to + // ask our parent to get it for us. + auto provider = static_cast(_pProvider.get()); + return provider->GetFontSize(); +} diff --git a/src/cascadia/TerminalControl/UiaTextRange.hpp b/src/cascadia/TerminalControl/UiaTextRange.hpp index 7e561e3f97..020373b430 100644 --- a/src/cascadia/TerminalControl/UiaTextRange.hpp +++ b/src/cascadia/TerminalControl/UiaTextRange.hpp @@ -57,6 +57,7 @@ namespace Microsoft::Terminal void _ChangeViewport(const SMALL_RECT NewWindow) override; void _TranslatePointToScreen(LPPOINT clientPoint) const override; void _TranslatePointFromScreen(LPPOINT screenPoint) const override; + const COORD _getScreenFontSize() const override; private: // degenerate range diff --git a/src/types/UiaTextRangeBase.cpp b/src/types/UiaTextRangeBase.cpp index 845ce21042..47e7d502f3 100644 --- a/src/types/UiaTextRangeBase.cpp +++ b/src/types/UiaTextRangeBase.cpp @@ -1020,7 +1020,7 @@ const COORD UiaTextRangeBase::_getScreenBufferCoords(IUiaData* pData) return pData->GetTextBuffer().GetSize().Dimensions(); } -COORD UiaTextRangeBase::_getScreenFontSize() const +const COORD UiaTextRangeBase::_getScreenFontSize() const { COORD coordRet = _pData->GetFontInfo().GetSize(); diff --git a/src/types/UiaTextRangeBase.hpp b/src/types/UiaTextRangeBase.hpp index 0a82ab2dc5..1d1f957af3 100644 --- a/src/types/UiaTextRangeBase.hpp +++ b/src/types/UiaTextRangeBase.hpp @@ -260,7 +260,7 @@ namespace Microsoft::Console::Types RECT _getTerminalRect() const; static const COORD _getScreenBufferCoords(IUiaData* pData); - COORD _getScreenFontSize() const; + virtual const COORD _getScreenFontSize() const; static const unsigned int _getTotalRows(IUiaData* pData); static const unsigned int _getRowWidth(IUiaData* pData);