From 53c26699ae301ea6eb31f126a2ed31d5be9d2e5e Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Mon, 3 Apr 2023 14:24:14 -0500 Subject: [PATCH 1/3] Use DIPs for the window bounds when tearing out --- src/cascadia/TerminalApp/TerminalWindow.cpp | 8 ++++---- src/cascadia/WindowsTerminal/AppHost.cpp | 10 ++++++---- src/inc/til/size.h | 2 ++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/cascadia/TerminalApp/TerminalWindow.cpp b/src/cascadia/TerminalApp/TerminalWindow.cpp index dd984c6c126..07cc41274ee 100644 --- a/src/cascadia/TerminalApp/TerminalWindow.cpp +++ b/src/cascadia/TerminalApp/TerminalWindow.cpp @@ -613,11 +613,11 @@ namespace winrt::TerminalApp::implementation if (_contentBounds) { // If we've been created as a torn-out window, then we'll need to - // use that size instead. _contentBounds is in raw pixels. Huzzah! - // Just return that. + // use that size instead. _contentBounds is in DIPs. Scale + // accordingly to the new pixel size. return { - _contentBounds.Value().Width, - _contentBounds.Value().Height + _contentBounds.Value().Width * scale, + _contentBounds.Value().Height * scale }; } diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index 3776017f25e..9f523b8a995 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -1280,11 +1280,13 @@ void AppHost::_handleMoveContent(const winrt::Windows::Foundation::IInspectable& dragPositionInPixels.y -= nonClientFrame.top; windowSize = windowSize - nonClientFrame.size(); + // Convert to DIPs for the size, so that dragging across a DPI boundary + // retains the correct dimensions. + const auto sizeInDips = windowSize.scale(til::math::rounding, 1.0f / scale); + til::rect inDips{ dragPositionInPixels, sizeInDips }; + // Use the drag event as the new position, and the size of the actual window. - rect = winrt::Windows::Foundation::Rect{ static_cast(dragPositionInPixels.x), - static_cast(dragPositionInPixels.y), - static_cast(windowSize.width), - static_cast(windowSize.height) }; + rect = winrt::Windows::Foundation::Rect{ inDips.to_winrt_rect() }; windowBoundsReference = rect; } diff --git a/src/inc/til/size.h b/src/inc/til/size.h index cf91a08a0d7..d0b9b6bfd20 100644 --- a/src/inc/til/size.h +++ b/src/inc/til/size.h @@ -75,6 +75,7 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned" } template>> + [[nodiscard]] constexpr size scale(TilMath math, const T scale) const { return { @@ -84,6 +85,7 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned" }; } + [[nodiscard]] constexpr size divide_ceil(const size other) const { // The integer ceil division `((a - 1) / b) + 1` only works for numbers >0. From 302c8f148cf4b740935895a2bf10380284b66bca Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Mon, 3 Apr 2023 16:57:12 -0500 Subject: [PATCH 2/3] easier --- src/cascadia/WindowsTerminal/AppHost.cpp | 4 +--- src/inc/til/size.h | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index 9f523b8a995..df55bfa7e0f 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -1231,7 +1231,6 @@ winrt::TerminalApp::TerminalWindow AppHost::Logic() void AppHost::_handleMoveContent(const winrt::Windows::Foundation::IInspectable& /*sender*/, winrt::TerminalApp::RequestMoveContentArgs args) { - winrt::Windows::Foundation::Rect rect{}; winrt::Windows::Foundation::IReference windowBoundsReference{ nullptr }; if (args.WindowPosition() && _window) @@ -1286,8 +1285,7 @@ void AppHost::_handleMoveContent(const winrt::Windows::Foundation::IInspectable& til::rect inDips{ dragPositionInPixels, sizeInDips }; // Use the drag event as the new position, and the size of the actual window. - rect = winrt::Windows::Foundation::Rect{ inDips.to_winrt_rect() }; - windowBoundsReference = rect; + windowBoundsReference = inDips.to_winrt_rect(); } _windowManager.RequestMoveContent(args.Window(), args.Content(), args.TabIndex(), windowBoundsReference); diff --git a/src/inc/til/size.h b/src/inc/til/size.h index d0b9b6bfd20..72dbb602852 100644 --- a/src/inc/til/size.h +++ b/src/inc/til/size.h @@ -75,8 +75,7 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned" } template>> - [[nodiscard]] - constexpr size scale(TilMath math, const T scale) const + [[nodiscard]] constexpr size scale(TilMath math, const T scale) const { return { math, @@ -85,8 +84,7 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned" }; } - [[nodiscard]] - constexpr size divide_ceil(const size other) const + [[nodiscard]] constexpr size divide_ceil(const size other) const { // The integer ceil division `((a - 1) / b) + 1` only works for numbers >0. // Support for negative numbers wasn't deemed useful at this point. From 28f583a8f473f9f92f7f39eb7aba92e052620d0a Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 4 Apr 2023 08:48:47 -0500 Subject: [PATCH 3/3] std::ignore the tests is what I did --- src/til/ut_til/SizeTests.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/til/ut_til/SizeTests.cpp b/src/til/ut_til/SizeTests.cpp index 357ab300785..a75b48922a2 100644 --- a/src/til/ut_til/SizeTests.cpp +++ b/src/til/ut_til/SizeTests.cpp @@ -306,7 +306,7 @@ class SizeTests constexpr auto scale = 1e12f; auto fn = [&]() { - sz.scale(til::math::ceiling, scale); + std::ignore = sz.scale(til::math::ceiling, scale); }; VERIFY_THROWS(fn(), gsl::narrowing_error); @@ -359,7 +359,7 @@ class SizeTests const til::size divisor{ 3, 2 }; auto fn = [&]() { - sz.divide_ceil(divisor); + std::ignore = sz.divide_ceil(divisor); }; VERIFY_THROWS(fn(), std::invalid_argument);