From c0f14567f349a44b732221662beb3a62ca49e1f4 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 4 Apr 2023 09:21:43 -0500 Subject: [PATCH] Use DIPs for the window bounds when tearing out (#15094) Fixes a bug where you'd drag across the boundary and the new window would be at the wrong size related to #14957 --- src/cascadia/TerminalApp/TerminalWindow.cpp | 8 ++++---- src/cascadia/WindowsTerminal/AppHost.cpp | 12 ++++++------ src/inc/til/size.h | 4 ++-- src/til/ut_til/SizeTests.cpp | 4 ++-- 4 files changed, 14 insertions(+), 14 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..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) @@ -1280,12 +1279,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) }; - 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 cf91a08a0d7..72dbb602852 100644 --- a/src/inc/til/size.h +++ b/src/inc/til/size.h @@ -75,7 +75,7 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned" } template>> - constexpr size scale(TilMath math, const T scale) const + [[nodiscard]] constexpr size scale(TilMath math, const T scale) const { return { math, @@ -84,7 +84,7 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned" }; } - 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. 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);