Merge "Merge remote-tracking branch 'origin/5.14' into 5.15"

This commit is contained in:
Qt Forward Merge Bot 2019-10-28 01:00:42 +01:00
commit c78560f19a
2 changed files with 43 additions and 16 deletions

View File

@ -99,18 +99,18 @@ private:
static void add(CGDirectDisplayID displayId); static void add(CGDirectDisplayID displayId);
void remove(); void remove();
CGDirectDisplayID m_displayId = 0; CGDirectDisplayID m_displayId = kCGNullDirectDisplay;
QRect m_geometry; QRect m_geometry;
QRect m_availableGeometry; QRect m_availableGeometry;
QDpi m_logicalDpi; QDpi m_logicalDpi;
qreal m_refreshRate; qreal m_refreshRate = 0;
int m_depth; int m_depth = 0;
QString m_name; QString m_name;
QImage::Format m_format; QImage::Format m_format;
QSizeF m_physicalSize; QSizeF m_physicalSize;
QCocoaCursor *m_cursor; QCocoaCursor *m_cursor;
qreal m_devicePixelRatio; qreal m_devicePixelRatio = 0;
CVDisplayLinkRef m_displayLink = nullptr; CVDisplayLinkRef m_displayLink = nullptr;
dispatch_source_t m_displayLinkSource = nullptr; dispatch_source_t m_displayLinkSource = nullptr;

View File

@ -54,6 +54,23 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace CoreGraphics {
Q_NAMESPACE
enum DisplayChange {
Moved = kCGDisplayMovedFlag,
SetMain = kCGDisplaySetMainFlag,
SetMode = kCGDisplaySetModeFlag,
Added = kCGDisplayAddFlag,
Removed = kCGDisplayRemoveFlag,
Enabled = kCGDisplayEnabledFlag,
Disabled = kCGDisplayDisabledFlag,
Mirrored = kCGDisplayMirrorFlag,
UnMirrored = kCGDisplayUnMirrorFlag,
DesktopShapeChanged = kCGDisplayDesktopShapeChangedFlag
};
Q_ENUM_NS(DisplayChange)
}
void QCocoaScreen::initializeScreens() void QCocoaScreen::initializeScreens()
{ {
uint32_t displayCount = 0; uint32_t displayCount = 0;
@ -73,6 +90,10 @@ void QCocoaScreen::initializeScreens()
Q_UNUSED(userInfo); Q_UNUSED(userInfo);
qCDebug(lcQpaScreen).verbosity(0).nospace() << "Display reconfiguration"
<< " (" << QFlags<CoreGraphics::DisplayChange>(flags) << ")"
<< " for displayId=" << displayId;
QCocoaScreen *cocoaScreen = QCocoaScreen::get(displayId); QCocoaScreen *cocoaScreen = QCocoaScreen::get(displayId);
if ((flags & kCGDisplayAddFlag) || !cocoaScreen) { if ((flags & kCGDisplayAddFlag) || !cocoaScreen) {
@ -93,22 +114,24 @@ void QCocoaScreen::initializeScreens()
mainDisplay->updateProperties(); mainDisplay->updateProperties();
qCInfo(lcQpaScreen) << "Primary screen changed to" << mainDisplay; qCInfo(lcQpaScreen) << "Primary screen changed to" << mainDisplay;
QWindowSystemInterface::handlePrimaryScreenChanged(mainDisplay); QWindowSystemInterface::handlePrimaryScreenChanged(mainDisplay);
if (cocoaScreen == mainDisplay)
return; // Already reconfigured
} }
if (cocoaScreen == mainDisplay)
return; // Already reconfigured
cocoaScreen->updateProperties(); cocoaScreen->updateProperties();
qCInfo(lcQpaScreen) << "Reconfigured" << cocoaScreen; qCInfo(lcQpaScreen).nospace() << "Reconfigured " <<
(primaryScreen() == cocoaScreen ? "primary " : "")
<< cocoaScreen;
} }
}, nullptr); }, nullptr);
} }
void QCocoaScreen::add(CGDirectDisplayID displayId) void QCocoaScreen::add(CGDirectDisplayID displayId)
{ {
const bool isPrimary = CGDisplayIsMain(displayId);
QCocoaScreen *cocoaScreen = new QCocoaScreen(displayId); QCocoaScreen *cocoaScreen = new QCocoaScreen(displayId);
qCInfo(lcQpaScreen) << "Adding" << cocoaScreen; qCInfo(lcQpaScreen).nospace() << "Adding " << (isPrimary ? "new primary " : "") << cocoaScreen;
QWindowSystemInterface::handleScreenAdded(cocoaScreen, CGDisplayIsMain(displayId)); QWindowSystemInterface::handleScreenAdded(cocoaScreen, isPrimary);
} }
QCocoaScreen::QCocoaScreen(CGDirectDisplayID displayId) QCocoaScreen::QCocoaScreen(CGDirectDisplayID displayId)
@ -127,7 +150,7 @@ void QCocoaScreen::cleanupScreens()
void QCocoaScreen::remove() void QCocoaScreen::remove()
{ {
m_displayId = 0; // Prevent stale references during removal m_displayId = kCGNullDirectDisplay; // Prevent stale references during removal
// This may result in the application responding to QGuiApplication::screenRemoved // This may result in the application responding to QGuiApplication::screenRemoved
// by moving the window to another screen, either by setGeometry, or by setScreen. // by moving the window to another screen, either by setGeometry, or by setScreen.
@ -140,6 +163,7 @@ void QCocoaScreen::remove()
// QCocoaWindow::windowDidChangeScreen. At that point the window will appear to have // QCocoaWindow::windowDidChangeScreen. At that point the window will appear to have
// already changed its screen, but that's only true if comparing the Qt screens, // already changed its screen, but that's only true if comparing the Qt screens,
// not when comparing the NSScreens. // not when comparing the NSScreens.
qCInfo(lcQpaScreen).nospace() << "Removing " << (primaryScreen() == this ? "current primary " : "") << this;
QWindowSystemInterface::handleScreenRemoved(this); QWindowSystemInterface::handleScreenRemoved(this);
} }
@ -552,10 +576,10 @@ QPixmap QCocoaScreen::grabWindow(WId view, int x, int y, int width, int height)
*/ */
QCocoaScreen *QCocoaScreen::primaryScreen() QCocoaScreen *QCocoaScreen::primaryScreen()
{ {
auto screen = static_cast<QCocoaScreen *>(QGuiApplication::primaryScreen()->handle()); // Note: The primary screen that Qt knows about may not match the current CGMainDisplayID()
Q_ASSERT_X(screen == get(CGMainDisplayID()), "QCocoaScreen", // if macOS has not yet been able to inform us that the main display has changed, but we
"The application's primary screen should always be in sync with the main display"); // will update the primary screen accordingly once the reconfiguration callback comes in.
return screen; return static_cast<QCocoaScreen *>(QGuiApplication::primaryScreen()->handle());
} }
QList<QPlatformScreen*> QCocoaScreen::virtualSiblings() const QList<QPlatformScreen*> QCocoaScreen::virtualSiblings() const
@ -597,7 +621,7 @@ NSScreen *QCocoaScreen::nativeScreen() const
QCFType<CFUUIDRef> uuid = CGDisplayCreateUUIDFromDisplayID(m_displayId); QCFType<CFUUIDRef> uuid = CGDisplayCreateUUIDFromDisplayID(m_displayId);
for (NSScreen *screen in [NSScreen screens]) { for (NSScreen *screen in [NSScreen screens]) {
if (CGDisplayCreateUUIDFromDisplayID(screen.qt_displayId) == uuid) if (QCFType<CFUUIDRef>(CGDisplayCreateUUIDFromDisplayID(screen.qt_displayId)) == uuid)
return screen; return screen;
} }
@ -639,6 +663,7 @@ QDebug operator<<(QDebug debug, const QCocoaScreen *screen)
debug << ", geometry=" << screen->geometry(); debug << ", geometry=" << screen->geometry();
debug << ", dpr=" << screen->devicePixelRatio(); debug << ", dpr=" << screen->devicePixelRatio();
debug << ", name=" << screen->name(); debug << ", name=" << screen->name();
debug << ", displayId=" << screen->m_displayId;
debug << ", native=" << screen->nativeScreen(); debug << ", native=" << screen->nativeScreen();
} }
debug << ')'; debug << ')';
@ -646,6 +671,8 @@ QDebug operator<<(QDebug debug, const QCocoaScreen *screen)
} }
#endif // !QT_NO_DEBUG_STREAM #endif // !QT_NO_DEBUG_STREAM
#include "qcocoascreen.moc"
QT_END_NAMESPACE QT_END_NAMESPACE
@implementation NSScreen (QtExtras) @implementation NSScreen (QtExtras)