From 0519e86000bb9f51dbe870d13456b5f65b7c4251 Mon Sep 17 00:00:00 2001 From: Jeff Pek Date: Mon, 18 Mar 2024 12:38:29 -0400 Subject: [PATCH] Windows QPA: remove SWP_NOCOPYBITS for plain moves The SWP_NOCOPYBITS flag helps suppress some jittering during resizes. At the moment this is called even for plain moves with no window resizing. Make sure that the window geometry has changed before applying the SWP_NOCOPYBITS flag Fixes: QTBUG-115992 Pick-to: 6.6 6.5 Change-Id: Ic0cb32d9eb3b557bf2b2ef5b6ba80d34e27c5c19 Reviewed-by: Oliver Wolff Reviewed-by: Pavel Dubsky Cherry-picked into adsk-contrib-maya-v6.5.3 by Keith Kyzivat on 20231219 to fix MAYA-131850 (cherry picked from commit 9a64449cc353a35b37518ba4fcc62439877f6f10) (cherry picked from commit c4af263736fe7db9a4e718a6818aec361d41f8fe) --- src/plugins/platforms/windows/qwindowswindow.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index af1b95c3364..8a33897322f 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -2755,10 +2755,17 @@ void QWindowsWindow::propagateSizeHints() bool QWindowsWindow::handleGeometryChangingMessage(MSG *message, const QWindow *qWindow, const QMargins &margins) { auto *windowPos = reinterpret_cast(message->lParam); + const QRect suggestedFrameGeometry(windowPos->x, windowPos->y, + windowPos->cx, windowPos->cy); + const QRect suggestedGeometry = suggestedFrameGeometry - margins; // Tell Windows to discard the entire contents of the client area, as re-using // parts of the client area would lead to jitter during resize. - windowPos->flags |= SWP_NOCOPYBITS; + // Check the suggestedGeometry against the current one to only discard during + // resize, and not a plain move. We also look for SWP_NOSIZE since that, too, + // implies an identical size, and comparing QRects wouldn't work with null cx/cy + if (!(windowPos->flags & SWP_NOSIZE) && suggestedGeometry.size() != qWindow->geometry().size()) + windowPos->flags |= SWP_NOCOPYBITS; if ((windowPos->flags & SWP_NOZORDER) == 0) { if (QWindowsWindow *platformWindow = QWindowsWindow::windowsWindowOf(qWindow)) { @@ -2774,9 +2781,6 @@ bool QWindowsWindow::handleGeometryChangingMessage(MSG *message, const QWindow * return false; if (windowPos->flags & SWP_NOSIZE) return false; - const QRect suggestedFrameGeometry(windowPos->x, windowPos->y, - windowPos->cx, windowPos->cy); - const QRect suggestedGeometry = suggestedFrameGeometry - margins; const QRectF correctedGeometryF = QPlatformWindow::closestAcceptableGeometry(qWindow, suggestedGeometry); if (!correctedGeometryF.isValid()) return false;