summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dedietrich@digia.com>2013-03-27 14:14:24 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-03-27 17:16:37 +0100
commit4ea11e82ec39a2c8d5a4507b414a52b3a9d462b4 (patch)
treebfce0cdd8f8d5b69ba03e95155bf587c74e8a704 /src/plugins
parentec37cdbc8016042afcd3a77cebe4b3e6b8238092 (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')
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm27
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]);