Yuhang Zhao
2023-12-06 075a1fd1d67c6e347ab40f460819067b947f92f6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "qwkcoreglobal_p.h"
 
#include <QtCore/QAbstractNativeEventFilter>
#include <QtCore/QCoreApplication>
#include <QtCore/QSet>
 
namespace QWK {
 
    // Avoid adding multiple global native event filters to QCoreApplication
    // in this library.
    class NativeEventFilterManager : public QAbstractNativeEventFilter {
    public:
        NativeEventFilterManager() {
            qApp->installNativeEventFilter(this);
        }
 
        ~NativeEventFilterManager() 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(QAbstractNativeEventFilter *child) {
            m_children.append(child);
        }
 
        inline void removeChild(QAbstractNativeEventFilter *child) {
            m_children.removeOne(child);
        }
 
        static NativeEventFilterManager *instance;
 
    protected:
        QVector<QAbstractNativeEventFilter *> m_children;
    };
 
    NativeEventFilterManager *NativeEventFilterManager::instance = nullptr;
 
    void installNativeEventFilter(QAbstractNativeEventFilter *eventFilter) {
        if (!eventFilter) {
            return;
        }
 
        if (!NativeEventFilterManager::instance) {
            NativeEventFilterManager::instance = new NativeEventFilterManager();
        }
        NativeEventFilterManager::instance->addChild(eventFilter);
    }
 
    void removeNativeEventFilter(QAbstractNativeEventFilter *eventFilter) {
        if (!eventFilter || !NativeEventFilterManager::instance) {
            return;
        }
        NativeEventFilterManager::instance->removeChild(eventFilter);
 
        if (NativeEventFilterManager::instance->count() == 0) {
            delete NativeEventFilterManager::instance;
            NativeEventFilterManager::instance = nullptr;
        }
    }
 
}