Cocoa: Implement mouse and keyboard grab.
authorMorten Sorvig <morten.sorvig@nokia.com>
Wed, 9 Nov 2011 09:35:11 +0000 (10:35 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 9 Nov 2011 11:16:58 +0000 (12:16 +0100)
Change-Id: Id53ff19d43213d79aaf8f1a6617a06ef9d0cfb4b
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@nokia.com>
src/plugins/platforms/cocoa/qcocoawindow.h
src/plugins/platforms/cocoa/qcocoawindow.mm

index 4b9232d..87cd171 100644 (file)
 
 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;
index 091c265..3c0c730 100644 (file)
 
 #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