From a49c5648919a0bd2d8206ae7fb5033c9f84e0a86 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Fri, 22 Feb 2019 08:19:01 +0100 Subject: Implement support for WA_MacNoClickThrough MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is done by adding a QWindowPrivate::allowsClickThrough() function, so this could easily be adapted later on if desired for other platforms. Fixes: QTBUG-41126 Change-Id: I1157e5e7e7667ff11d1a5d21b3ce8c4b13202272 Reviewed-by: Morten Johan Sørvig --- src/gui/kernel/qwindow_p.h | 2 + src/plugins/platforms/cocoa/qnsview_mouse.mm | 5 +++ src/widgets/kernel/qwidgetwindow.cpp | 7 ++++ tests/manual/cocoa/noclickthrough/main.cpp | 48 ++++++++++++++++++++++ .../manual/cocoa/noclickthrough/noclickthrough.pro | 4 ++ 5 files changed, 66 insertions(+) create mode 100644 tests/manual/cocoa/noclickthrough/main.cpp create mode 100644 tests/manual/cocoa/noclickthrough/noclickthrough.pro diff --git a/src/gui/kernel/qwindow_p.h b/src/gui/kernel/qwindow_p.h index eb0b606598..cc1cc24525 100644 --- a/src/gui/kernel/qwindow_p.h +++ b/src/gui/kernel/qwindow_p.h @@ -164,6 +164,8 @@ public: static Qt::WindowState effectiveState(Qt::WindowStates); + virtual bool allowClickThrough(const QPoint &) const { return true; } + QWindow::SurfaceType surfaceType; Qt::WindowFlags windowFlags; QWindow *parentWindow; diff --git a/src/plugins/platforms/cocoa/qnsview_mouse.mm b/src/plugins/platforms/cocoa/qnsview_mouse.mm index 6e3cff2b48..0ab09b97d3 100644 --- a/src/plugins/platforms/cocoa/qnsview_mouse.mm +++ b/src/plugins/platforms/cocoa/qnsview_mouse.mm @@ -197,6 +197,11 @@ return NO; if ([self isTransparentForUserInput]) return NO; + QPointF windowPoint; + QPointF screenPoint; + [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint: &windowPoint andScreenPoint: &screenPoint]; + if (!qt_window_private(m_platformWindow->window())->allowClickThrough(screenPoint.toPoint())) + return NO; return YES; } diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index c6f22aa21a..f44f63d71b 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -106,6 +106,7 @@ public: if (QWidget *widget = q->widget()) QWidgetPrivate::get(widget)->updateContentsRect(); } + bool allowClickThrough(const QPoint &) const override; }; QRectF QWidgetWindowPrivate::closestAcceptableGeometry(const QRectF &rect) const @@ -221,6 +222,12 @@ static inline bool shouldBePropagatedToWidget(QEvent *event) } } +bool QWidgetWindowPrivate::allowClickThrough(const QPoint &globalPos) const +{ + QWidget *w = QApplication::widgetAt(globalPos); + return w && !w->testAttribute(Qt::WA_MacNoClickThrough); +} + bool QWidgetWindow::event(QEvent *event) { if (!m_widget) diff --git a/tests/manual/cocoa/noclickthrough/main.cpp b/tests/manual/cocoa/noclickthrough/main.cpp new file mode 100644 index 0000000000..eee7729999 --- /dev/null +++ b/tests/manual/cocoa/noclickthrough/main.cpp @@ -0,0 +1,48 @@ +/**************************************************************************** + ** + ** Copyright (C) 2019 The Qt Company Ltd. + ** Contact: https://www.qt.io/licensing/ + ** + ** This file is part of the test suite of the Qt Toolkit. + ** + ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ + ** Commercial License Usage + ** Licensees holding valid commercial Qt licenses may use this file in + ** accordance with the commercial license agreement provided with the + ** Software or, alternatively, in accordance with the terms contained in + ** a written agreement between you and The Qt Company. For licensing terms + ** and conditions see https://www.qt.io/terms-conditions. For further + ** information use the contact form at https://www.qt.io/contact-us. + ** + ** GNU General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU + ** General Public License version 3 as published by the Free Software + ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT + ** included in the packaging of this file. Please review the following + ** information to ensure the GNU General Public License requirements will + ** be met: https://www.gnu.org/licenses/gpl-3.0.html. + ** + ** $QT_END_LICENSE$ + ** + ****************************************************************************/ + +#include + +int main(int argc, char **argv) +{ + QApplication a(argc, argv); + QWidget w; + QVBoxLayout *vbox = new QVBoxLayout; + QLabel *label = new QLabel("Make the window inactive, but visible.\n" + "Then click on the Two item.\n" + "The item should not be selected, but the window should be active."); + vbox->addWidget(label); + QListWidget *list = new QListWidget; + list->addItems(QStringList() << "One" << "Two" << "Three"); + list->selectionModel()->select(list->model()->index(0, 0), QItemSelectionModel::Select); + list->viewport()->setAttribute(Qt::WA_MacNoClickThrough); + vbox->addWidget(list); + w.setLayout(vbox); + w.show(); + return a.exec(); +} diff --git a/tests/manual/cocoa/noclickthrough/noclickthrough.pro b/tests/manual/cocoa/noclickthrough/noclickthrough.pro new file mode 100644 index 0000000000..a8e30cb146 --- /dev/null +++ b/tests/manual/cocoa/noclickthrough/noclickthrough.pro @@ -0,0 +1,4 @@ +QT += widgets +TEMPLATE = app +TARGET = noclickthrough +SOURCES += main.cpp -- cgit v1.2.3