summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa/qcocoaintegration.mm
diff options
context:
space:
mode:
authorMorten Johan Sørvig <morten.sorvig@digia.com>2014-04-02 12:35:09 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-04-05 08:15:24 +0200
commitbd2ec12a7b2787638aa3f7932c20ae4d6577734e (patch)
tree7334447f01720ff22a360077ede4c04efe676645 /src/plugins/platforms/cocoa/qcocoaintegration.mm
parentbb73d8d0704fbef9bd54fedccfe1e4647f3063cc (diff)
Cocoa: Make QScreen::topLevelAt() work correctly
The QPlatformScreen::topLevelAt() default implementation is flawed in that it does not check z-ordering but simply returns the first window in the window list that contains the test point. Add QCocoaScreen::topLevelAt(). Use [NSApp orderedWindows] to iterate through the window list in z order. Add a NSWindow->QCococaWindow mapping hash to QCocoaIntegration for getting the corresponding QWindow once a NSWindow is found. Task-number: QTBUG-37597 Change-Id: I7af70163a32528cb56f8d6caa037b98f580ee191 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Diffstat (limited to 'src/plugins/platforms/cocoa/qcocoaintegration.mm')
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm
index 9d5388d33b..c4398622e8 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.mm
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm
@@ -156,6 +156,24 @@ qreal QCocoaScreen::devicePixelRatio() const
}
}
+QWindow *QCocoaScreen::topLevelAt(const QPoint &point) const
+{
+ // Get a z-ordered list of windows. Iterate through it until
+ // we find a window which contains the point.
+ for (NSWindow *nsWindow in [NSApp orderedWindows]) {
+ QCocoaWindow *cocoaWindow = QCocoaIntegration::instance()->window(nsWindow);
+ if (!cocoaWindow)
+ continue;
+ QWindow *window = cocoaWindow->window();
+ if (!window->isTopLevel())
+ continue;
+ if (window->geometry().contains(point))
+ return window;
+ }
+
+ return QPlatformScreen::topLevelAt(point);
+}
+
extern CGContextRef qt_mac_cg_context(const QPaintDevice *pdev);
QPixmap QCocoaScreen::grabWindow(WId window, int x, int y, int width, int height) const
@@ -500,6 +518,16 @@ NSToolbar *QCocoaIntegration::toolbar(QWindow *window) const
return mToolbars.value(window);
}
+void QCocoaIntegration::setWindow(NSWindow* nsWindow, QCocoaWindow *window)
+{
+ mWindows.insert(nsWindow, window);
+}
+
+QCocoaWindow *QCocoaIntegration::window(NSWindow *window)
+{
+ return mWindows.value(window);
+}
+
void QCocoaIntegration::clearToolbars()
{
QHash<QWindow *, NSToolbar *>::const_iterator it = mToolbars.constBegin();