From 0e0034d93a88d1871bfea813cbe48a4deeafb7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Fri, 2 Jun 2017 11:37:53 +0200 Subject: macOS: Simplify QCocoaWindow::handleGeometryChange MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are really only two cases here, where the difference is the coordinate system of the window position. 1) Child QWindow and embedded QWindow: The position is relative to parent view/window origin. 2) Top-level QWindow: The position is relative to screen origin. Change-Id: I867133a5adbbf3a690f574aec06b70c2bc64ad95 Reviewed-by: Timur Pocheptsov Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/cocoa/qcocoaintegration.h | 2 ++ src/plugins/platforms/cocoa/qcocoaintegration.mm | 10 +++++++++- src/plugins/platforms/cocoa/qcocoawindow.mm | 19 +++++++++---------- 3 files changed, 20 insertions(+), 11 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h index ecdd20c4dc..d3f2079042 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.h +++ b/src/plugins/platforms/cocoa/qcocoaintegration.h @@ -92,6 +92,8 @@ public: QPointF mapFromNative(const QPointF &pos) const { return flipCoordinate(pos); } QRectF mapFromNative(const QRectF &rect) const { return flipCoordinate(rect); } + static QCocoaScreen *primaryScreen(); + private: QPointF flipCoordinate(const QPointF &pos) const; QRectF flipCoordinate(const QRectF &rect) const; diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index bac49cfad9..1df74c986a 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -145,7 +145,7 @@ void QCocoaScreen::updateGeometry() // we may be in the process of creating and registering the primary screen, we // must special-case that and assign it direcly. QCocoaScreen *primaryScreen = (nsScreen == [[NSScreen screens] firstObject]) ? - this : static_cast(QGuiApplication::primaryScreen()->handle()); + this : QCocoaScreen::primaryScreen(); m_geometry = primaryScreen->mapFromNative(m_geometry).toRect(); m_availableGeometry = primaryScreen->mapFromNative(m_availableGeometry).toRect(); @@ -293,6 +293,14 @@ QPixmap QCocoaScreen::grabWindow(WId window, int x, int y, int width, int height return windowPixmap; } +/*! + The screen used as a reference for global window geometry +*/ +QCocoaScreen *QCocoaScreen::primaryScreen() +{ + return static_cast(QGuiApplication::primaryScreen()->handle()); +} + static QCocoaIntegration::Options parseOptions(const QStringList ¶mList) { QCocoaIntegration::Options options; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index af9f6da37c..3d8d4d35be 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -1043,19 +1043,18 @@ void QCocoaWindow::handleGeometryChange() if (m_inSetStyleMask && !m_view.window) return; + const bool isEmbedded = m_viewIsToBeEmbedded || m_viewIsEmbedded; + QRect newGeometry; + if (isContentView() && !isEmbedded) { + // Content views are positioned at (0, 0) in the window, so we resolve via the window + CGRect contentRect = [m_view.window contentRectForFrameRect:m_view.window.frame]; - if (isContentView()) { - // Top level window, get window rect and flip y - NSRect rect = m_view.frame; - NSRect windowRect = m_view.window.frame; - newGeometry = QRect(windowRect.origin.x, qt_mac_flipYCoordinate(windowRect.origin.y + rect.size.height), rect.size.width, rect.size.height); - } else if (m_viewIsToBeEmbedded) { - // Embedded child window, use the frame rect ### merge with case below - newGeometry = QRectF::fromCGRect(NSRectToCGRect(m_view.bounds)).toRect(); + // The result above is in native screen coordinates, so remap to the Qt coordinate system + newGeometry = QCocoaScreen::primaryScreen()->mapFromNative(QRectF::fromCGRect(contentRect)).toRect(); } else { - // Child window, use the frame rect - newGeometry = QRectF::fromCGRect(NSRectToCGRect(m_view.frame)).toRect(); + // QNSView has isFlipped set, so no need to remap the geometry + newGeometry = QRectF::fromCGRect(m_view.frame).toRect(); } qCDebug(lcQpaCocoaWindow) << "QCocoaWindow::handleGeometryChange" << window() -- cgit v1.2.3