9#if QT_CONFIG(accessibility)
12#include "qioswindow.h"
13#include "quiaccessibilityelement.h"
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;
38 foreach (QWindow *win, QGuiApplication::topLevelWindows()) {
39 if (win && win->handle()) {
40 QT_PREPEND_NAMESPACE(QIOSWindow) *window =
static_cast<QT_PREPEND_NAMESPACE(QIOSWindow) *>(win->handle());
41 window->clearAccessibleCache();
47void QIOSPlatformAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event)
49 auto *accessibleInterface = event->accessibleInterface();
50 if (!isActive() || !accessibleInterface)
52 switch (event->type()) {
53 case QAccessible::Announcement: {
54 auto *announcementEvent =
static_cast<QAccessibleAnnouncementEvent *>(event);
55 UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification,
56 announcementEvent->message().toNSString());
59 case QAccessible::Focus: {
60 auto *element = [QMacAccessibilityElement elementWithId:event->uniqueId()];
66 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, element);
69 case QAccessible::DescriptionChanged:
70 case QAccessible::NameChanged: {
71 auto *element = [QMacAccessibilityElement elementWithId:event->uniqueId()];
72 if (element == m_focusElement)
73 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, element);
76 case QAccessible::ObjectCreated:
77 case QAccessible::ObjectShow:
78 case QAccessible::ObjectHide:
79 case QAccessible::ObjectDestroyed:
80 invalidateCache(accessibleInterface);
81 switch (accessibleInterface->role()) {
82 case QAccessible::Window:
83 case QAccessible::Dialog:
85 UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);
89 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);