From 68f20bb8f4b74e313e1d44a7d7e78af6d8b5b3ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 30 Jul 2018 21:28:42 +0200 Subject: macOS: Make screen property changes more verbose and granular MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We only update the properties that have actually changed. Change-Id: If711530c6118d2550d5a0e968ee02c903b44fd04 Reviewed-by: Tor Arne Vestbø Reviewed-by: Gabriel de Dietrich --- src/plugins/platforms/cocoa/qcocoahelpers.h | 1 + src/plugins/platforms/cocoa/qcocoahelpers.mm | 1 + src/plugins/platforms/cocoa/qcocoaintegration.mm | 5 +---- src/plugins/platforms/cocoa/qcocoascreen.h | 2 +- src/plugins/platforms/cocoa/qcocoascreen.mm | 20 +++++++++++++++----- src/plugins/platforms/cocoa/qcocoawindow.mm | 14 ++++++++++++-- 6 files changed, 31 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.h b/src/plugins/platforms/cocoa/qcocoahelpers.h index cf8a241db5..4df212bc7a 100644 --- a/src/plugins/platforms/cocoa/qcocoahelpers.h +++ b/src/plugins/platforms/cocoa/qcocoahelpers.h @@ -65,6 +65,7 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcQpaWindow) Q_DECLARE_LOGGING_CATEGORY(lcQpaDrawing) Q_DECLARE_LOGGING_CATEGORY(lcQpaMouse) +Q_DECLARE_LOGGING_CATEGORY(lcQpaScreen) class QPixmap; class QString; diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm index 7ba7908d27..c7ddd8458d 100644 --- a/src/plugins/platforms/cocoa/qcocoahelpers.mm +++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm @@ -60,6 +60,7 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcQpaWindow, "qt.qpa.window"); Q_LOGGING_CATEGORY(lcQpaDrawing, "qt.qpa.drawing"); Q_LOGGING_CATEGORY(lcQpaMouse, "qt.qpa.input.mouse"); +Q_LOGGING_CATEGORY(lcQpaScreen, "qt.qpa.screen"); // // Conversion Functions diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index ce3a1304b2..8ad76eb05e 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -225,8 +225,6 @@ QCocoaIntegration::Options QCocoaIntegration::options() const return mOptions; } -Q_LOGGING_CATEGORY(lcQpaScreen, "qt.qpa.screen"); - /*! \brief Synchronizes the screen list, adds new screens, removes deleted ones */ @@ -265,8 +263,7 @@ void QCocoaIntegration::updateScreens() } if (screen) { remainingScreens.remove(screen); - screen->updateGeometry(); - qCDebug(lcQpaScreen) << "Updated properties of" << screen; + screen->updateProperties(); } else { screen = new QCocoaScreen(i); mScreens.append(screen); diff --git a/src/plugins/platforms/cocoa/qcocoascreen.h b/src/plugins/platforms/cocoa/qcocoascreen.h index afb294240e..9ded98df32 100644 --- a/src/plugins/platforms/cocoa/qcocoascreen.h +++ b/src/plugins/platforms/cocoa/qcocoascreen.h @@ -75,7 +75,7 @@ public: // Additional methods void setVirtualSiblings(const QList &siblings) { m_siblings = siblings; } NSScreen *nativeScreen() const; - void updateGeometry(); + void updateProperties(); void requestUpdate(); void deliverUpdateRequests(); diff --git a/src/plugins/platforms/cocoa/qcocoascreen.mm b/src/plugins/platforms/cocoa/qcocoascreen.mm index 80fe83cc5b..c15fea837f 100644 --- a/src/plugins/platforms/cocoa/qcocoascreen.mm +++ b/src/plugins/platforms/cocoa/qcocoascreen.mm @@ -59,7 +59,7 @@ class QFontEngineFT; QCocoaScreen::QCocoaScreen(int screenIndex) : QPlatformScreen(), m_screenIndex(screenIndex), m_refreshRate(60.0) { - updateGeometry(); + updateProperties(); m_cursor = new QCocoaCursor; } @@ -115,12 +115,17 @@ static QString displayName(CGDirectDisplayID displayID) return QString(); } -void QCocoaScreen::updateGeometry() +void QCocoaScreen::updateProperties() { NSScreen *nsScreen = nativeScreen(); if (!nsScreen) return; + const QRect previousGeometry = m_geometry; + const QRect previousAvailableGeometry = m_availableGeometry; + const QDpi previousLogicalDpi = m_logicalDpi; + const qreal previousRefreshRate = m_refreshRate; + // The reference screen for the geometry is always the primary screen QRectF primaryScreenGeometry = QRectF::fromCGRect([[NSScreen screens] firstObject].frame); m_geometry = qt_mac_flip(QRectF::fromCGRect(nsScreen.frame), primaryScreenGeometry).toRect(); @@ -142,9 +147,14 @@ void QCocoaScreen::updateGeometry() m_name = displayName(dpy); - QWindowSystemInterface::handleScreenGeometryChange(screen(), geometry(), availableGeometry()); - QWindowSystemInterface::handleScreenLogicalDotsPerInchChange(screen(), m_logicalDpi.first, m_logicalDpi.second); - QWindowSystemInterface::handleScreenRefreshRateChange(screen(), m_refreshRate); + if (m_geometry != previousGeometry || m_availableGeometry != previousAvailableGeometry) + QWindowSystemInterface::handleScreenGeometryChange(screen(), geometry(), availableGeometry()); + if (m_logicalDpi != previousLogicalDpi) + QWindowSystemInterface::handleScreenLogicalDotsPerInchChange(screen(), m_logicalDpi.first, m_logicalDpi.second); + if (m_refreshRate != previousRefreshRate) + QWindowSystemInterface::handleScreenRefreshRateChange(screen(), m_refreshRate); + + qCDebug(lcQpaScreen) << "Updated properties for" << this; } // ----------------------- Display link ----------------------- diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 98e808bdf3..3148501006 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -1218,11 +1218,21 @@ void QCocoaWindow::windowDidChangeScreen() const bool wasRunningDisplayLink = static_cast(screen())->isRunningDisplayLink(); - if (QCocoaScreen *cocoaScreen = QCocoaIntegration::instance()->screenForNSScreen(m_view.window.screen)) { - QWindowSystemInterface::handleWindowScreenChanged(window(), cocoaScreen->screen()); + if (QCocoaScreen *newScreen = QCocoaIntegration::instance()->screenForNSScreen(m_view.window.screen)) { + if (newScreen == screen()) { + // Screen properties have changed. Will be handled by + // NSApplicationDidChangeScreenParametersNotification + // in QCocoaIntegration::updateScreens(). + return; + } + + qCDebug(lcQpaWindow) << window() << "moved to" << newScreen; + QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->screen()); if (hasPendingUpdateRequest() && wasRunningDisplayLink) requestUpdate(); // Restart display-link on new screen + } else { + qCWarning(lcQpaWindow) << "Failed to get QCocoaScreen for" << m_view.window.screen; } } -- cgit v1.2.3