Browse Source

Implemented a11y focus on OSX.

ui-automation-test
Steven Kirk 5 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;
}
}
virtual void FocusChanged(IAvnAutomationPeer* peer) override
{
// Only implemented in top-level nodes, i.e. AvnWindow.
}
virtual NSObject* GetNSAccessibility() override
{
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:
virtual NSWindowStyleMask GetStyle()
{
@ -2301,6 +2306,18 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
return GetAccessibilityElement(hit);
}
- (id)accessibilityFocusedUIElement
{
auto peer = [self getAutomationPeer];
if (peer->IsRootProvider())
{
return GetAccessibilityElement(peer->RootProvider_GetFocus());
}
return [super accessibilityFocusedUIElement];
}
- (IAvnAutomationPeer* _Nonnull) getAutomationPeer
{
if (_automationPeer == nullptr)

5
src/Avalonia.Native/AutomationNode.cs

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

1
src/Avalonia.Native/AvnAutomationPeer.cs

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

2
src/Avalonia.Native/avn.idl

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

Loading…
Cancel
Save