File indexing completed on 2025-09-15 09:07:17
0001
0002
0003
0004 #ifndef QABSTRACTEVENTDISPATCHER_H
0005 #define QABSTRACTEVENTDISPATCHER_H
0006
0007 #include <QtCore/qobject.h>
0008 #include <QtCore/qeventloop.h>
0009
0010 QT_BEGIN_NAMESPACE
0011
0012 class QAbstractNativeEventFilter;
0013 class QAbstractEventDispatcherPrivate;
0014 class QSocketNotifier;
0015
0016 class Q_CORE_EXPORT QAbstractEventDispatcher : public QObject
0017 {
0018 Q_OBJECT
0019 Q_DECLARE_PRIVATE(QAbstractEventDispatcher)
0020
0021 public:
0022 using Duration = std::chrono::nanoseconds;
0023 struct TimerInfo
0024 {
0025 int timerId;
0026 int interval;
0027 Qt::TimerType timerType;
0028
0029 inline TimerInfo(int id, int i, Qt::TimerType t)
0030 : timerId(id), interval(i), timerType(t) { }
0031 };
0032 struct TimerInfoV2
0033 {
0034 Duration interval;
0035 Qt::TimerId timerId;
0036 Qt::TimerType timerType;
0037 };
0038
0039 explicit QAbstractEventDispatcher(QObject *parent = nullptr);
0040 ~QAbstractEventDispatcher();
0041
0042 static QAbstractEventDispatcher *instance(QThread *thread = nullptr);
0043
0044 virtual bool processEvents(QEventLoop::ProcessEventsFlags flags) = 0;
0045
0046 virtual void registerSocketNotifier(QSocketNotifier *notifier) = 0;
0047 virtual void unregisterSocketNotifier(QSocketNotifier *notifier) = 0;
0048
0049 Qt::TimerId registerTimer(Duration interval, Qt::TimerType timerType, QObject *object);
0050
0051 #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
0052 int registerTimer(qint64 interval, Qt::TimerType timerType, QObject *object);
0053
0054
0055 virtual void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType, QObject *object) = 0;
0056 virtual bool unregisterTimer(int timerId) = 0;
0057 virtual bool unregisterTimers(QObject *object) = 0;
0058 virtual QList<TimerInfo> registeredTimers(QObject *object) const = 0;
0059 virtual int remainingTime(int timerId) = 0;
0060
0061 void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType, QObject *object);
0062 bool unregisterTimer(Qt::TimerId timerId);
0063 QList<TimerInfoV2> timersForObject(QObject *object) const;
0064 Duration remainingTime(Qt::TimerId timerId) const;
0065 #else
0066 virtual void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType, QObject *object) = 0;
0067 virtual bool unregisterTimer(Qt::TimerId timerId) = 0;
0068 virtual bool unregisterTimers(QObject *object) = 0;
0069 virtual QList<TimerInfoV2> timersForObject(QObject *object) const = 0;
0070 virtual Duration remainingTime(Qt::TimerId timerId) const = 0;
0071 #endif
0072
0073 virtual void wakeUp() = 0;
0074 virtual void interrupt() = 0;
0075
0076 virtual void startingUp();
0077 virtual void closingDown();
0078
0079 void installNativeEventFilter(QAbstractNativeEventFilter *filterObj);
0080 void removeNativeEventFilter(QAbstractNativeEventFilter *filterObj);
0081 bool filterNativeEvent(const QByteArray &eventType, void *message, qintptr *result);
0082
0083 Q_SIGNALS:
0084 void aboutToBlock();
0085 void awake();
0086
0087 protected:
0088 QAbstractEventDispatcher(QAbstractEventDispatcherPrivate &,
0089 QObject *parent);
0090 };
0091
0092 Q_DECLARE_TYPEINFO(QAbstractEventDispatcher::TimerInfo, Q_PRIMITIVE_TYPE);
0093 Q_DECLARE_TYPEINFO(QAbstractEventDispatcher::TimerInfoV2, Q_PRIMITIVE_TYPE);
0094
0095 #if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
0096 class Q_CORE_EXPORT QAbstractEventDispatcherV2 : public QAbstractEventDispatcher
0097 {
0098 Q_OBJECT
0099 Q_DECLARE_PRIVATE(QAbstractEventDispatcher)
0100
0101 public:
0102 explicit QAbstractEventDispatcherV2(QObject *parent = nullptr);
0103 ~QAbstractEventDispatcherV2() override;
0104
0105
0106 virtual void registerTimer(Qt::TimerId timerId, Duration interval, Qt::TimerType timerType,
0107 QObject *object) = 0;
0108 virtual bool unregisterTimer(Qt::TimerId timerId) = 0;
0109 virtual QList<TimerInfoV2> timersForObject(QObject *object) const = 0;
0110 virtual Duration remainingTime(Qt::TimerId timerId) const = 0;
0111 virtual bool processEventsWithDeadline(QEventLoop::ProcessEventsFlags flags, QDeadlineTimer deadline);
0112
0113 protected:
0114 QAbstractEventDispatcherV2(QAbstractEventDispatcherPrivate &, QObject *parent);
0115
0116 private:
0117 QT_WARNING_PUSH
0118 QT_WARNING_DISABLE_GCC("-Woverloaded-virtual")
0119 QT_WARNING_DISABLE_CLANG("-Woverloaded-virtual")
0120
0121 void registerTimer(int timerId, qint64 interval, Qt::TimerType timerType,
0122 QObject *object) final;
0123 bool unregisterTimer(int timerId) final;
0124 QList<TimerInfo> registeredTimers(QObject *object) const final;
0125 int remainingTime(int timerId) final;
0126 QT_WARNING_POP
0127 };
0128 #else
0129 using QAbstractEventDispatcherV2 = QAbstractEventDispatcher;
0130 #endif
0131
0132 QT_END_NAMESPACE
0133
0134 #endif