macOS: Update window geometries after screen properties change

Task-number: QTBUG-69794
Task-number: QTBUG-68140
Change-Id: I4d33bc2136478d779cc4ae8170c3421d9a7557cc
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
This commit is contained in:
Tor Arne Vestbø 2018-08-06 18:49:21 +02:00
parent e7063e6cc6
commit 3068b185c5

View File

@ -138,6 +138,20 @@ void QCocoaScreen::updateGeometry()
QWindowSystemInterface::handleScreenGeometryChange(screen(), geometry(), availableGeometry());
QWindowSystemInterface::handleScreenLogicalDotsPerInchChange(screen(), m_logicalDpi.first, m_logicalDpi.second);
QWindowSystemInterface::handleScreenRefreshRateChange(screen(), m_refreshRate);
// When a screen changes its geometry, AppKit will send us a NSWindowDidMoveNotification
// for each window, resulting in calls to handleGeometryChange(), but this happens before
// the NSApplicationDidChangeScreenParametersNotification, so when we map the new geometry
// (which is correct at that point) to the screen using QCocoaScreen::mapFromNative(), we
// end up using the stale screen geometry, and the new window geometry we report is wrong.
// To make sure we finally report the correct window geometry, we need to do another pass
// of geometry reporting, now that the screen properties have been updates. FIXME: Ideally
// this would be solved by not caching the screen properties in QCocoaScreen, but that
// requires more research.
for (QWindow *window : windows()) {
if (QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow*>(window->handle()))
cocoaWindow->handleGeometryChange();
}
}
qreal QCocoaScreen::devicePixelRatio() const