5#include <QtCore/qdebug.h>
6#include <QtCore/qloggingcategory.h>
8#if QT_CONFIG(accessibility)
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;
40 return accessibleCache;
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
79 for (
auto pair : objectToId.
values(
obj)) {
80 if (pair.second ==
mo) {
93bool QAccessibleCache::containsObject(
QObject *
obj)
const
97 for (
auto pair : objectToId.
values(
obj)) {
98 if (pair.second ==
mo) {
106QAccessible::Id QAccessibleCache::insert(
QObject *
object, QAccessibleInterface *iface)
const
113 Q_ASSERT_X(!interfaceToId.contains(iface),
"",
"Accessible interface inserted into cache twice!");
115 QAccessible::Id
id = acquireId();
122 idToInterface.insert(
id, iface);
123 interfaceToId.insert(iface,
id);
124 qCDebug(lcAccessibilityCache) <<
"insert - id:" <<
id <<
" iface:" <<
iface;
128void QAccessibleCache::objectDestroyed(
QObject*
obj)
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);
172 objectToId.remove(
obj);
176 removeCocoaElement(
id);
182#include "moc_qaccessiblecache_p.cpp"
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
Combined button and popup list for selecting options.
constexpr QBindableInterface iface
void qAddPostRoutine(QtCleanUpFunction p)
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
GLenum GLsizei GLsizei GLint * values
[15]
constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2) noexcept(noexcept(std::make_pair(std::forward< T1 >(value1), std::forward< T2 >(value2))))
#define Q_ASSERT_X(cond, x, msg)
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection)