From f9cbde7171f9aaaff84bcbcf07fda8306151b35d Mon Sep 17 00:00:00 2001 From: teaP Date: Wed, 8 Jan 2020 10:58:46 -0800 Subject: [PATCH 1/2] Update to use new SpanningRects API instead of DisplayRegions. --- dev/TwoPaneView/DisplayRegionHelper.cpp | 42 +++++++++++-------------- dev/TwoPaneView/DisplayRegionHelper.h | 1 - dev/TwoPaneView/TwoPaneView.cpp | 6 ++++ dev/TwoPaneView/TwoPaneView.h | 1 + dev/TwoPaneView/TwoPaneView.idl | 11 ++++++- dev/dll/SharedHelpers.cpp | 9 +++--- dev/dll/pch.h | 1 - dev/inc/SharedHelpers.h | 2 +- 8 files changed, 40 insertions(+), 33 deletions(-) diff --git a/dev/TwoPaneView/DisplayRegionHelper.cpp b/dev/TwoPaneView/DisplayRegionHelper.cpp index 5eee935800..c26a0c1b58 100644 --- a/dev/TwoPaneView/DisplayRegionHelper.cpp +++ b/dev/TwoPaneView/DisplayRegionHelper.cpp @@ -14,7 +14,6 @@ DisplayRegionHelperInfo DisplayRegionHelper::GetRegionInfo() auto instance = LifetimeHandler::GetDisplayRegionHelperInstance(); DisplayRegionHelperInfo info; - info.RegionCount = 1; info.Mode = winrt::TwoPaneViewMode::SinglePane; if (instance->m_simulateDisplayRegions) @@ -22,25 +21,22 @@ DisplayRegionHelperInfo DisplayRegionHelper::GetRegionInfo() // Create fake rectangles for test app if (instance->m_simulateMode == winrt::TwoPaneViewMode::Wide) { - info.RegionCount = 2; info.Regions[0] = m_simulateWide0; info.Regions[1] = m_simulateWide1; info.Mode = winrt::TwoPaneViewMode::Wide; } else if (instance->m_simulateMode == winrt::TwoPaneViewMode::Tall) { - info.RegionCount = 2; info.Regions[0] = m_simulateTall0; info.Regions[1] = m_simulateTall1; info.Mode = winrt::TwoPaneViewMode::Tall; } else { - info.RegionCount = 1; info.Regions[0] = m_simulateWide0; } } - else if (SharedHelpers::IsApplicationViewGetDisplayRegionsAvailable()) + else if (SharedHelpers::IsApplicationViewGetSpanningRectsAvailable()) { // ApplicationView::GetForCurrentView throws on failure; in that case we just won't do anything. winrt::ApplicationView view{ nullptr }; @@ -49,30 +45,28 @@ DisplayRegionHelperInfo DisplayRegionHelper::GetRegionInfo() view = winrt::ApplicationView::GetForCurrentView(); } catch(...) {} - // Verify that the window is Tiled if (view) { - auto regions = view.GetDisplayRegions(); - info.RegionCount = std::min(regions.Size(), c_maxRegions); - - // More than one region - if (info.RegionCount == 2) + if (const auto appView = view.as()) { - winrt::Rect windowRect = WindowRect(); + winrt::IVectorView rects = appView.GetSpanningRects(); - if (windowRect.Width > windowRect.Height) - { - info.Mode = winrt::TwoPaneViewMode::Wide; - float width = windowRect.Width / 2; - info.Regions[0] = { 0, 0, width, windowRect.Height }; - info.Regions[1] = { width, 0, width, windowRect.Height }; - } - else + if (rects.Size() == 2) { - info.Mode = winrt::TwoPaneViewMode::Tall; - float height = windowRect.Height / 2; - info.Regions[0] = { 0, 0, windowRect.Width, height }; - info.Regions[1] = { 0, height, windowRect.Width, height }; + info.Regions[0] = rects.GetAt(0); + info.Regions[1] = rects.GetAt(1); + + // Determine orientation. If neither of these are true, default to doing nothing. + if (info.Regions[0].X < info.Regions[1].X && info.Regions[0].Y == info.Regions[1].Y) + { + // Double portrait + info.Mode = winrt::TwoPaneViewMode::Wide; + } + else if (info.Regions[0].X == info.Regions[1].X && info.Regions[0].Y < info.Regions[1].Y) + { + // Double landscape + info.Mode = winrt::TwoPaneViewMode::Tall; + } } } } diff --git a/dev/TwoPaneView/DisplayRegionHelper.h b/dev/TwoPaneView/DisplayRegionHelper.h index 7cdbda10bd..75abbb3614 100644 --- a/dev/TwoPaneView/DisplayRegionHelper.h +++ b/dev/TwoPaneView/DisplayRegionHelper.h @@ -9,7 +9,6 @@ struct DisplayRegionHelperInfo { winrt::TwoPaneViewMode Mode{ winrt::TwoPaneViewMode::SinglePane }; std::array Regions{}; - uint32_t RegionCount{ 0 }; }; class DisplayRegionHelper: diff --git a/dev/TwoPaneView/TwoPaneView.cpp b/dev/TwoPaneView/TwoPaneView.cpp index ef6695b561..a03614e605 100644 --- a/dev/TwoPaneView/TwoPaneView.cpp +++ b/dev/TwoPaneView/TwoPaneView.cpp @@ -26,6 +26,7 @@ TwoPaneView::TwoPaneView() SetDefaultStyleKey(this); SizeChanged({ this, &TwoPaneView::OnSizeChanged }); + winrt::Window::Current().SizeChanged({ this, &TwoPaneView::OnWindowSizeChanged }); EnsureProperties(); } @@ -99,6 +100,11 @@ void TwoPaneView::OnScrollViewerLoaded(const winrt::IInspectable& sender, const } } +void TwoPaneView::OnWindowSizeChanged(const winrt::IInspectable& sender, const winrt::WindowSizeChangedEventArgs& args) +{ + UpdateMode(); +} + void TwoPaneView::OnSizeChanged(const winrt::IInspectable& sender, const winrt::SizeChangedEventArgs& args) { UpdateMode(); diff --git a/dev/TwoPaneView/TwoPaneView.h b/dev/TwoPaneView/TwoPaneView.h index 5f6ada17e9..e7b25a364a 100644 --- a/dev/TwoPaneView/TwoPaneView.h +++ b/dev/TwoPaneView/TwoPaneView.h @@ -43,6 +43,7 @@ class TwoPaneView : void OnScrollViewerLoaded(const winrt::IInspectable& sender, const winrt::RoutedEventArgs& args); void OnSizeChanged(const winrt::IInspectable& sender, const winrt::SizeChangedEventArgs& args); + void OnWindowSizeChanged(const winrt::IInspectable& sender, const winrt::WindowSizeChangedEventArgs& args); void UpdateRowsColumns(ViewMode newMode, DisplayRegionHelperInfo info, winrt::Rect rcControl); void UpdateMode(); diff --git a/dev/TwoPaneView/TwoPaneView.idl b/dev/TwoPaneView/TwoPaneView.idl index edf5301102..0920f2abf8 100644 --- a/dev/TwoPaneView/TwoPaneView.idl +++ b/dev/TwoPaneView/TwoPaneView.idl @@ -77,4 +77,13 @@ unsealed runtimeclass TwoPaneView : Windows.UI.Xaml.Controls.Control static Windows.UI.Xaml.DependencyProperty MinTallModeHeightProperty { get; }; } -} \ No newline at end of file +// TODO: Once IApplicationViewSpanningRects is available in the official SDK, remove this. +[WUXC_VERSION_INTERNAL] +[webhosthidden] +[uuid(645737E4-A882-4E16-B289-FD860560106A)] +interface IApplicationViewSpanningRects : IInspectable +{ + Windows.Foundation.Collections.IVectorView GetSpanningRects(); +} + +} diff --git a/dev/dll/SharedHelpers.cpp b/dev/dll/SharedHelpers.cpp index 8e4516e083..5e7f2e088e 100644 --- a/dev/dll/SharedHelpers.cpp +++ b/dev/dll/SharedHelpers.cpp @@ -143,12 +143,11 @@ bool SharedHelpers::IsFrameworkElementInvalidateViewportAvailable() return s_isFrameworkElementInvalidateViewportAvailable; } -bool SharedHelpers::IsApplicationViewGetDisplayRegionsAvailable() +bool SharedHelpers::IsApplicationViewGetSpanningRectsAvailable() { - static bool s_isApplicationViewGetDisplayRegionsAvailable = - Is19H1OrHigher() || - winrt::ApiInformation::IsMethodPresent(L"Windows.UI.ViewManagement.ApplicationView", L"GetDisplayRegions"); - return s_isApplicationViewGetDisplayRegionsAvailable; + static bool s_isApplicationViewGetSpanningRectsAvailable = + winrt::ApiInformation::IsMethodPresent(L"Windows.UI.ViewManagement.ApplicationView", L"GetSpanningRects"); + return s_isApplicationViewGetSpanningRectsAvailable; } bool SharedHelpers::IsControlCornerRadiusAvailable() diff --git a/dev/dll/pch.h b/dev/dll/pch.h index 594dea0876..493febc6aa 100644 --- a/dev/dll/pch.h +++ b/dev/dll/pch.h @@ -194,7 +194,6 @@ void specialize_guids() #endif #ifdef TWOPANEVIEW_INCLUDED - winrt::guid_of>(); winrt::guid_of>(); winrt::guid_of>(); winrt::guid_of>(); diff --git a/dev/inc/SharedHelpers.h b/dev/inc/SharedHelpers.h index 1226704b56..078327abdf 100644 --- a/dev/inc/SharedHelpers.h +++ b/dev/inc/SharedHelpers.h @@ -41,7 +41,7 @@ class SharedHelpers static bool IsFrameworkElementInvalidateViewportAvailable(); - static bool IsApplicationViewGetDisplayRegionsAvailable(); + static bool IsApplicationViewGetSpanningRectsAvailable(); static bool IsControlCornerRadiusAvailable(); From 6339f0f1ab806a70cc66b50e4edea1865d42106f Mon Sep 17 00:00:00 2001 From: teaP Date: Wed, 8 Jan 2020 14:33:11 -0800 Subject: [PATCH 2/2] PR update --- dev/TwoPaneView/DisplayRegionHelper.cpp | 4 ++-- dev/dll/SharedHelpers.cpp | 7 ------- dev/inc/SharedHelpers.h | 2 -- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/dev/TwoPaneView/DisplayRegionHelper.cpp b/dev/TwoPaneView/DisplayRegionHelper.cpp index c26a0c1b58..47ebfa6ec5 100644 --- a/dev/TwoPaneView/DisplayRegionHelper.cpp +++ b/dev/TwoPaneView/DisplayRegionHelper.cpp @@ -36,7 +36,7 @@ DisplayRegionHelperInfo DisplayRegionHelper::GetRegionInfo() info.Regions[0] = m_simulateWide0; } } - else if (SharedHelpers::IsApplicationViewGetSpanningRectsAvailable()) + else { // ApplicationView::GetForCurrentView throws on failure; in that case we just won't do anything. winrt::ApplicationView view{ nullptr }; @@ -47,7 +47,7 @@ DisplayRegionHelperInfo DisplayRegionHelper::GetRegionInfo() if (view) { - if (const auto appView = view.as()) + if (const auto appView = view.try_as()) { winrt::IVectorView rects = appView.GetSpanningRects(); diff --git a/dev/dll/SharedHelpers.cpp b/dev/dll/SharedHelpers.cpp index 5e7f2e088e..b6772b25ea 100644 --- a/dev/dll/SharedHelpers.cpp +++ b/dev/dll/SharedHelpers.cpp @@ -143,13 +143,6 @@ bool SharedHelpers::IsFrameworkElementInvalidateViewportAvailable() return s_isFrameworkElementInvalidateViewportAvailable; } -bool SharedHelpers::IsApplicationViewGetSpanningRectsAvailable() -{ - static bool s_isApplicationViewGetSpanningRectsAvailable = - winrt::ApiInformation::IsMethodPresent(L"Windows.UI.ViewManagement.ApplicationView", L"GetSpanningRects"); - return s_isApplicationViewGetSpanningRectsAvailable; -} - bool SharedHelpers::IsControlCornerRadiusAvailable() { static bool s_isControlCornerRadiusAvailable = diff --git a/dev/inc/SharedHelpers.h b/dev/inc/SharedHelpers.h index 078327abdf..021277f7b0 100644 --- a/dev/inc/SharedHelpers.h +++ b/dev/inc/SharedHelpers.h @@ -41,8 +41,6 @@ class SharedHelpers static bool IsFrameworkElementInvalidateViewportAvailable(); - static bool IsApplicationViewGetSpanningRectsAvailable(); - static bool IsControlCornerRadiusAvailable(); static bool IsTranslationFacadeAvailable(const winrt::UIElement& element);