5#include <QtCore/qdebug.h>
6#include <QtCore/qloggingcategory.h>
8#if QT_CONFIG(accessibility)
12Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCache,
"qt.accessibility.cache");
15
16
17
18
20static QAccessibleCache *accessibleCache =
nullptr;
22static void cleanupAccessibleCache()
24 delete accessibleCache;
25 accessibleCache =
nullptr;
28QAccessibleCache::~QAccessibleCache()
30 for (QAccessible::Id id: idToInterface.keys())
34QAccessibleCache *QAccessibleCache::instance()
36 if (!accessibleCache) {
37 accessibleCache =
new QAccessibleCache;
38 qAddPostRoutine(cleanupAccessibleCache);
40 return accessibleCache;
44
45
46
47
48QAccessible::Id QAccessibleCache::acquireId()
const
50 static const QAccessible::Id FirstId = QAccessible::Id(INT_MAX) + 1;
51 static QAccessible::Id nextId = FirstId;
53 while (idToInterface.contains(nextId)) {
56 if (nextId == UINT_MAX - 1)
65QAccessibleInterface *QAccessibleCache::interfaceForId(QAccessible::Id id)
const
67 return idToInterface.value(id);
70QAccessible::Id QAccessibleCache::idForInterface(QAccessibleInterface *iface)
const
72 return interfaceToId.value(iface);
75QAccessible::Id QAccessibleCache::idForObject(QObject *obj)
const
78 const QMetaObject *mo = obj->metaObject();
79 for (
auto pair : objectToId.values(obj)) {
80 if (pair.second == mo) {
89
90
91
92
93bool QAccessibleCache::containsObject(QObject *obj)
const
96 const QMetaObject *mo = obj->metaObject();
97 for (
auto pair : objectToId.values(obj)) {
98 if (pair.second == mo) {
106QAccessible::Id QAccessibleCache::insert(QObject *object, QAccessibleInterface *iface)
const
112 Q_ASSERT(!containsObject(object));
113 Q_ASSERT_X(!interfaceToId.contains(iface),
"",
"Accessible interface inserted into cache twice!");
115 QAccessible::Id id = acquireId();
116 QObject *obj = iface->object();
117 Q_ASSERT(object == obj);
119 objectToId.insert(obj, std::pair(id, obj->metaObject()));
120 connect(obj, &QObject::destroyed,
this, &QAccessibleCache::objectDestroyed);
122 idToInterface.insert(id, iface);
123 interfaceToId.insert(iface, id);
124 qCDebug(lcAccessibilityCache) <<
"insert - id:" << id <<
" iface:" << iface;
128void QAccessibleCache::objectDestroyed(QObject* obj)
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 for (
auto pair : objectToId.values(obj)) {
156 QAccessible::Id id = pair.first;
157 Q_ASSERT_X(idToInterface.contains(id),
"",
"QObject with accessible interface deleted, where interface not in cache!");
158 deleteInterface(id, obj);
162void QAccessibleCache::deleteInterface(QAccessible::Id id, QObject *obj)
164 QAccessibleInterface *iface = idToInterface.take(id);
165 qCDebug(lcAccessibilityCache) <<
"delete - id:" << id <<
" iface:" << iface;
168 interfaceToId.take(iface);
170 obj = iface->object();
172 objectToId.remove(obj);
176 removeAccessibleElement(id);
182#include "moc_qaccessiblecache_p.cpp"