QtCanpool 3.3.0
载入中...
搜索中...
未找到
windowevent.cpp
浏览该文件的文档.
1
5#include "windowevent_p.h"
6#include <QtCore/QAbstractNativeEventFilter>
7#include <QtCore/QCoreApplication>
8
10
11WindowNativeEventFilter::WindowNativeEventFilter()
12 : m_nativeDispatcher(nullptr)
13{
14}
15
21
23
25{
26 for (const auto &observer : std::as_const(m_nativeEventFilters)) {
27 observer->m_nativeDispatcher = nullptr;
28 }
29}
30
31bool WindowNativeEventDispatcher::nativeDispatch(const QByteArray &eventType, void *message,
33{
34 for (const auto &ef : std::as_const(m_nativeEventFilters)) {
35 if (ef->nativeEventFilter(eventType, message, result))
36 return true;
37 }
38 return false;
39}
40
42{
43 if (!filter || filter->m_nativeDispatcher)
44 return;
45
46 m_nativeEventFilters.append(filter);
47 filter->m_nativeDispatcher = this;
48}
49
51{
52 if (!m_nativeEventFilters.removeOne(filter)) {
53 return;
54 }
55 filter->m_nativeDispatcher = nullptr;
56}
57
58// Avoid adding multiple global native event filters to QGuiApplication
59// in this library.
60class AppMasterNativeEventFilter : public QAbstractNativeEventFilter, public WindowNativeEventDispatcher
61{
62public:
63 AppMasterNativeEventFilter()
64 {
65 qApp->installNativeEventFilter(this);
66 }
67
68 // The base class removes automatically
69 ~AppMasterNativeEventFilter() override = default;
70
71 bool nativeEventFilter(const QByteArray &eventType, void *message, QT_NATIVE_EVENT_RESULT_TYPE *result) override
72 {
73 return nativeDispatch(eventType, message, result);
74 }
75
76 static AppMasterNativeEventFilter *instance;
77
78 friend class AppNativeEventFilter;
79};
80
81AppMasterNativeEventFilter *AppMasterNativeEventFilter::instance = nullptr;
82
84{
85 if (!AppMasterNativeEventFilter::instance) {
86 AppMasterNativeEventFilter::instance = new AppMasterNativeEventFilter();
87 }
88 AppMasterNativeEventFilter::instance->installNativeEventFilter(this);
89}
90
92{
93 AppMasterNativeEventFilter::instance->removeNativeEventFilter(this);
94 if (AppMasterNativeEventFilter::instance->m_nativeEventFilters.isEmpty()) {
95 delete AppMasterNativeEventFilter::instance;
96 AppMasterNativeEventFilter::instance = nullptr;
97 }
98}
99
101 : m_sharedDispatcher(nullptr)
102{
103}
104
110
112
114{
115 for (const auto &observer : std::as_const(m_sharedEventFilters)) {
116 observer->m_sharedDispatcher = nullptr;
117 }
118}
119
120bool WindowSharedEventDispatcher::sharedDispatch(QObject *obj, QEvent *event)
121{
122 for (const auto &ef : std::as_const(m_sharedEventFilters)) {
123 if (ef->sharedEventFilter(obj, event))
124 return true;
125 }
126 return false;
127}
128
130{
131 if (!filter || filter->m_sharedDispatcher)
132 return;
133
134 m_sharedEventFilters.append(filter);
135 filter->m_sharedDispatcher = this;
136}
137
139{
140 if (!m_sharedEventFilters.removeOne(filter)) {
141 return;
142 }
143 filter->m_sharedDispatcher = nullptr;
144}
145
void installNativeEventFilter(WindowNativeEventFilter *filter)
QVector< WindowNativeEventFilter * > m_nativeEventFilters
void removeNativeEventFilter(WindowNativeEventFilter *filter)
virtual bool nativeDispatch(const QByteArray &eventType, void *message, QT_NATIVE_EVENT_RESULT_TYPE *result)
WindowNativeEventDispatcher * m_nativeDispatcher
void installSharedEventFilter(WindowSharedEventFilter *filter)
virtual bool sharedDispatch(QObject *obj, QEvent *event)
QVector< WindowSharedEventFilter * > m_sharedEventFilters
void removeSharedEventFilter(WindowSharedEventFilter *filter)
WindowSharedEventDispatcher * m_sharedDispatcher
qintptr QT_NATIVE_EVENT_RESULT_TYPE
Definition windowkit_p.h:50
#define QX_WINDOW_END_NAMESPACE
#define QX_WINDOW_BEGIN_NAMESPACE