7#if QT_CONFIG(accessibility)
10#include "qioswindow.h"
11#include "quiaccessibilityelement.h"
13QT_NAMESPACE_ALIAS_OBJC_CLASS(QMacAccessibilityElement);
15QIOSPlatformAccessibility::QIOSPlatformAccessibility()
17 m_focusObserver = QMacNotificationObserver(
18 nil, UIAccessibilityElementFocusedNotification, [&](NSNotification *notification) {
19 id element = notification.userInfo[UIAccessibilityFocusedElementKey];
20 m_focusElement =
static_cast<QMacAccessibilityElement *>(element);
24QIOSPlatformAccessibility::~QIOSPlatformAccessibility()
28void invalidateCache(QAccessibleInterface *iface)
30 if (!iface || !iface->isValid()) {
31 qWarning() <<
"invalid accessible interface: " << iface;
42 const auto windows = QGuiApplication::allWindows();
43 for (QWindow *win : windows) {
44 if (win && win->handle()) {
45 auto *window =
static_cast<QIOSWindow *>(win->handle());
46 window->clearAccessibleCache();
52void QIOSPlatformAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event)
54 auto *accessibleInterface = event->accessibleInterface();
55 if (!isActive() || !accessibleInterface)
57 switch (event->type()) {
58 case QAccessible::Announcement: {
59 auto *announcementEvent =
static_cast<QAccessibleAnnouncementEvent *>(event);
60 const bool queueAnnouncement =
61 (announcementEvent->politeness() == QAccessible::AnnouncementPoliteness::Polite);
62 NSAttributedString *message = [[NSAttributedString alloc]
63 initWithString:announcementEvent->message().toNSString()
64 attributes:@{UIAccessibilitySpeechAttributeQueueAnnouncement: @(queueAnnouncement)}];
65 UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, [message autorelease]);
68 case QAccessible::Focus: {
69 auto *element = [QMacAccessibilityElement elementWithId:event->uniqueId()];
75 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, element);
78 case QAccessible::DescriptionChanged:
79 case QAccessible::NameChanged: {
80 auto *element = [QMacAccessibilityElement elementWithId:event->uniqueId()];
81 if (element == m_focusElement)
82 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, element);
85 case QAccessible::StateChanged:
86 case QAccessible::ValueChanged: {
87 auto *element = [QMacAccessibilityElement elementWithId:event->uniqueId()];
89 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, element);
92 case QAccessible::ObjectCreated:
93 case QAccessible::ObjectShow:
94 case QAccessible::ObjectHide:
95 case QAccessible::ObjectDestroyed:
96 invalidateCache(accessibleInterface);
97 switch (accessibleInterface->role()) {
98 case QAccessible::Window:
99 case QAccessible::Dialog:
101 UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);
105 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);