macOS: Make screen property changes more verbose and granular

We only update the properties that have actually changed.

Change-Id: If711530c6118d2550d5a0e968ee02c903b44fd04
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
bb10
Tor Arne Vestbø 2018-07-30 21:28:42 +02:00
parent 144d33df72
commit 68f20bb8f4
6 changed files with 31 additions and 12 deletions

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -75,7 +75,7 @@ public:
// Additional methods
void setVirtualSiblings(const QList<QPlatformScreen *> &siblings) { m_siblings = siblings; }
NSScreen *nativeScreen() const;
void updateGeometry();
void updateProperties();
void requestUpdate();
void deliverUpdateRequests();

View File

@ -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 -----------------------

View File

@ -1218,11 +1218,21 @@ void QCocoaWindow::windowDidChangeScreen()
const bool wasRunningDisplayLink = static_cast<QCocoaScreen *>(screen())->isRunningDisplayLink();
if (QCocoaScreen *cocoaScreen = QCocoaIntegration::instance()->screenForNSScreen(m_view.window.screen)) {
QWindowSystemInterface::handleWindowScreenChanged<QWindowSystemInterface::SynchronousDelivery>(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<QWindowSystemInterface::SynchronousDelivery>(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;
}
}