7#include <atspi/atspi-constants.h>
8#include <private/qguiapplication_p.h>
9#include <qpa/qplatformintegration.h>
19#if QT_CONFIG(accessibility)
20#include "deviceeventcontroller_adaptor.h"
35 connect(dbusConnection,
SIGNAL(enabledChanged(
bool)),
this,
SLOT(enabledChanged(
bool)));
41 if (dbusConnection->isEnabled())
54 delete dbusConnection;
62void QSpiAccessibleBridge::updateStatus()
67 initializeConstantMappings();
70 dec =
new DeviceEventControllerAdaptor(
this);
89 QAccessible::Role role;
94static RoleMapping
map[] = {
96 { QAccessible::NoRole, ATSPI_ROLE_INVALID,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"invalid role") },
98 { QAccessible::TitleBar, ATSPI_ROLE_TEXT,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"title bar") },
100 { QAccessible::MenuBar, ATSPI_ROLE_MENU_BAR,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"menu bar") },
102 { QAccessible::ScrollBar, ATSPI_ROLE_SCROLL_BAR,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"scroll bar") },
104 { QAccessible::Grip, ATSPI_ROLE_UNKNOWN,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"grip") },
106 { QAccessible::Sound, ATSPI_ROLE_UNKNOWN,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"sound") },
108 { QAccessible::Cursor, ATSPI_ROLE_UNKNOWN,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"cursor") },
110 { QAccessible::Caret, ATSPI_ROLE_UNKNOWN,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"text caret") },
112 { QAccessible::AlertMessage, ATSPI_ROLE_ALERT,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"alert message") },
114 { QAccessible::Window, ATSPI_ROLE_FRAME,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"frame") },
116 { QAccessible::Client, ATSPI_ROLE_FILLER,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"filler") },
118 { QAccessible::PopupMenu, ATSPI_ROLE_POPUP_MENU,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"popup menu") },
120 { QAccessible::MenuItem, ATSPI_ROLE_MENU_ITEM,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"menu item") },
122 { QAccessible::ToolTip, ATSPI_ROLE_TOOL_TIP,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"tool tip") },
124 { QAccessible::Application, ATSPI_ROLE_APPLICATION,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"application") },
126 { QAccessible::Document, ATSPI_ROLE_DOCUMENT_FRAME,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"document") },
128 { QAccessible::Pane, ATSPI_ROLE_PANEL,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"panel") },
130 { QAccessible::Chart, ATSPI_ROLE_CHART,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"chart") },
132 { QAccessible::Dialog, ATSPI_ROLE_DIALOG,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"dialog") },
134 { QAccessible::Border, ATSPI_ROLE_FRAME,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"frame") },
136 { QAccessible::Grouping, ATSPI_ROLE_PANEL,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"panel") },
138 { QAccessible::Separator, ATSPI_ROLE_SEPARATOR,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"separator") },
140 { QAccessible::ToolBar, ATSPI_ROLE_TOOL_BAR,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"tool bar") },
142 { QAccessible::StatusBar, ATSPI_ROLE_STATUS_BAR,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"status bar") },
144 { QAccessible::Table, ATSPI_ROLE_TABLE,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"table") },
146 { QAccessible::ColumnHeader, ATSPI_ROLE_TABLE_COLUMN_HEADER,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"column header") },
148 { QAccessible::RowHeader, ATSPI_ROLE_TABLE_ROW_HEADER,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"row header") },
150 { QAccessible::Column, ATSPI_ROLE_TABLE_CELL,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"column") },
152 { QAccessible::Row, ATSPI_ROLE_TABLE_ROW,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"row") },
154 { QAccessible::Cell, ATSPI_ROLE_TABLE_CELL,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"cell") },
156 { QAccessible::Link, ATSPI_ROLE_LINK,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"link") },
158 { QAccessible::HelpBalloon, ATSPI_ROLE_DIALOG,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"help balloon") },
160 { QAccessible::Assistant, ATSPI_ROLE_DIALOG,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"assistant") },
162 { QAccessible::List, ATSPI_ROLE_LIST,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"list") },
164 { QAccessible::ListItem, ATSPI_ROLE_LIST_ITEM,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"list item") },
166 { QAccessible::Tree, ATSPI_ROLE_TREE,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"tree") },
168 { QAccessible::TreeItem, ATSPI_ROLE_TABLE_CELL,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"tree item") },
170 { QAccessible::PageTab, ATSPI_ROLE_PAGE_TAB,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"page tab") },
172 { QAccessible::PropertyPage, ATSPI_ROLE_PAGE_TAB,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"property page") },
174 { QAccessible::Indicator, ATSPI_ROLE_UNKNOWN,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"indicator") },
176 { QAccessible::Graphic, ATSPI_ROLE_IMAGE,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"graphic") },
178 { QAccessible::StaticText, ATSPI_ROLE_LABEL,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"label") },
180 { QAccessible::EditableText, ATSPI_ROLE_TEXT,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"text") },
182 { QAccessible::PushButton, ATSPI_ROLE_PUSH_BUTTON,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"push button") },
184 { QAccessible::CheckBox, ATSPI_ROLE_CHECK_BOX,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"check box") },
186 { QAccessible::RadioButton, ATSPI_ROLE_RADIO_BUTTON,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"radio button") },
188 { QAccessible::ComboBox, ATSPI_ROLE_COMBO_BOX,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"combo box") },
190 { QAccessible::ProgressBar, ATSPI_ROLE_PROGRESS_BAR,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"progress bar") },
192 { QAccessible::Dial, ATSPI_ROLE_DIAL,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"dial") },
194 { QAccessible::HotkeyField, ATSPI_ROLE_TEXT,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"hotkey field") },
196 { QAccessible::Slider, ATSPI_ROLE_SLIDER,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"slider") },
198 { QAccessible::SpinBox, ATSPI_ROLE_SPIN_BUTTON,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"spin box") },
200 { QAccessible::Canvas, ATSPI_ROLE_CANVAS,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"canvas") },
202 { QAccessible::Animation, ATSPI_ROLE_ANIMATION,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"animation") },
204 { QAccessible::Equation, ATSPI_ROLE_TEXT,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"equation") },
206 { QAccessible::ButtonDropDown, ATSPI_ROLE_PUSH_BUTTON,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"button with drop down") },
208 { QAccessible::ButtonMenu, ATSPI_ROLE_PUSH_BUTTON,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"button menu") },
210 { QAccessible::ButtonDropGrid, ATSPI_ROLE_PUSH_BUTTON,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"button with drop down grid") },
212 { QAccessible::Whitespace, ATSPI_ROLE_FILLER,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"space") },
214 { QAccessible::PageTabList, ATSPI_ROLE_PAGE_TAB_LIST,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"page tab list") },
216 { QAccessible::Clock, ATSPI_ROLE_UNKNOWN,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"clock") },
218 { QAccessible::Splitter, ATSPI_ROLE_SPLIT_PANE,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"splitter") },
220 { QAccessible::LayeredPane, ATSPI_ROLE_LAYERED_PANE,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"layered pane") },
222 { QAccessible::WebDocument, ATSPI_ROLE_DOCUMENT_WEB,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"web document") },
224 { QAccessible::Paragraph, ATSPI_ROLE_PARAGRAPH,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"paragraph") },
226 { QAccessible::Section, ATSPI_ROLE_SECTION,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"section") },
228 { QAccessible::ColorChooser, ATSPI_ROLE_COLOR_CHOOSER,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"color chooser") },
230 { QAccessible::Footer, ATSPI_ROLE_FOOTER,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"footer") },
232 { QAccessible::Form, ATSPI_ROLE_FORM,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"form") },
234 { QAccessible::Heading, ATSPI_ROLE_HEADING,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"heading") },
236 { QAccessible::Note, ATSPI_ROLE_COMMENT,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"note") },
238 { QAccessible::ComplementaryContent, ATSPI_ROLE_SECTION,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"complementary content") },
240 { QAccessible::Terminal, ATSPI_ROLE_TERMINAL,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"terminal") },
242 { QAccessible::Desktop, ATSPI_ROLE_DESKTOP_FRAME,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"desktop") },
244 { QAccessible::Notification, ATSPI_ROLE_NOTIFICATION,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"notification") },
246 { QAccessible::UserRole, ATSPI_ROLE_UNKNOWN,
QT_TRANSLATE_NOOP(
"QSpiAccessibleBridge",
"unknown") }
249void QSpiAccessibleBridge::initializeConstantMappings()
251 for (
uint i = 0;
i <
sizeof(
map) /
sizeof(RoleMapping); ++
i)
256 QAccessible::staticMetaObject.enumerator(
257 QAccessible::staticMetaObject.indexOfEnumerator(
"Role")).keyCount() - 1,
258 "",
"Handle all QAccessible::Role members in qSpiRoleMapping");
264 if (
auto accessibility = integration->accessibility())
273 return brigde ? brigde->spiRoleNames().value(role) :
RoleNames();
278#include "moc_qspiaccessiblebridge_p.cpp"
void notify(QAccessibleEvent *event)
void registerApplication()
Connects to the accessibility dbus.
QDBusConnection connection() const
Returns the DBus connection that got established.
bool registerVirtualObject(const QString &path, QDBusVirtualObject *object, VirtualObjectRegisterOption options=SingleNode)
bool registerObject(const QString &path, QObject *object, RegisterOptions options=ExportAdaptors)
Registers the object object at path path and returns true if the registration was successful.
static QPlatformIntegration * platformIntegration()
qsizetype size() const noexcept
Returns the number of items in the hash.
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
QDBusConnection dBusConnection() const
virtual ~QSpiAccessibleBridge()
static QSpiAccessibleBridge * instance()
void notifyAccessibilityUpdate(QAccessibleEvent *event) override
static RoleNames namesForRole(QAccessible::Role role)
void enabledChanged(bool enabled)
bool singleShot
whether the timer is a single-shot timer
QMap< QString, QString > map
[6]
QCache< int, Employee > cache
[0]
Combined button and popup list for selecting options.
GLenum GLenum GLsizei const GLuint GLboolean enabled
#define Q_ASSERT_X(cond, x, msg)
#define ATSPI_DBUS_PATH_DEC
#define QSPI_OBJECT_PATH_ACCESSIBLE
void qSpiInitializeStructTypes()
#define QT_TRANSLATE_NOOP(scope, x)
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection)