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::Announcement: {
40 auto *announcementEvent =
static_cast<QAccessibleAnnouncementEvent *
>(
event);
41 auto priorityLevel = (announcementEvent->priority() == QAccessible::AnnouncementPriority::Assertive)
42 ? NSAccessibilityPriorityHigh
43 : NSAccessibilityPriorityMedium;
44 NSDictionary *announcementInfo = @{
45 NSAccessibilityPriorityKey: [NSNumber numberWithInt:priorityLevel],
46 NSAccessibilityAnnouncementKey: announcementEvent->message().toNSString()
51 NSAccessibilityPostNotificationWithUserInfo(NSApp,
52 NSAccessibilityAnnouncementRequestedNotification,
56 case QAccessible::Focus: {
57 NSAccessibilityPostNotification(element, NSAccessibilityFocusedUIElementChangedNotification);
60 case QAccessible::StateChanged:
61 case QAccessible::ValueChanged:
62 case QAccessible::TextInserted:
63 case QAccessible::TextRemoved:
64 case QAccessible::TextUpdated:
65 NSAccessibilityPostNotification(element, NSAccessibilityValueChangedNotification);
67 case QAccessible::TextCaretMoved:
68 case QAccessible::TextSelectionChanged:
69 NSAccessibilityPostNotification(element, NSAccessibilitySelectedTextChangedNotification);
71 case QAccessible::NameChanged:
72 NSAccessibilityPostNotification(element, NSAccessibilityTitleChangedNotification);
74 case QAccessible::TableModelChanged:
76 [element updateTableModel];
83void QCocoaAccessibility::setRootObject(
QObject *
o)
88void QCocoaAccessibility::initialize()
93void QCocoaAccessibility::cleanup()
98namespace QCocoaAccessible {
100typedef QMap<QAccessible::Role, NSString *> QMacAccessibiltyRoleMap;
103static void populateRoleMap()
105 QMacAccessibiltyRoleMap &roleMap = *qMacAccessibiltyRoleMap();
106 roleMap[QAccessible::MenuItem] = NSAccessibilityMenuItemRole;
107 roleMap[QAccessible::MenuBar] = NSAccessibilityMenuBarRole;
108 roleMap[QAccessible::ScrollBar] = NSAccessibilityScrollBarRole;
109 roleMap[QAccessible::Grip] = NSAccessibilityGrowAreaRole;
110 roleMap[QAccessible::Window] = NSAccessibilityWindowRole;
111 roleMap[QAccessible::Dialog] = NSAccessibilityWindowRole;
112 roleMap[QAccessible::AlertMessage] = NSAccessibilityWindowRole;
113 roleMap[QAccessible::ToolTip] = NSAccessibilityWindowRole;
114 roleMap[QAccessible::HelpBalloon] = NSAccessibilityWindowRole;
115 roleMap[QAccessible::PopupMenu] = NSAccessibilityMenuRole;
116 roleMap[QAccessible::Application] = NSAccessibilityApplicationRole;
117 roleMap[QAccessible::Pane] = NSAccessibilityGroupRole;
118 roleMap[QAccessible::Grouping] = NSAccessibilityGroupRole;
119 roleMap[QAccessible::Separator] = NSAccessibilitySplitterRole;
120 roleMap[QAccessible::ToolBar] = NSAccessibilityToolbarRole;
121 roleMap[QAccessible::PageTab] = NSAccessibilityRadioButtonRole;
122 roleMap[QAccessible::ButtonMenu] = NSAccessibilityMenuButtonRole;
123 roleMap[QAccessible::ButtonDropDown] = NSAccessibilityPopUpButtonRole;
124 roleMap[QAccessible::SpinBox] = NSAccessibilityIncrementorRole;
125 roleMap[QAccessible::Slider] = NSAccessibilitySliderRole;
126 roleMap[QAccessible::ProgressBar] = NSAccessibilityProgressIndicatorRole;
127 roleMap[QAccessible::ComboBox] = NSAccessibilityComboBoxRole;
128 roleMap[QAccessible::RadioButton] = NSAccessibilityRadioButtonRole;
129 roleMap[QAccessible::CheckBox] = NSAccessibilityCheckBoxRole;
130 roleMap[QAccessible::StaticText] = NSAccessibilityStaticTextRole;
131 roleMap[QAccessible::Table] = NSAccessibilityTableRole;
132 roleMap[QAccessible::StatusBar] = NSAccessibilityStaticTextRole;
133 roleMap[QAccessible::Column] = NSAccessibilityColumnRole;
134 roleMap[QAccessible::ColumnHeader] = NSAccessibilityColumnRole;
135 roleMap[QAccessible::Row] = NSAccessibilityRowRole;
136 roleMap[QAccessible::RowHeader] = NSAccessibilityRowRole;
137 roleMap[QAccessible::Button] = NSAccessibilityButtonRole;
138 roleMap[QAccessible::EditableText] = NSAccessibilityTextFieldRole;
139 roleMap[QAccessible::Link] = NSAccessibilityLinkRole;
140 roleMap[QAccessible::Indicator] = NSAccessibilityValueIndicatorRole;
141 roleMap[QAccessible::Splitter] = NSAccessibilitySplitGroupRole;
142 roleMap[QAccessible::List] = NSAccessibilityListRole;
143 roleMap[QAccessible::ListItem] = NSAccessibilityStaticTextRole;
144 roleMap[QAccessible::Cell] = NSAccessibilityCellRole;
145 roleMap[QAccessible::Client] = NSAccessibilityGroupRole;
146 roleMap[QAccessible::Paragraph] = NSAccessibilityGroupRole;
147 roleMap[QAccessible::Section] = NSAccessibilityGroupRole;
148 roleMap[QAccessible::WebDocument] = NSAccessibilityGroupRole;
149 roleMap[QAccessible::ColorChooser] = NSAccessibilityColorWellRole;
150 roleMap[QAccessible::Footer] = NSAccessibilityGroupRole;
151 roleMap[QAccessible::Form] = NSAccessibilityGroupRole;
152 roleMap[QAccessible::Heading] =
@"AXHeading";
153 roleMap[QAccessible::Note] = NSAccessibilityGroupRole;
154 roleMap[QAccessible::ComplementaryContent] = NSAccessibilityGroupRole;
155 roleMap[QAccessible::Graphic] = NSAccessibilityImageRole;
156 roleMap[QAccessible::Tree] = NSAccessibilityOutlineRole;
163NSString *macRole(QAccessibleInterface *
interface)
165 QAccessible::Role qtRole =
interface->role();
166 QMacAccessibiltyRoleMap &roleMap = *qMacAccessibiltyRoleMap();
168 if (roleMap.isEmpty())
173 if (roleMap.contains(qtRole)) {
175 if (roleMap[qtRole] == NSAccessibilityComboBoxRole && !
interface->state().editable)
176 return NSAccessibilityMenuButtonRole;
177 if (roleMap[qtRole] == NSAccessibilityTextFieldRole &&
interface->state().multiLine)
178 return NSAccessibilityTextAreaRole;
179 return roleMap[qtRole];
186 return NSAccessibilityGroupRole;
192NSString *macSubrole(QAccessibleInterface *
interface)
196 return NSAccessibilitySearchFieldSubrole;
198 return NSAccessibilitySecureTextFieldSubrole;
207bool shouldBeIgnored(QAccessibleInterface *
interface)
212 if (
state.invisible ||
219 const QAccessible::Role role =
interface->role();
220 if (role == QAccessible::Border ||
221 role == QAccessible::Application ||
222 role == QAccessible::ToolBar ||
223 role == QAccessible::Pane ||
224 role == QAccessible::Client)
228 if (mac_role == NSAccessibilityWindowRole ||
229 mac_role == NSAccessibilityUnknownRole)
236 if (role == QAccessible::Client && mac_role == NSAccessibilityUnknownRole)
252NSArray<QMacAccessibilityElement *> *unignoredChildren(QAccessibleInterface *
interface)
257 NSMutableArray<QMacAccessibilityElement *> *kids = [NSMutableArray<QMacAccessibilityElement *> arrayWithCapacity:numKids];
258 for (
int i = 0;
i < numKids; ++
i) {
263 QAccessible::Id childId = QAccessible::uniqueId(
child);
266 QMacAccessibilityElement *element = [QMacAccessibilityElement elementWithId: childId];
268 [kids addObject: element];
270 qWarning(
"QCocoaAccessibility: invalid child");
272 return NSAccessibilityUnignoredChildren(kids);
279NSString *getTranslatedAction(
const QString &qtAction)
281 if (qtAction == QAccessibleActionInterface::pressAction())
282 return NSAccessibilityPressAction;
283 else if (qtAction == QAccessibleActionInterface::increaseAction())
284 return NSAccessibilityIncrementAction;
285 else if (qtAction == QAccessibleActionInterface::decreaseAction())
286 return NSAccessibilityDecrementAction;
287 else if (qtAction == QAccessibleActionInterface::showMenuAction())
288 return NSAccessibilityShowMenuAction;
289 else if (qtAction == QAccessibleActionInterface::setFocusAction())
290 return NSAccessibilityRaiseAction;
291 else if (qtAction == QAccessibleActionInterface::toggleAction())
292 return NSAccessibilityPressAction;
316 if ([nsAction
compare: NSAccessibilityPressAction] == NSOrderedSame) {
317 if (
interface->role() == QAccessible::CheckBox ||
interface->role() == QAccessible::RadioButton)
318 return QAccessibleActionInterface::toggleAction();
319 return QAccessibleActionInterface::pressAction();
320 }
else if ([nsAction
compare: NSAccessibilityIncrementAction] == NSOrderedSame)
321 return QAccessibleActionInterface::increaseAction();
322 else if ([nsAction
compare: NSAccessibilityDecrementAction] == NSOrderedSame)
323 return QAccessibleActionInterface::decreaseAction();
324 else if ([nsAction
compare: NSAccessibilityShowMenuAction] == NSOrderedSame)
325 return QAccessibleActionInterface::showMenuAction();
326 else if ([nsAction
compare: NSAccessibilityRaiseAction] == NSOrderedSame)
327 return QAccessibleActionInterface::setFocusAction();
334bool hasValueAttribute(QAccessibleInterface *
interface)
337 const QAccessible::Role qtrole =
interface->role();
338 if (qtrole == QAccessible::EditableText
339 || qtrole == QAccessible::StaticText
348id getValueAttribute(QAccessibleInterface *
interface)
350 const QAccessible::Role qtrole =
interface->role();
351 if (qtrole == QAccessible::StaticText) {
352 return interface->text(QAccessible::Name).toNSString();
354 if (qtrole == QAccessible::EditableText) {
355 if (QAccessibleTextInterface *textInterface =
interface->textInterface()) {
358 int end = textInterface->characterCount();
373 return text.toNSString();
377 if (QAccessibleValueInterface *valueInterface =
interface->valueInterface()) {
378 return valueInterface->currentValue().toString().toNSString();
384 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]