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
parent
144d33df72
commit
68f20bb8f4
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 -----------------------
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue