diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2016-10-26 14:47:43 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2016-10-28 08:03:58 +0000 |
commit | 73e68a9c0f8b6eb2873822efdae3dbb7c98a86d6 (patch) | |
tree | d916be9b7078fe6eaef7bbbed6e5e845ac4430d8 /src/plugins/platforms | |
parent | c9d6e3226811e22da4862d64fae6fb935c7562c5 (diff) |
macOS: Keep reference to NSScreen instead of mapping QCocoaScreen by index
We're mostly using the result of looking up the index anyways.
Change-Id: I2ada58a9e6159a567691568b42fef76a82797eb3
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoaintegration.h | 8 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoaintegration.mm | 48 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoawindow.mm | 14 |
3 files changed, 32 insertions, 38 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h index 85ea2d8ba9..892ff6e00f 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.h +++ b/src/plugins/platforms/cocoa/qcocoaintegration.h @@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE class QCocoaScreen : public QPlatformScreen { public: - QCocoaScreen(int screenIndex); + QCocoaScreen(NSScreen *screen); ~QCocoaScreen(); // ---------------------------------------------------- @@ -84,11 +84,11 @@ public: // ---------------------------------------------------- // Additional methods void setVirtualSiblings(const QList<QPlatformScreen *> &siblings) { m_siblings = siblings; } - NSScreen *osScreen() const; + NSScreen *nsScreen() const; void updateGeometry(); public: - int m_screenIndex; + NSScreen *m_nsScreen; QRect m_geometry; QRect m_availableGeometry; QDpi m_logicalDpi; @@ -144,7 +144,7 @@ public: QList<int> possibleKeys(const QKeyEvent *event) const Q_DECL_OVERRIDE; void updateScreens(); - QCocoaScreen *screenAtIndex(int index); + QCocoaScreen *screenForNSScreen(NSScreen *nsScreen); void setToolbar(QWindow *window, NSToolbar *toolbar); NSToolbar *toolbar(QWindow *window) const; diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index 92fffb4d15..5a77d8e367 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -69,8 +69,8 @@ static void initResources() QT_BEGIN_NAMESPACE -QCocoaScreen::QCocoaScreen(int screenIndex) : - QPlatformScreen(), m_screenIndex(screenIndex), m_refreshRate(60.0) +QCocoaScreen::QCocoaScreen(NSScreen *screen) + : QPlatformScreen(), m_nsScreen(screen), m_refreshRate(60.0) { updateGeometry(); m_cursor = new QCocoaCursor; @@ -81,25 +81,23 @@ QCocoaScreen::~QCocoaScreen() delete m_cursor; } -NSScreen *QCocoaScreen::osScreen() const +NSScreen *QCocoaScreen::nsScreen() const { - NSArray *screens = [NSScreen screens]; - return ((NSUInteger)m_screenIndex < [screens count]) ? [screens objectAtIndex:m_screenIndex] : nil; + return m_nsScreen; } void QCocoaScreen::updateGeometry() { - NSScreen *nsScreen = osScreen(); - if (!nsScreen) + if (!m_nsScreen) return; - NSRect frameRect = [nsScreen frame]; + NSRect frameRect = [m_nsScreen frame]; - if (m_screenIndex == 0) { + if (m_nsScreen == [[NSScreen screens] firstObject]) { m_geometry = QRect(frameRect.origin.x, frameRect.origin.y, frameRect.size.width, frameRect.size.height); // This is the primary screen, the one that contains the menubar. Its origin should be // (0, 0), and it's the only one whose available geometry differs from its full geometry. - NSRect visibleRect = [nsScreen visibleFrame]; + NSRect visibleRect = [m_nsScreen visibleFrame]; m_availableGeometry = QRect(visibleRect.origin.x, frameRect.size.height - (visibleRect.origin.y + visibleRect.size.height), // invert y visibleRect.size.width, visibleRect.size.height); @@ -118,9 +116,9 @@ void QCocoaScreen::updateGeometry() } m_format = QImage::Format_RGB32; - m_depth = NSBitsPerPixelFromDepth([nsScreen depth]); + m_depth = NSBitsPerPixelFromDepth([m_nsScreen depth]); - NSDictionary *devDesc = [nsScreen deviceDescription]; + NSDictionary *devDesc = [m_nsScreen deviceDescription]; CGDirectDisplayID dpy = [[devDesc objectForKey:@"NSScreenNumber"] unsignedIntValue]; CGSize size = CGDisplayScreenSize(dpy); m_physicalSize = QSizeF(size.width, size.height); @@ -147,8 +145,7 @@ void QCocoaScreen::updateGeometry() qreal QCocoaScreen::devicePixelRatio() const { QMacAutoReleasePool pool; - NSScreen * screen = osScreen(); - return qreal(screen ? [screen backingScaleFactor] : 1.0); + return qreal(m_nsScreen ? [m_nsScreen backingScaleFactor] : 1.0); } QPlatformScreen::SubpixelAntialiasingType QCocoaScreen::subpixelAntialiasingTypeHint() const @@ -423,7 +420,7 @@ void QCocoaIntegration::updateScreens() // NSScreen documentation says do not cache the array returned from [NSScreen screens]. // However in practice, we can identify a screen by its pointer: if resolution changes, // the NSScreen object will be the same instance, just with different values. - if (existingScr->osScreen() == scr) { + if (existingScr->nsScreen() == scr) { screen = existingScr; break; } @@ -431,7 +428,7 @@ void QCocoaIntegration::updateScreens() remainingScreens.remove(screen); screen->updateGeometry(); } else { - screen = new QCocoaScreen(i); + screen = new QCocoaScreen(scr); mScreens.append(screen); screenAdded(screen); } @@ -451,16 +448,21 @@ void QCocoaIntegration::updateScreens() } } -QCocoaScreen *QCocoaIntegration::screenAtIndex(int index) +QCocoaScreen *QCocoaIntegration::screenForNSScreen(NSScreen *nsScreen) { - if (index >= mScreens.count()) + NSUInteger index = [[NSScreen screens] indexOfObject:nsScreen]; + if (index == NSNotFound) + return 0; + + if (index >= unsigned(mScreens.count())) updateScreens(); - // It is possible that the screen got removed while updateScreens was called - // so we do a sanity check to be certain - if (index >= mScreens.count()) - return 0; - return mScreens.at(index); + for (QCocoaScreen *screen : mScreens) { + if (screen->nsScreen() == nsScreen) + return screen; + } + + return 0; } bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) const diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 751f2a7101..d5b405c951 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -1363,11 +1363,7 @@ void QCocoaWindow::windowDidChangeScreen() if (!window()) return; - NSUInteger screenIndex = [[NSScreen screens] indexOfObject:m_view.window.screen]; - if (screenIndex == NSNotFound) - return; - - if (QCocoaScreen *cocoaScreen = QCocoaIntegration::instance()->screenAtIndex(screenIndex)) + if (QCocoaScreen *cocoaScreen = QCocoaIntegration::instance()->screenForNSScreen(m_view.window.screen)) QWindowSystemInterface::handleWindowScreenChanged(window(), cocoaScreen->screen()); updateExposedGeometry(); @@ -2001,12 +1997,8 @@ void QCocoaWindow::exposeWindow() // time, and we won't get a NSWindowDidChangeScreenNotification // on show. The case where the window is initially displayed // on a non-primary screen needs special handling here. - NSUInteger screenIndex = [[NSScreen screens] indexOfObject:m_nsWindow.screen]; - if (screenIndex != NSNotFound) { - QCocoaScreen *cocoaScreen = QCocoaIntegration::instance()->screenAtIndex(screenIndex); - if (cocoaScreen) - window()->setScreen(cocoaScreen->screen()); - } + if (QCocoaScreen *cocoaScreen = QCocoaIntegration::instance()->screenForNSScreen(m_nsWindow.screen)) + window()->setScreen(cocoaScreen->screen()); if (!m_isExposed) { m_isExposed = true; |