diff options
author | Gabriel de Dietrich <gabriel.dedietrich@digia.com> | 2013-03-27 14:14:24 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-27 17:16:37 +0100 |
commit | 4ea11e82ec39a2c8d5a4507b414a52b3a9d462b4 (patch) | |
tree | bfce0cdd8f8d5b69ba03e95155bf587c74e8a704 /src/plugins/platforms | |
parent | ec37cdbc8016042afcd3a77cebe4b3e6b8238092 (diff) |
QCocoaScreen: Properly align secondary screens w.r.t. primary screen
When using different resolution screens, one can arrange them around
the primary screen. However, the vertical offset has to take into account
the fact that NSScreen origin is bottom-left, whereas QScreen origin is
top-left. This usualy impacts the geometry's y coordinate, and can result
in popups showing in the wrong screen.
Task-number: QTBUG-30348
Change-Id: I159e6be2b590bd2d9a31f3f36c3785afcc62123e
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoaintegration.mm | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index d0fcf93b8c..3312de6e3f 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -90,11 +90,28 @@ void QCocoaScreen::updateGeometry() { NSScreen *nsScreen = osScreen(); NSRect frameRect = [nsScreen frame]; - m_geometry = QRect(frameRect.origin.x, frameRect.origin.y, frameRect.size.width, frameRect.size.height); - NSRect visibleRect = [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); + + if (m_screenIndex == 0) { + 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]; + m_availableGeometry = QRect(visibleRect.origin.x, + frameRect.size.height - (visibleRect.origin.y + visibleRect.size.height), // invert y + visibleRect.size.width, visibleRect.size.height); + } else { + // NSScreen origin is at the bottom-left corner, QScreen is at the top-left corner. + // When we get the NSScreen frame rect, we need to re-align its origin y coordinate + // w.r.t. the primary screen, whose origin is (0, 0). + NSRect r = [[[NSScreen screens] objectAtIndex:0] frame]; + QRect referenceScreenGeometry = QRect(r.origin.x, r.origin.y, r.size.width, r.size.height); + m_geometry = QRect(frameRect.origin.x, + referenceScreenGeometry.height() - (frameRect.origin.y + frameRect.size.height), + frameRect.size.width, frameRect.size.height); + + // Not primary screen. See above. + m_availableGeometry = m_geometry; + } m_format = QImage::Format_RGB32; m_depth = NSBitsPerPixelFromDepth([nsScreen depth]); |