8#include <QtGui/qaccessible.h>
9#include <QtCore/qmap.h>
10#include <private/qcore_mac_p.h>
16#if QT_CONFIG(accessibility)
18QCocoaAccessibility::QCocoaAccessibility()
23QCocoaAccessibility::~QCocoaAccessibility()
28void QCocoaAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *
event)
30 if (!
isActive() || !
event->accessibleInterface() || !
event->accessibleInterface()->isValid())
32 QMacAccessibilityElement *element = [QMacAccessibilityElement elementWithId:
event->uniqueId()];
34 qWarning(
"QCocoaAccessibility::notifyAccessibilityUpdate: invalid element");
38 switch (
event->type()) {
39 case QAccessible::Focus: {
40 NSAccessibilityPostNotification(element, NSAccessibilityFocusedUIElementChangedNotification);
43 case QAccessible::StateChanged:
44 case QAccessible::ValueChanged:
45 case QAccessible::TextInserted:
46 case QAccessible::TextRemoved:
47 case QAccessible::TextUpdated:
48 NSAccessibilityPostNotification(element, NSAccessibilityValueChangedNotification);
50 case QAccessible::TextCaretMoved:
51 case QAccessible::TextSelectionChanged:
52 NSAccessibilityPostNotification(element, NSAccessibilitySelectedTextChangedNotification);
54 case QAccessible::NameChanged:
55 NSAccessibilityPostNotification(element, NSAccessibilityTitleChangedNotification);
57 case QAccessible::TableModelChanged:
59 [element updateTableModel];
66void QCocoaAccessibility::setRootObject(
QObject *
o)
71void QCocoaAccessibility::initialize()
76void QCocoaAccessibility::cleanup()
81namespace QCocoaAccessible {
86static void populateRoleMap()
88 QMacAccessibiltyRoleMap &roleMap = *qMacAccessibiltyRoleMap();
89 roleMap[QAccessible::MenuItem] = NSAccessibilityMenuItemRole;
90 roleMap[QAccessible::MenuBar] = NSAccessibilityMenuBarRole;
91 roleMap[QAccessible::ScrollBar] = NSAccessibilityScrollBarRole;
92 roleMap[QAccessible::Grip] = NSAccessibilityGrowAreaRole;
93 roleMap[QAccessible::Window] = NSAccessibilityWindowRole;
94 roleMap[QAccessible::Dialog] = NSAccessibilityWindowRole;
95 roleMap[QAccessible::AlertMessage] = NSAccessibilityWindowRole;
96 roleMap[QAccessible::ToolTip] = NSAccessibilityWindowRole;
97 roleMap[QAccessible::HelpBalloon] = NSAccessibilityWindowRole;
98 roleMap[QAccessible::PopupMenu] = NSAccessibilityMenuRole;
99 roleMap[QAccessible::Application] = NSAccessibilityApplicationRole;
100 roleMap[QAccessible::Pane] = NSAccessibilityGroupRole;
101 roleMap[QAccessible::Grouping] = NSAccessibilityGroupRole;
102 roleMap[QAccessible::Separator] = NSAccessibilitySplitterRole;
103 roleMap[QAccessible::ToolBar] = NSAccessibilityToolbarRole;
104 roleMap[QAccessible::PageTab] = NSAccessibilityRadioButtonRole;
105 roleMap[QAccessible::ButtonMenu] = NSAccessibilityMenuButtonRole;
106 roleMap[QAccessible::ButtonDropDown] = NSAccessibilityPopUpButtonRole;
107 roleMap[QAccessible::SpinBox] = NSAccessibilityIncrementorRole;
108 roleMap[QAccessible::Slider] = NSAccessibilitySliderRole;
109 roleMap[QAccessible::ProgressBar] = NSAccessibilityProgressIndicatorRole;
110 roleMap[QAccessible::ComboBox] = NSAccessibilityComboBoxRole;
111 roleMap[QAccessible::RadioButton] = NSAccessibilityRadioButtonRole;
112 roleMap[QAccessible::CheckBox] = NSAccessibilityCheckBoxRole;
113 roleMap[QAccessible::StaticText] = NSAccessibilityStaticTextRole;
114 roleMap[QAccessible::Table] = NSAccessibilityTableRole;
115 roleMap[QAccessible::StatusBar] = NSAccessibilityStaticTextRole;
116 roleMap[QAccessible::Column] = NSAccessibilityColumnRole;
117 roleMap[QAccessible::ColumnHeader] = NSAccessibilityColumnRole;
118 roleMap[QAccessible::Row] = NSAccessibilityRowRole;
119 roleMap[QAccessible::RowHeader] = NSAccessibilityRowRole;
120 roleMap[QAccessible::Button] = NSAccessibilityButtonRole;
121 roleMap[QAccessible::EditableText] = NSAccessibilityTextFieldRole;
122 roleMap[QAccessible::Link] = NSAccessibilityLinkRole;
123 roleMap[QAccessible::Indicator] = NSAccessibilityValueIndicatorRole;
124 roleMap[QAccessible::Splitter] = NSAccessibilitySplitGroupRole;
125 roleMap[QAccessible::List] = NSAccessibilityListRole;
126 roleMap[QAccessible::ListItem] = NSAccessibilityStaticTextRole;
127 roleMap[QAccessible::Cell] = NSAccessibilityCellRole;
128 roleMap[QAccessible::Client] = NSAccessibilityGroupRole;
129 roleMap[QAccessible::Paragraph] = NSAccessibilityGroupRole;
130 roleMap[QAccessible::Section] = NSAccessibilityGroupRole;
131 roleMap[QAccessible::WebDocument] = NSAccessibilityGroupRole;
132 roleMap[QAccessible::ColorChooser] = NSAccessibilityColorWellRole;
133 roleMap[QAccessible::Footer] = NSAccessibilityGroupRole;
134 roleMap[QAccessible::Form] = NSAccessibilityGroupRole;
135 roleMap[QAccessible::Heading] =
@"AXHeading";
136 roleMap[QAccessible::Note] = NSAccessibilityGroupRole;
137 roleMap[QAccessible::ComplementaryContent] = NSAccessibilityGroupRole;
138 roleMap[QAccessible::Graphic] = NSAccessibilityImageRole;
139 roleMap[QAccessible::Tree] = NSAccessibilityOutlineRole;
146NSString *macRole(QAccessibleInterface *
interface)
148 QAccessible::Role qtRole =
interface->role();
149 QMacAccessibiltyRoleMap &roleMap = *qMacAccessibiltyRoleMap();
151 if (roleMap.isEmpty())
156 if (roleMap.contains(qtRole)) {
158 if (roleMap[qtRole] == NSAccessibilityComboBoxRole && !
interface->state().editable)
159 return NSAccessibilityMenuButtonRole;
160 if (roleMap[qtRole] == NSAccessibilityTextFieldRole &&
interface->state().multiLine)
161 return NSAccessibilityTextAreaRole;
162 return roleMap[qtRole];
169 return NSAccessibilityGroupRole;
175NSString *macSubrole(QAccessibleInterface *
interface)
179 return NSAccessibilitySearchFieldSubrole;
181 return NSAccessibilitySecureTextFieldSubrole;
190bool shouldBeIgnored(QAccessibleInterface *
interface)
195 if (
state.invisible ||
202 const QAccessible::Role role =
interface->role();
203 if (role == QAccessible::Border ||
204 role == QAccessible::Application ||
205 role == QAccessible::ToolBar ||
206 role == QAccessible::Pane ||
207 role == QAccessible::Client)
211 if (mac_role == NSAccessibilityWindowRole ||
212 mac_role == NSAccessibilityUnknownRole)
219 if (role == QAccessible::Client && mac_role == NSAccessibilityUnknownRole)
235NSArray<QMacAccessibilityElement *> *unignoredChildren(QAccessibleInterface *
interface)
240 NSMutableArray<QMacAccessibilityElement *> *kids = [NSMutableArray<QMacAccessibilityElement *> arrayWithCapacity:numKids];
241 for (
int i = 0;
i < numKids; ++
i) {
246 QAccessible::Id childId = QAccessible::uniqueId(
child);
249 QMacAccessibilityElement *element = [QMacAccessibilityElement elementWithId: childId];
251 [kids addObject: element];
253 qWarning(
"QCocoaAccessibility: invalid child");
255 return NSAccessibilityUnignoredChildren(kids);
262NSString *getTranslatedAction(
const QString &qtAction)
264 if (qtAction == QAccessibleActionInterface::pressAction())
265 return NSAccessibilityPressAction;
266 else if (qtAction == QAccessibleActionInterface::increaseAction())
267 return NSAccessibilityIncrementAction;
268 else if (qtAction == QAccessibleActionInterface::decreaseAction())
269 return NSAccessibilityDecrementAction;
270 else if (qtAction == QAccessibleActionInterface::showMenuAction())
271 return NSAccessibilityShowMenuAction;
272 else if (qtAction == QAccessibleActionInterface::setFocusAction())
273 return NSAccessibilityRaiseAction;
274 else if (qtAction == QAccessibleActionInterface::toggleAction())
275 return NSAccessibilityPressAction;
299 if ([nsAction
compare: NSAccessibilityPressAction] == NSOrderedSame) {
300 if (
interface->role() == QAccessible::CheckBox ||
interface->role() == QAccessible::RadioButton)
301 return QAccessibleActionInterface::toggleAction();
302 return QAccessibleActionInterface::pressAction();
303 }
else if ([nsAction
compare: NSAccessibilityIncrementAction] == NSOrderedSame)
304 return QAccessibleActionInterface::increaseAction();
305 else if ([nsAction
compare: NSAccessibilityDecrementAction] == NSOrderedSame)
306 return QAccessibleActionInterface::decreaseAction();
307 else if ([nsAction
compare: NSAccessibilityShowMenuAction] == NSOrderedSame)
308 return QAccessibleActionInterface::showMenuAction();
309 else if ([nsAction
compare: NSAccessibilityRaiseAction] == NSOrderedSame)
310 return QAccessibleActionInterface::setFocusAction();
317bool hasValueAttribute(QAccessibleInterface *
interface)
320 const QAccessible::Role qtrole =
interface->role();
321 if (qtrole == QAccessible::EditableText
322 || qtrole == QAccessible::StaticText
331id getValueAttribute(QAccessibleInterface *
interface)
333 const QAccessible::Role qtrole =
interface->role();
334 if (qtrole == QAccessible::StaticText) {
335 return interface->text(QAccessible::Name).toNSString();
337 if (qtrole == QAccessible::EditableText) {
338 if (QAccessibleTextInterface *textInterface =
interface->textInterface()) {
341 int end = textInterface->characterCount();
356 return text.toNSString();
360 if (QAccessibleValueInterface *valueInterface =
interface->valueInterface()) {
361 return valueInterface->currentValue().toString().toNSString();
367 return interface->state().checked ? @(1) : @(0);
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char * interface
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
static int compare(quint64 a, quint64 b)
const char className[16]
[1]