Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qabstracteventdispatcher.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
7
8#include "qthread.h"
9#include <private/qthread_p.h>
10#include <private/qcoreapplication_p.h>
11#include <private/qfreelist_p.h>
12
14
15// we allow for 2^24 = 8^8 = 16777216 simultaneously running timers
17{
18 enum
19 {
21 BlockCount = 6
22 };
23
24 static const int Sizes[BlockCount];
25};
26
27enum {
28 Offset0 = 0x00000000,
29 Offset1 = 0x00000040,
30 Offset2 = 0x00000100,
31 Offset3 = 0x00001000,
32 Offset4 = 0x00010000,
33 Offset5 = 0x00100000,
34
41};
42
44 Size0,
45 Size1,
46 Size2,
47 Size3,
48 Size4,
49 Size5
50};
51
53Q_GLOBAL_STATIC(QtTimerIdFreeList, timerIdFreeList)
54
56 = default;
57
59{
60 // This function may be called after timerIdFreeList() has been destructed
61 // for example in case when application exits without waiting for
62 // running threads to exit and running thread finished() has been connected
63 // to a slot which triggers a sequence that registers new timer.
64 // See https://bugreports.qt-project.org/browse/QTBUG-38957.
65 if (QtTimerIdFreeList *fl = timerIdFreeList())
66 return fl->next();
67 return 0; // Note! returning 0 generates a warning
68}
69
71{
72 // this function may be called by a global destructor after
73 // timerIdFreeList() has been destructed
74 if (QtTimerIdFreeList *fl = timerIdFreeList())
75 fl->release(timerId);
76}
77
121
127 : QObject(dd, parent) {}
128
133{ }
134
145{
147 return data->eventDispatcher.loadRelaxed();
148}
149
212{
214 registerTimer(id, interval, timerType, object);
215 return id;
216}
217
286// ### DOC: Are these called when the _application_ starts/stops or just
287// when the current _event loop_ starts/stops?
292{ }
293
298{ }
299
360{
362
363 // clean up unused items in the list
364 d->eventFilters.removeAll(nullptr);
365 d->eventFilters.removeAll(filterObj);
366 d->eventFilters.prepend(filterObj);
367}
368
383{
385 for (int i = 0; i < d->eventFilters.size(); ++i) {
386 if (d->eventFilters.at(i) == filter) {
387 d->eventFilters[i] = nullptr;
388 break;
389 }
390 }
391}
392
413{
415 if (!d->eventFilters.isEmpty()) {
416 // Raise the loopLevel so that deleteLater() calls in or triggered
417 // by event_filter() will be processed from the main event loop.
418 QScopedScopeLevelCounter scopeLevelCounter(d->threadData.loadAcquire());
419 for (int i = 0; i < d->eventFilters.size(); ++i) {
420 QAbstractNativeEventFilter *filter = d->eventFilters.at(i);
421 if (!filter)
422 continue;
423 if (filter->nativeEventFilter(eventType, message, result))
424 return true;
425 }
426 }
427 return false;
428}
429
447
448#include "moc_qabstracteventdispatcher.cpp"
~QAbstractEventDispatcher()
Destroys the event dispatcher.
static QAbstractEventDispatcher * instance(QThread *thread=nullptr)
Returns a pointer to the event dispatcher object for the specified thread.
bool filterNativeEvent(const QByteArray &eventType, void *message, qintptr *result)
Sends message through the event filters that were set by installNativeEventFilter().
void installNativeEventFilter(QAbstractNativeEventFilter *filterObj)
\variable QAbstractEventDispatcher::TimerInfo::timerId
void removeNativeEventFilter(QAbstractNativeEventFilter *filterObj)
Removes the event filter filter from this object.
QAbstractEventDispatcher(QObject *parent=nullptr)
Constructs a new event dispatcher with the given parent.
int registerTimer(qint64 interval, Qt::TimerType timerType, QObject *object)
Registers a timer with the specified interval and timerType for the given object and returns the time...
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qobject.h:90
QThread * thread() const
Returns the thread in which the object lives.
Definition qobject.cpp:1561
static Q_AUTOTEST_EXPORT QThreadData * current(bool createIfNecessary=true)
Definition qthread.cpp:1005
static QThreadData * get2(QThread *thread)
Definition qthread_p.h:290
Combined button and popup list for selecting options.
TimerType
QFreeList< void, QtTimerIdFreeListConstants > QtTimerIdFreeList
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
GLenum GLuint id
[7]
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint GLsizei const GLchar * message
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint64EXT * result
[6]
long long qint64
Definition qtypes.h:55
ptrdiff_t qintptr
Definition qtypes.h:71
static const int Sizes[BlockCount]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent