Browse Source

Implemented a11y focus on OSX.

ui-automation-test
Steven Kirk 6 years ago
parent
commit
0ab5e4dbfe
  1. 7
      native/Avalonia.Native/src/OSX/automation.mm
  2. 17
      native/Avalonia.Native/src/OSX/window.mm
  3. 5
      src/Avalonia.Native/AutomationNode.cs
  4. 1
      src/Avalonia.Native/AvnAutomationPeer.cs
  5. 2
      src/Avalonia.Native/avn.idl

7
native/Avalonia.Native/src/OSX/automation.mm

@ -36,7 +36,12 @@ public:
break; break;
} }
} }
virtual void FocusChanged(IAvnAutomationPeer* peer) override
{
// Only implemented in top-level nodes, i.e. AvnWindow.
}
virtual NSObject* GetNSAccessibility() override virtual NSObject* GetNSAccessibility() override
{ {
return _node; return _node;

17
native/Avalonia.Native/src/OSX/window.mm

@ -518,6 +518,11 @@ public:
{ {
} }
virtual void FocusChanged(IAvnAutomationPeer* peer) override
{
NSAccessibilityPostNotification(Window, NSAccessibilityFocusedUIElementChangedNotification);
}
protected: protected:
virtual NSWindowStyleMask GetStyle() virtual NSWindowStyleMask GetStyle()
{ {
@ -2301,6 +2306,18 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
return GetAccessibilityElement(hit); return GetAccessibilityElement(hit);
} }
- (id)accessibilityFocusedUIElement
{
auto peer = [self getAutomationPeer];
if (peer->IsRootProvider())
{
return GetAccessibilityElement(peer->RootProvider_GetFocus());
}
return [super accessibilityFocusedUIElement];
}
- (IAvnAutomationPeer* _Nonnull) getAutomationPeer - (IAvnAutomationPeer* _Nonnull) getAutomationPeer
{ {
if (_automationPeer == nullptr) if (_automationPeer == nullptr)

5
src/Avalonia.Native/AutomationNode.cs

@ -38,9 +38,6 @@ namespace Avalonia.Native
Native.PropertyChanged(p); Native.PropertyChanged(p);
} }
public void FocusChanged(AutomationPeer? focus) public void FocusChanged(AutomationPeer? focus) => Native.FocusChanged(AvnAutomationPeer.Wrap(focus));
{
// TODO
}
} }
} }

1
src/Avalonia.Native/AvnAutomationPeer.cs

@ -52,6 +52,7 @@ namespace Avalonia.Native
} }
public int IsRootProvider() => (_inner is IRootProvider).AsComBool(); public int IsRootProvider() => (_inner is IRootProvider).AsComBool();
public IAvnAutomationPeer? RootProvider_GetFocus() => Wrap(((IRootProvider)_inner).GetFocus());
public IAvnAutomationPeer? RootProvider_GetPeerFromPoint(AvnPoint point) public IAvnAutomationPeer? RootProvider_GetPeerFromPoint(AvnPoint point)
{ {

2
src/Avalonia.Native/avn.idl

@ -812,6 +812,7 @@ interface IAvnAutomationPeer : IUnknown
IAvnAutomationPeer* GetRootPeer(); IAvnAutomationPeer* GetRootPeer();
bool IsRootProvider(); bool IsRootProvider();
IAvnAutomationPeer* RootProvider_GetFocus();
IAvnAutomationPeer* RootProvider_GetPeerFromPoint(AvnPoint point); IAvnAutomationPeer* RootProvider_GetPeerFromPoint(AvnPoint point);
bool IsInvokeProvider(); bool IsInvokeProvider();
@ -844,4 +845,5 @@ interface IAvnAutomationNode : IUnknown
{ {
void ChildrenChanged(); void ChildrenChanged();
void PropertyChanged(AvnAutomationProperty property); void PropertyChanged(AvnAutomationProperty property);
void FocusChanged(IAvnAutomationPeer* peer);
} }

Loading…
Cancel
Save