From c3f7031c34f528ae003036899cf4b490b91a9cdb Mon Sep 17 00:00:00 2001 From: Roman Woelker Date: Thu, 21 Mar 2024 14:56:21 +0100 Subject: [PATCH] Backport Qt patch - Revert "Windows QPA: Move transient children with a window move" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From 19471b2 Mon Sep 17 00:00:00 2001 From: Timothée Keller Date: Tue, 10 Oct 2023 07:57:09 +0000 Subject: [PATCH] Revert "Windows QPA: Move transient children with a window move" This reverts commit 530d092. Reason for revert: Moving transient children as a whole is too broad, and forces unrelated windows to have their position completely dependent on a transient parent. Fixes: QTBUG-117779 Pick-to: 6.5 Change-Id: I01312e26e95c8144c392eca33aec41f54aaa40b0 Reviewed-by: Tor Arne Vestbø (cherry picked from commit 614e0f1) Reviewed-by: Qt Cherry-pick Bot --- .../platforms/windows/qwindowswindow.cpp | 46 ------------------- .../platforms/windows/qwindowswindow.h | 6 --- 2 files changed, 52 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 9b5e9b2982d..af10ed5ebfe 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -947,7 +947,6 @@ QWindowsWindowData result.geometry = obtainedGeometry; result.restoreGeometry = frameGeometry(result.hwnd, topLevel); - result.preMoveGeometry = obtainedGeometry; result.fullFrameMargins = context->margins; result.embedded = embedded; result.hasFrame = hasFrame; @@ -2164,56 +2163,11 @@ void QWindowsWindow::setGeometry(const QRect &rectIn) } } -QWindow *QWindowsWindow::topTransientOf(QWindow *w) -{ - while (QWindow *transientParent = w->transientParent()) - w = transientParent; - return w; -} - -void QWindowsWindow::moveTransientChildren() -{ - // We need the topmost Transient parent since it is the window that will initiate - // the chain of moves, and is the only one with an already up to date DPI, which we - // need for the scaling. - const QWindowsWindow *topTransient = QWindowsWindow::windowsWindowOf(topTransientOf(window())); - - const QWindow *currentWindow = window(); - const QWindowList allWindows = QGuiApplication::allWindows(); - for (QWindow *w : allWindows) { - if (w->transientParent() == currentWindow && w != currentWindow && w->isVisible()) { - QWindowsWindow *transientChild = QWindowsWindow::windowsWindowOf(w); - - RECT oldChildPos{}; - GetWindowRect(transientChild->handle(), &oldChildPos); - const RECT oldParentPos = RECTfromQRect(preMoveRect()); - - const qreal scale = - QHighDpiScaling::roundScaleFactor(qreal(topTransient->savedDpi()) / QWindowsScreen::baseDpi) / - QHighDpiScaling::roundScaleFactor(qreal(transientChild->savedDpi()) / QWindowsScreen::baseDpi); - - const RECT offset = - RECTfromQRect(QRect(scale * (oldChildPos.left - oldParentPos.left), - scale * (oldChildPos.top - oldParentPos.top), 0, 0)); - const RECT newParentPos = RECTfromQRect(m_data.geometry); - const RECT newChildPos { newParentPos.left + offset.left, - newParentPos.top + offset.top, - transientChild->geometry().width(), - transientChild->geometry().height() }; - - SetWindowPos(transientChild->handle(), nullptr, newChildPos.left, newChildPos.top, - newChildPos.right, newChildPos.bottom, SWP_NOZORDER | SWP_NOACTIVATE); - } - } -} - void QWindowsWindow::handleMoved() { - setPreMoveRect(geometry()); // Minimize/Set parent can send nonsensical move events. if (!IsIconic(m_data.hwnd) && !testFlag(WithinSetParent)) handleGeometryChange(); - moveTransientChildren(); } void QWindowsWindow::handleResized(int wParam, LPARAM lParam) diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index bd936ecd54c..0d393ecbb50 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -78,7 +78,6 @@ struct QWindowsWindowData { Qt::WindowFlags flags; QRect geometry; - QRect preMoveGeometry; QRect restoreGeometry; QMargins fullFrameMargins; // Do not use directly for windows, see FrameDirty. QMargins customMargins; // User-defined, additional frame for NCCALCSIZE @@ -223,11 +222,6 @@ class QWindowsWindow : public QWindowsBaseWindow QRect restoreGeometry() const { return m_data.restoreGeometry; } void updateRestoreGeometry(); - static QWindow *topTransientOf(QWindow *w); - QRect preMoveRect() const { return m_data.preMoveGeometry; } - void setPreMoveRect(const QRect &rect) { m_data.preMoveGeometry = rect; } - void moveTransientChildren(); - void setVisible(bool visible) override; bool isVisible() const; bool isExposed() const override { return testFlag(Exposed); }