From 8143f60026456f98aaf2b6afaf1edadfbeb2f1e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 29 Jun 2017 16:25:56 +0200 Subject: [PATCH] macOS: Deliver native events to windows, as well as to event filters Qt has two APIs to intercept native events today: - QAbstractEventDispatcher::installNativeEventFilter() - Q{Window|Widget}::nativeEvent() On macOS we only implemented one of them, the native event filter code path, by calling filterNativeEvent from the Cocoa event dispatcher. We now also propagate the native event to the corresponding QWindow, and QWidget if applicable. It would be nice if there was only one Qt API for this, or at least only one codepath for platform plugins to care about, but since the event filter might catch more event types than gets delivered to the window, we probably need both code paths going forward. Task-number: QTBUG-40116 Change-Id: I0796bd62a2b7c08b2eaaf6f15db8088e9703af02 Reviewed-by: Timur Pocheptsov --- src/plugins/platforms/cocoa/qnswindow.mm | 7 +++++++ src/widgets/kernel/qwidget.cpp | 1 + 2 files changed, 8 insertions(+) diff --git a/src/plugins/platforms/cocoa/qnswindow.mm b/src/plugins/platforms/cocoa/qnswindow.mm index f76934033c..e44db3ff3b 100644 --- a/src/plugins/platforms/cocoa/qnswindow.mm +++ b/src/plugins/platforms/cocoa/qnswindow.mm @@ -43,6 +43,7 @@ #include "qcocoahelpers.h" #include "qcocoaeventdispatcher.h" +#include #include static bool isMouseEvent(NSEvent *ev) @@ -122,6 +123,12 @@ static bool isMouseEvent(NSEvent *ev) if (!self.platformWindow) return; + const char *eventType = object_getClassName(theEvent); + if (QWindowSystemInterface::handleNativeEvent(self.platformWindow->window(), + QByteArray::fromRawData(eventType, qstrlen(eventType)), theEvent, nullptr)) { + return; + } + [self.window superSendEvent:theEvent]; if (!self.platformWindow) diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index b0e5900f36..37f87c60dc 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -10001,6 +10001,7 @@ void QWidget::hideEvent(QHideEvent *) \table \header \li Platform \li Event Type Identifier \li Message Type \li Result Type \row \li Windows \li "windows_generic_MSG" \li MSG * \li LRESULT + \row \li macOS \li "NSEvent" \li NSEvent * \li \endtable */