9#if QT_CONFIG(accessibility)
12#include "qioswindow.h"
13#include "quiaccessibilityelement.h"
15QT_NAMESPACE_ALIAS_OBJC_CLASS(QMacAccessibilityElement);
17QIOSPlatformAccessibility::QIOSPlatformAccessibility()
19 m_focusObserver = QMacNotificationObserver(
20 nil, UIAccessibilityElementFocusedNotification, [&](NSNotification *notification) {
21 id element = notification.userInfo[UIAccessibilityFocusedElementKey];
22 m_focusElement =
static_cast<QMacAccessibilityElement *>(element);
26QIOSPlatformAccessibility::~QIOSPlatformAccessibility()
30void invalidateCache(QAccessibleInterface *iface)
32 if (!iface || !iface->isValid()) {
33 qWarning() <<
"invalid accessible interface: " << iface;
40 foreach (QWindow *win, QGuiApplication::topLevelWindows()) {
41 if (win && win->handle()) {
42 QT_PREPEND_NAMESPACE(QIOSWindow) *window =
static_cast<QT_PREPEND_NAMESPACE(QIOSWindow) *>(win->handle());
43 window->clearAccessibleCache();
49void QIOSPlatformAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event)
51 auto *accessibleInterface = event->accessibleInterface();
52 if (!isActive() || !accessibleInterface)
54 switch (event->type()) {
55 case QAccessible::Announcement: {
56 auto *announcementEvent =
static_cast<QAccessibleAnnouncementEvent *>(event);
57 UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification,
58 announcementEvent->message().toNSString());
61 case QAccessible::Focus: {
62 auto *element = [QMacAccessibilityElement elementWithId:event->uniqueId()];
68 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, element);
71 case QAccessible::DescriptionChanged:
72 case QAccessible::NameChanged: {
73 auto *element = [QMacAccessibilityElement elementWithId:event->uniqueId()];
74 if (element == m_focusElement)
75 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, element);
78 case QAccessible::ObjectCreated:
79 case QAccessible::ObjectShow:
80 case QAccessible::ObjectHide:
81 case QAccessible::ObjectDestroyed:
82 invalidateCache(accessibleInterface);
83 switch (accessibleInterface->role()) {
84 case QAccessible::Window:
85 case QAccessible::Dialog:
87 UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);
91 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);