From 2368e62f32e39abdad54260fa4a7b1b6018e5b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 28 Jul 2014 15:37:05 +0200 Subject: qpa: Make screen geometry updates (full and available geometry) atomic Updating the geometry and available geometry in two steps means that QScreen will be in an inconsistent state when emitting the geometry change signal, as the available geometry has not been updated yet. Piggy-backing changes to the availableGeometry based on the virtual geometry changing does not make sense, so we now tie geometry and availableGeometry (and their size variants) to their own separate geometryChanged and availableGeometryChanged signals. Change-Id: Iee0ced642cbb91c470cb54bc507d2c0512482c13 Reviewed-by: Richard Moe Gustavsen Reviewed-by: Friedemann Kleint Reviewed-by: Eskil Abrahamsen Blomfeldt Reviewed-by: Paul Olav Tvete --- src/plugins/platforms/ios/qiosscreen.mm | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'src/plugins/platforms/ios') diff --git a/src/plugins/platforms/ios/qiosscreen.mm b/src/plugins/platforms/ios/qiosscreen.mm index f1184be1b4..eb3b7e3c44 100644 --- a/src/plugins/platforms/ios/qiosscreen.mm +++ b/src/plugins/platforms/ios/qiosscreen.mm @@ -238,30 +238,26 @@ QIOSScreen::~QIOSScreen() void QIOSScreen::updateProperties() { + QRect previousGeometry = m_geometry; + QRect previousAvailableGeometry = m_availableGeometry; + bool inPortrait = UIInterfaceOrientationIsPortrait(m_uiWindow.rootViewController.interfaceOrientation); - QRect geometry = inPortrait ? fromCGRect(m_uiScreen.bounds).toRect() + m_geometry = inPortrait ? fromCGRect(m_uiScreen.bounds).toRect() : QRect(m_uiScreen.bounds.origin.x, m_uiScreen.bounds.origin.y, m_uiScreen.bounds.size.height, m_uiScreen.bounds.size.width); - if (geometry != m_geometry) { - m_geometry = geometry; - - const qreal millimetersPerInch = 25.4; - m_physicalSize = QSizeF(m_geometry.size()) / m_unscaledDpi * millimetersPerInch; - - QWindowSystemInterface::handleScreenGeometryChange(screen(), m_geometry); - } - - QRect availableGeometry = geometry; + m_availableGeometry = m_geometry; CGSize applicationFrameSize = m_uiScreen.applicationFrame.size; - int statusBarHeight = geometry.height() - (inPortrait ? applicationFrameSize.height : applicationFrameSize.width); + int statusBarHeight = m_geometry.height() - (inPortrait ? applicationFrameSize.height : applicationFrameSize.width); + + m_availableGeometry.adjust(0, statusBarHeight, 0, 0); - availableGeometry.adjust(0, statusBarHeight, 0, 0); + if (m_geometry != previousGeometry || m_availableGeometry != previousAvailableGeometry) { + const qreal millimetersPerInch = 25.4; + m_physicalSize = QSizeF(m_geometry.size()) / m_unscaledDpi * millimetersPerInch; - if (availableGeometry != m_availableGeometry) { - m_availableGeometry = availableGeometry; - QWindowSystemInterface::handleScreenAvailableGeometryChange(screen(), m_availableGeometry); + QWindowSystemInterface::handleScreenGeometryChange(screen(), m_geometry, m_availableGeometry); } if (screen()) -- cgit v1.2.3