summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorMorten Sorvig <morten.sorvig@nokia.com>2011-11-09 10:35:11 +0100
committerQt by Nokia <qt-info@nokia.com>2011-11-09 12:16:58 +0100
commit2fd3dbb00cc69c71d9d32d1103f095134ae9ce9d (patch)
tree7aa0addb12654045a9a3214fdc80b8272a9a59e1 /src/plugins/platforms
parent260416393e83fe91bcd81546649877b810418a4e (diff)
Cocoa: Implement mouse and keyboard grab.
Change-Id: Id53ff19d43213d79aaf8f1a6617a06ef9d0cfb4b Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@nokia.com>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h17
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm39
2 files changed, 53 insertions, 3 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 4b9232d670..87cd1717da 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -52,6 +52,20 @@
QT_BEGIN_NAMESPACE
+@interface QNSWindow : NSWindow {
+
+}
+
+- (BOOL)canBecomeKeyWindow;
+
+@end
+
+@interface QNSPanel : QNSWindow {
+
+}
+
+@end
+
class QCocoaWindow : public QPlatformWindow
{
public:
@@ -63,8 +77,9 @@ public:
void setWindowTitle(const QString &title);
void raise();
void lower();
-
void propagateSizeHints();
+ bool setKeyboardGrabEnabled(bool grab);
+ bool setMouseGrabEnabled(bool grab);
WId winId() const;
NSView *contentView() const;
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 091c2651dd..3c0c730cff 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -54,6 +54,23 @@
#include <QDebug>
+@implementation QNSWindow
+
+- (BOOL)canBecomeKeyWindow
+{
+
+ // The default implementation returns NO for title-bar less windows,
+ // override and return yes here to make sure popup windows such as
+ // the combobox popup can become the key window.
+ return YES;
+}
+
+@end
+
+@implementation QNSPanel
+
+@end
+
QCocoaWindow::QCocoaWindow(QWindow *tlw)
: QPlatformWindow(tlw)
, m_windowAttributes(0)
@@ -163,6 +180,24 @@ void QCocoaWindow::propagateSizeHints()
}
}
+bool QCocoaWindow::setKeyboardGrabEnabled(bool grab)
+{
+ if (grab && ![m_nsWindow isKeyWindow])
+ [m_nsWindow makeKeyWindow];
+ else if (!grab && [m_nsWindow isKeyWindow])
+ [m_nsWindow resignKeyWindow];
+ return true;
+}
+
+bool QCocoaWindow::setMouseGrabEnabled(bool grab)
+{
+ if (grab && ![m_nsWindow isKeyWindow])
+ [m_nsWindow makeKeyWindow];
+ else if (!grab && [m_nsWindow isKeyWindow])
+ [m_nsWindow resignKeyWindow];
+ return true;
+}
+
WId QCocoaWindow::winId() const
{
return WId(m_nsWindow);
@@ -343,7 +378,7 @@ NSWindow * QCocoaWindow::createWindow()
break;
}
- panel = [[NSPanel alloc] initWithContentRect:frame
+ panel = [[QNSPanel alloc] initWithContentRect:frame
styleMask:m_windowAttributes
backing:NSBackingStoreBuffered
defer:NO]; // see window case below
@@ -354,7 +389,7 @@ NSWindow * QCocoaWindow::createWindow()
break;
}
default:
- window = [[NSWindow alloc] initWithContentRect:frame
+ window = [[QNSWindow alloc] initWithContentRect:frame
styleMask:(NSResizableWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSTitledWindowMask)
backing:NSBackingStoreBuffered
defer:NO]; // Deferring window creation breaks OpenGL (the GL context is set up