Reset QWindow positionPolicy on destroy
If a window is positioned with setFramePosition, we reflect that to the platform window via QPlatformWindow::setGeometry(), but with the QWindowPrivate::positionPolicy set to WindowFrameInclusive. On the platform side the position policy is read from QWindowPrivate to determine how to interpret the incoming geometry. When the resulting geometry is applied to the native window, it's reflected through QPlatformWindow::geometry() and reported back via QWSI::handleGeometryChange() as client geometry, ie. without the frame margins. If the platform layer later interprets this geometry in combination with the window's positionPolicy, it will incorrectly position the frame top left at the point of the client geometry's top left. It would make sense to reset the window's positionPolicy at the point of QGuiApplicationPrivate::processGeometryChangeEvent, but doing so might break situations where there's another in flight geometry request. What we can do as a first step is reset the positionPolicy when the platform window is destroyed. This ensures that the next time the platform window is created it will be placed at the same position, even if the initial position was requested via the setFramePosition() API. Change-Id: Ic555f19884ccd68c46421d0fe666717170ba7638 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> (cherry picked from commit 11a09a9bd0a7e899a918b078a94c6c3b82240dee) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
fe88ab0f5d
commit
c97e58bb61
@ -2125,6 +2125,11 @@ void QWindowPrivate::destroy()
|
|||||||
resizeEventPending = true;
|
resizeEventPending = true;
|
||||||
receivedExpose = false;
|
receivedExpose = false;
|
||||||
exposed = false;
|
exposed = false;
|
||||||
|
|
||||||
|
// Position set via setFramePosition will have propagated back to
|
||||||
|
// our geometry member as client geometry, so when creating the
|
||||||
|
// window again we need to ensure the policy matches that.
|
||||||
|
positionPolicy = QWindowPrivate::WindowFrameExclusive;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -47,6 +47,7 @@ private slots:
|
|||||||
void positioning();
|
void positioning();
|
||||||
void framePositioning();
|
void framePositioning();
|
||||||
void framePositioning_data();
|
void framePositioning_data();
|
||||||
|
void framePositioningStableAfterDestroy();
|
||||||
void positioningDuringMinimized();
|
void positioningDuringMinimized();
|
||||||
void childWindowPositioning_data();
|
void childWindowPositioning_data();
|
||||||
void childWindowPositioning();
|
void childWindowPositioning();
|
||||||
@ -666,6 +667,23 @@ void tst_QWindow::framePositioning()
|
|||||||
QTRY_COMPARE(screenCenterAdjusted, window.position());
|
QTRY_COMPARE(screenCenterAdjusted, window.position());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QWindow::framePositioningStableAfterDestroy()
|
||||||
|
{
|
||||||
|
QWindow window;
|
||||||
|
window.setFramePosition(QPoint(100, 100));
|
||||||
|
window.show();
|
||||||
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
||||||
|
|
||||||
|
const QPoint stablePosition = window.position();
|
||||||
|
const QPoint stableFramePosition = window.framePosition();
|
||||||
|
|
||||||
|
window.destroy();
|
||||||
|
window.show();
|
||||||
|
QVERIFY(QTest::qWaitForWindowExposed(&window));
|
||||||
|
QCOMPARE(window.position(), stablePosition);
|
||||||
|
QCOMPARE(window.framePosition(), stableFramePosition);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QWindow::positioningDuringMinimized()
|
void tst_QWindow::positioningDuringMinimized()
|
||||||
{
|
{
|
||||||
// QTBUG-39544, setting a geometry in minimized state should work as well.
|
// QTBUG-39544, setting a geometry in minimized state should work as well.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user