diff --git a/examples/GUI/AccessibilityDemo.h b/examples/GUI/AccessibilityDemo.h index 45529e6693..d6fcc048b9 100644 --- a/examples/GUI/AccessibilityDemo.h +++ b/examples/GUI/AccessibilityDemo.h @@ -418,6 +418,7 @@ constexpr NameAndRole accessibilityRoles[] { "Ignored", AccessibilityRole::ignored }, { "Unspecified", AccessibilityRole::unspecified }, { "Button", AccessibilityRole::button }, + { "Toggle", AccessibilityRole::toggleButton }, { "ComboBox", AccessibilityRole::comboBox }, { "Slider", AccessibilityRole::slider }, { "Static Text", AccessibilityRole::staticText }, diff --git a/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp b/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp index 84df167a2b..53ae2a67f3 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp @@ -354,7 +354,8 @@ public: isSelected ? ACTION_CLEAR_SELECTION : ACTION_SELECT); } - if (accessibilityHandler.getActions().contains (AccessibilityActionType::press)) + if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().contains (AccessibilityActionType::toggle)) + || accessibilityHandler.getActions().contains (AccessibilityActionType::press)) { env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setClickable, @@ -480,7 +481,8 @@ public: case ACTION_CLICK: { - if (accessibilityHandler.getActions().invoke (AccessibilityActionType::press)) + if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().invoke (AccessibilityActionType::toggle)) + || accessibilityHandler.getActions().invoke (AccessibilityActionType::press)) { sendAccessibilityEventImpl (accessibilityHandler, TYPE_VIEW_CLICKED, 0); return true; diff --git a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm index 770bb78ecb..d22ef1c86f 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm @@ -403,7 +403,7 @@ private: // which element it thinks has focus and forward the event on to that element if it differs id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier); - if (! [(id) handler->getNativeImplementation() isEqual: focusedElement]) + if (focusedElement != nullptr && ! [(id) handler->getNativeImplementation() isEqual: focusedElement]) return [focusedElement accessibilityActivate]; if (handler->hasFocus (false)) diff --git a/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm b/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm index d2c226bfac..6e3bfafda9 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm @@ -797,7 +797,8 @@ private: continue; if (selector == @selector (accessibilityPerformPress)) - return handler->getActions().contains (AccessibilityActionType::press); + return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle)) + || handler->getActions().contains (AccessibilityActionType::press); if (selector == @selector (accessibilityPerformShowMenu)) return handler->getActions().contains (AccessibilityActionType::showMenu); diff --git a/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm b/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm index ff08d2f962..b188848fde 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm @@ -126,6 +126,10 @@ protected: static BOOL accessibilityPerformPress (id self, SEL) { + if (auto* handler = getHandler (self)) + if (handler->getCurrentState().isCheckable() && handler->getActions().invoke (AccessibilityActionType::toggle)) + return YES; + return performActionIfSupported (self, AccessibilityActionType::press); } diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp index 1de454272f..d00a4f3a93 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp @@ -189,8 +189,9 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn } case UIA_TogglePatternId: { - if (accessibilityHandler.getActions().contains (AccessibilityActionType::toggle) - && accessibilityHandler.getCurrentState().isCheckable()) + if (accessibilityHandler.getCurrentState().isCheckable() + && (accessibilityHandler.getActions().contains (AccessibilityActionType::toggle) + || accessibilityHandler.getActions().contains (AccessibilityActionType::press))) { return new UIAToggleProvider (this); } diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h index debc6d9839..df0a795d32 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h @@ -44,7 +44,8 @@ public: const auto& handler = getHandler(); - if (handler.getActions().invoke (AccessibilityActionType::toggle)) + if (handler.getActions().invoke (AccessibilityActionType::toggle) + || handler.getActions().invoke (AccessibilityActionType::press)) { VARIANT newValue; VariantHelpers::setInt (getCurrentToggleState(), &newValue);