Revert "Windows QPA: Move transient children with a window move"
This reverts commit 530d092eae0579bbb88e95f853715cac214da636. 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ø <tor.arne.vestbo@qt.io> (cherry picked from commit 614e0f1daa9da2c285e2fd3868f7ebfa9837164c) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
deb49de7bc
commit
19471b215d
@ -940,7 +940,6 @@ QWindowsWindowData
|
|||||||
|
|
||||||
result.geometry = obtainedGeometry;
|
result.geometry = obtainedGeometry;
|
||||||
result.restoreGeometry = frameGeometry(result.hwnd, topLevel);
|
result.restoreGeometry = frameGeometry(result.hwnd, topLevel);
|
||||||
result.preMoveGeometry = obtainedGeometry;
|
|
||||||
result.fullFrameMargins = context->margins;
|
result.fullFrameMargins = context->margins;
|
||||||
result.embedded = embedded;
|
result.embedded = embedded;
|
||||||
result.hasFrame = hasFrame;
|
result.hasFrame = hasFrame;
|
||||||
@ -2157,56 +2156,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()
|
void QWindowsWindow::handleMoved()
|
||||||
{
|
{
|
||||||
setPreMoveRect(geometry());
|
|
||||||
// Minimize/Set parent can send nonsensical move events.
|
// Minimize/Set parent can send nonsensical move events.
|
||||||
if (!IsIconic(m_data.hwnd) && !testFlag(WithinSetParent))
|
if (!IsIconic(m_data.hwnd) && !testFlag(WithinSetParent))
|
||||||
handleGeometryChange();
|
handleGeometryChange();
|
||||||
moveTransientChildren();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QWindowsWindow::handleResized(int wParam, LPARAM lParam)
|
void QWindowsWindow::handleResized(int wParam, LPARAM lParam)
|
||||||
|
@ -78,7 +78,6 @@ struct QWindowsWindowData
|
|||||||
{
|
{
|
||||||
Qt::WindowFlags flags;
|
Qt::WindowFlags flags;
|
||||||
QRect geometry;
|
QRect geometry;
|
||||||
QRect preMoveGeometry;
|
|
||||||
QRect restoreGeometry;
|
QRect restoreGeometry;
|
||||||
QMargins fullFrameMargins; // Do not use directly for windows, see FrameDirty.
|
QMargins fullFrameMargins; // Do not use directly for windows, see FrameDirty.
|
||||||
QMargins customMargins; // User-defined, additional frame for NCCALCSIZE
|
QMargins customMargins; // User-defined, additional frame for NCCALCSIZE
|
||||||
@ -223,11 +222,6 @@ public:
|
|||||||
QRect restoreGeometry() const { return m_data.restoreGeometry; }
|
QRect restoreGeometry() const { return m_data.restoreGeometry; }
|
||||||
void updateRestoreGeometry();
|
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;
|
void setVisible(bool visible) override;
|
||||||
bool isVisible() const;
|
bool isVisible() const;
|
||||||
bool isExposed() const override { return testFlag(Exposed); }
|
bool isExposed() const override { return testFlag(Exposed); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user