diff options
author | Yuhang Zhao <2546789017@qq.com> | 2021-10-24 12:59:02 +0800 |
---|---|---|
committer | Yuhang Zhao <2546789017@qq.com> | 2021-11-12 04:59:00 +0800 |
commit | 000f1ee3604048f693f2a9425948a37ec45b4301 (patch) | |
tree | d77dbdcdff93270cc217b4153de1e57123b3ddb7 /src/plugins | |
parent | 1d983f2902497998329de405638b3e855f2b15ff (diff) |
Windows QPA: Set SWP_NOCOPYBITS during resize to avoid jitter
Allowing Windows to re-use parts of the client area when resizing
might result in jitter. See discussion in:
https://stackoverflow.com/questions/53000291/how-to-smooth-ugly-jitter-flicker-jumping-when-resizing-windows-especially-drag
Fixes: QTBUG-97774
Pick-to: 6.2
Change-Id: Idc8f0d1953dd0a8b329312d8a9fd0509cc24d81f
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 5988d1498d..c4a85ab21e 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -2481,6 +2481,11 @@ void QWindowsWindow::propagateSizeHints() bool QWindowsWindow::handleGeometryChangingMessage(MSG *message, const QWindow *qWindow, const QMargins &margins) { auto *windowPos = reinterpret_cast<WINDOWPOS *>(message->lParam); + + // 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; + if ((windowPos->flags & SWP_NOZORDER) == 0) { if (QWindowsWindow *platformWindow = QWindowsWindow::windowsWindowOf(qWindow)) { QWindow *parentWindow = qWindow->parent(); @@ -2493,7 +2498,7 @@ bool QWindowsWindow::handleGeometryChangingMessage(MSG *message, const QWindow * } if (!qWindow->isTopLevel()) // Implement hasHeightForWidth(). return false; - if ((windowPos->flags & (SWP_NOCOPYBITS | SWP_NOSIZE))) + if (windowPos->flags & SWP_NOSIZE) return false; const QRect suggestedFrameGeometry(windowPos->x, windowPos->y, windowPos->cx, windowPos->cy); |