#include "nativeeventfilter.h" #include #include namespace QWK { // Avoid adding multiple global native event filters to QGuiApplication // in this library. class MasterNativeEventFilter : public QAbstractNativeEventFilter { public: MasterNativeEventFilter() { qApp->installNativeEventFilter(this); } ~MasterNativeEventFilter() override { qApp->removeNativeEventFilter(this); } bool nativeEventFilter(const QByteArray &eventType, void *message, QT_NATIVE_EVENT_RESULT_TYPE *result) override { for (const auto &child : qAsConst(m_children)) { if (child->nativeEventFilter(eventType, message, result)) { return true; } } return false; } inline int count() const { return m_children.size(); } inline void addChild(NativeEventFilter *child) { m_children.append(child); } inline void removeChild(NativeEventFilter *child) { m_children.removeOne(child); } static MasterNativeEventFilter *instance; protected: QVector m_children; }; MasterNativeEventFilter *MasterNativeEventFilter::instance = nullptr; NativeEventFilter::NativeEventFilter() { if (!MasterNativeEventFilter::instance) { MasterNativeEventFilter::instance = new MasterNativeEventFilter(); } MasterNativeEventFilter::instance->addChild(this); } NativeEventFilter::~NativeEventFilter() { MasterNativeEventFilter::instance->removeChild(this); if (MasterNativeEventFilter::instance->count() == 0) { delete MasterNativeEventFilter::instance; MasterNativeEventFilter::instance = nullptr; } } }