Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qandroideventdispatcher.cpp
Go to the documentation of this file.
1
// Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
include
"qandroideventdispatcher.h"
6
#
include
"androidjnimain.h"
7
8
using
namespace
Qt::StringLiterals;
9
10
QAndroidEventDispatcher
::QAndroidEventDispatcher(QObject *parent) :
11
QUnixEventDispatcherQPA(parent)
12
{
13
if
(
QtAndroid
::
blockEventLoopsWhenSuspended
(
)
)
14
QAndroidEventDispatcherStopper
::
instance
(
)
->
addEventDispatcher
(
this
)
;
15
}
16
17
QAndroidEventDispatcher
::~
QAndroidEventDispatcher
()
18
{
19
if
(
QtAndroid
::
blockEventLoopsWhenSuspended
(
)
)
20
QAndroidEventDispatcherStopper
::
instance
(
)
->
removeEventDispatcher
(
this
)
;
21
}
22
23
enum
States
{
Running
= 0,
StopRequest
= 1,
Stopping
= 2};
24
25
void
QAndroidEventDispatcher
::
start
()
26
{
27
int
prevState = m_stopRequest.fetchAndStoreAcquire(Running);
28
if
(prevState ==
Stopping
) {
29
m_semaphore.release();
30
wakeUp();
31
}
else
if
(prevState ==
Running
) {
32
qWarning(
"Error: start without corresponding stop"
);
33
}
34
//else if prevState == StopRequest, no action needed
35
}
36
37
void
QAndroidEventDispatcher
::
stop
()
38
{
39
if
(m_stopRequest.testAndSetAcquire(Running, StopRequest))
40
wakeUp();
41
else
42
qWarning(
"Error: start/stop out of sync"
);
43
}
44
45
void
QAndroidEventDispatcher
::
goingToStop
(
bool
stop)
46
{
47
m_goingToStop.storeRelaxed(stop ? 1 : 0);
48
if
(!stop)
49
wakeUp();
50
}
51
52
bool
QAndroidEventDispatcher
::
processEvents
(QEventLoop::ProcessEventsFlags flags)
53
{
54
if
(m_goingToStop.loadRelaxed())
55
flags |= QEventLoop::ExcludeSocketNotifiers | QEventLoop::X11ExcludeTimers;
56
57
{
58
QtAndroidPrivate::AndroidDeadlockProtector protector(
59
u"QAndroidEventDispatcher::processEvents()"_s);
60
if
(m_stopRequest.testAndSetAcquire(StopRequest, Stopping) && protector.acquire()) {
61
m_semaphore.acquire();
62
wakeUp();
63
}
64
}
65
66
return
QUnixEventDispatcherQPA::processEvents(flags);
67
}
68
69
QAndroidEventDispatcherStopper
*
QAndroidEventDispatcherStopper
::
instance
()
70
{
71
Q_CONSTINIT
static
QAndroidEventDispatcherStopper androidEventDispatcherStopper;
72
return
&androidEventDispatcherStopper;
73
}
74
75
void
QAndroidEventDispatcherStopper
::
startAll
()
76
{
77
QMutexLocker lock(&m_mutex);
78
if
(!m_started.testAndSetOrdered(0, 1))
79
return
;
80
81
for
(QAndroidEventDispatcher *d : std::as_const(m_dispatchers))
82
d->start();
83
}
84
85
void
QAndroidEventDispatcherStopper
::
stopAll
()
86
{
87
QMutexLocker lock(&m_mutex);
88
if
(!m_started.testAndSetOrdered(1, 0))
89
return
;
90
91
for
(QAndroidEventDispatcher *d : std::as_const(m_dispatchers))
92
d->stop();
93
}
94
95
void
QAndroidEventDispatcherStopper
::
addEventDispatcher
(
QAndroidEventDispatcher
*dispatcher)
96
{
97
QMutexLocker lock(&m_mutex);
98
m_dispatchers.push_back(dispatcher);
99
}
100
101
void
QAndroidEventDispatcherStopper
::
removeEventDispatcher
(
QAndroidEventDispatcher
*dispatcher)
102
{
103
QMutexLocker lock(&m_mutex);
104
const
auto
it = std::find(m_dispatchers.begin(), m_dispatchers.end(), dispatcher);
105
if
(it != m_dispatchers.end())
106
m_dispatchers.erase(it);
107
}
108
109
void
QAndroidEventDispatcherStopper
::
goingToStop
(
bool
stop)
110
{
111
QMutexLocker lock(&m_mutex);
112
for
(QAndroidEventDispatcher *d : std::as_const(m_dispatchers))
113
d->goingToStop(stop);
114
}
QAndroidEventDispatcherStopper
Definition
qandroideventdispatcher.h:33
QAndroidEventDispatcherStopper::instance
static QAndroidEventDispatcherStopper * instance()
Definition
qandroideventdispatcher.cpp:69
QAndroidEventDispatcherStopper::removeEventDispatcher
void removeEventDispatcher(QAndroidEventDispatcher *dispatcher)
Definition
qandroideventdispatcher.cpp:101
QAndroidEventDispatcherStopper::startAll
void startAll()
Definition
qandroideventdispatcher.cpp:75
QAndroidEventDispatcherStopper::stopAll
void stopAll()
Definition
qandroideventdispatcher.cpp:85
QAndroidEventDispatcherStopper::addEventDispatcher
void addEventDispatcher(QAndroidEventDispatcher *dispatcher)
Definition
qandroideventdispatcher.cpp:95
QAndroidEventDispatcherStopper::goingToStop
void goingToStop(bool stop)
Definition
qandroideventdispatcher.cpp:109
QAndroidEventDispatcher
Definition
qandroideventdispatcher.h:13
QAndroidEventDispatcher::~QAndroidEventDispatcher
~QAndroidEventDispatcher()
Definition
qandroideventdispatcher.cpp:17
QAndroidEventDispatcher::goingToStop
void goingToStop(bool stop)
Definition
qandroideventdispatcher.cpp:45
QAndroidEventDispatcher::processEvents
bool processEvents(QEventLoop::ProcessEventsFlags flags) override
Processes pending events that match flags until there are no more events to process.
Definition
qandroideventdispatcher.cpp:52
QAndroidEventDispatcher::start
void start()
Definition
qandroideventdispatcher.cpp:25
QAndroidEventDispatcher::stop
void stop()
Definition
qandroideventdispatcher.cpp:37
QtAndroid
Definition
androidjnimain.h:35
QtAndroid::blockEventLoopsWhenSuspended
bool blockEventLoopsWhenSuspended()
Definition
androidjnimain.cpp:374
States
States
Definition
qandroideventdispatcher.cpp:23
StopRequest
@ StopRequest
Definition
qandroideventdispatcher.cpp:23
Stopping
@ Stopping
Definition
qandroideventdispatcher.cpp:23
Running
@ Running
Definition
qandroideventdispatcher.cpp:23
qtbase
src
plugins
platforms
android
qandroideventdispatcher.cpp
Generated on
for Qt by
1.18.0