From 3c982a6384f5c5782463fd841cce6f59d2cda754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Thu, 24 Apr 2014 09:36:29 +0200 Subject: [PATCH] Cocoa: Handle Qt::WindowDoesNotAcceptFocus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make windows with the Qt::WindowDoesNotAcceptFocus flag refuse to become the key window. This is in addition to the existing refusal to become the first responder in QNSView. Refactor the common test into a new function: bool shouldRefuseKeyWindowAndFirstResponder() Task-number: QTBUG-32385 Change-Id: I31021b5d8895a17c48f94f3691e6590c90b68627 Reviewed-by: Morten Johan Sørvig --- src/plugins/platforms/cocoa/qcocoawindow.h | 1 + src/plugins/platforms/cocoa/qcocoawindow.mm | 17 +++++++++++++++++ src/plugins/platforms/cocoa/qnsview.mm | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 33647a8cbd..7e7848467c 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -230,6 +230,7 @@ public: void obscureWindow(); void updateExposedGeometry(); QWindow *childWindowAt(QPoint windowPoint); + bool shouldRefuseKeyWindowAndFirstResponder(); protected: void recreateWindow(const QPlatformWindow *parentWindow); QCocoaNSWindow *createNSWindow(); diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index c8ca494b33..39ca1ff636 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -237,6 +237,9 @@ static bool isMouseEvent(NSEvent *ev) if (!pw || pw->m_isNSWindowChild) return NO; + if (pw->shouldRefuseKeyWindowAndFirstResponder()) + return NO; + // 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. @@ -314,6 +317,9 @@ static bool isMouseEvent(NSEvent *ev) if (!pw) return NO; + if (pw->shouldRefuseKeyWindowAndFirstResponder()) + return NO; + // Only tool or dialog windows should become key: Qt::WindowType type = pw->window()->type(); if (type == Qt::Tool || type == Qt::Dialog) @@ -1776,6 +1782,17 @@ QWindow *QCocoaWindow::childWindowAt(QPoint windowPoint) return targetWindow; } +bool QCocoaWindow::shouldRefuseKeyWindowAndFirstResponder() +{ + // This function speaks up if there's any reason + // to refuse key window or first responder state. + + if (window()->flags() & Qt::WindowDoesNotAcceptFocus) + return true; + + return false; +} + QMargins QCocoaWindow::frameMargins() const { NSRect frameW = [m_nsWindow frame]; diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index b9e4826d72..a18ee7ff71 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -596,7 +596,7 @@ static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; - (BOOL)acceptsFirstResponder { - if (m_window->flags() & Qt::WindowDoesNotAcceptFocus) + if (m_platformWindow->shouldRefuseKeyWindowAndFirstResponder()) return NO; if (m_window->flags() & Qt::WindowTransparentForInput) return NO;