Making screen reader accessible UI

Background

Supporting screen readers is an important function for UI in commercial apps. It’s far from the entire story for accessibility but an important base functionality for building an app that can be used by everyone.

Supporting screen readers can also be technically challenging. Ideally you would want your UI framework to have a level of built-in support, meaning all UI elements are discoverable by screen readers and provide some context about their default role.
Supporting screen readers also means making an app keyboard accessible. It’s already possible to patch this functionality into any vvvv app but again if a default keyboard solution was built into the UI library this would be better.

A stretch goal would be that a solution developed now has the potential to be cross-platform. (Given vvvv doesn’t have a cross-platform UI at all yet this is quite a stretch. )

This isn’t about making the vvvv editor accessible, this is about UI that can be used by end-users in exported and commercially distributed apps.

Status today

  • UI elements made with ImGui or Elementa are not discoverable by screen readers.
  • VL.CEF web content rendered in skia or stride is not discoverable by screen readers

Question

I may be able to put some effort into this topic in the next 12 months.

The question is

Where is the effort best invested to make screen reader accessible UI?

I see the following options

1. Add screen reader support to ImGui

Pros

  • ImGui is currently the easiest way to make a UI for vvvv and seems the most widely used. Supporting screen readers here will make it easy for future devvs to have at least default screen reader support in many apps.
  • Potentially easy for existing apps made with ImGui to be upgraded

Cons

  • ImGui not intended for making end-user UI. Although it doesn’t seem to stop people. In practice I see lots of published apps using ImGUI so I think it’s still useful to support screen readers here.
  • I could only add screen reader support for VL wrapping of ImGui, not able to contribute this to the original ImGui project.
  • ImGui not currently cross-platform.

2. Add screen reader support to Elementa

Pros

  • It’s the vvvv native UI solution

Cons

  • Not as developed as ImGui in terms of UI features
  • Elementa not currently cross-platform

Open Questions

  • I get the feeling Elementa is not widely used at the moment. For me I can say I haven’t used it in a while. I had some performance issues with Elementa and then ImGui came along and the performance and overall paradigm worked better for me. I haven’t had a usecase to return to Elementa yet.
    Are others working on/planning projects with Elementa?

3. Wrap for VL an existing cross platform UI framework that has accessibility features already like MAUI/Xamarin

Pros

  • Cross Platform!

Cons

  • Don’t even know where to start with this

Open Questions

  • Why hasn’t MAUI/Xamarin already been seen in VL? (Has it?) I’ve never tried, but I assume there’s some difficulty here given that MAUI/Xamarin is a default option Microsoft offers for UI but not a default option offered in the vvvv world. Can anyone provide more info?

4. Provide ‘low level’ screen reader support with examples and leave it up to coders to implement custom in every project

Pros

  • Less effort to develop the framework
  • Probably have to do this anyway for the above solutions, may as well provide the low level implementation for coders who make completely custom UIs.

Cons

  • Without integration into a standard UI framework then only apps that take special effort to support screen readers will have any support at all.

5. Embedded Browser-based UI solution

Pros

  • Already lots of accessibility solutions and information for web UI
  • Could integrate rabbit-control which also easily enables UI to be run in a remote brower.

Cons

  • CEF being cross platform in future relies on underlying binding CEFglue being crossplatform, currently supports MacOS but not Linux.
  • I see less possibilities to really make a node based solution for patching a UI like this, you probably have to get your hands dirty with html. (Although nodes to HTML is something that you could use Cables.gl for)

Open Questions

  • Any idea how to get the CEF content in stride or skia windows discoverable by screen readers?
  • Is it possible to run a transparent chromium UI on top of a Skia or Stride app with decent performance?
  • I think there are already some difficulties communicating between embedded chromium dynamic javascript things and the host app. Anyone know if these issues are showstoppers?

Generally open question @Devvvvs is there a plan for a cross-platform UI framework you wish to support in future e.g. for export to windows and linux?

@Everyone I’m also completely open to other ideas, have you heard of other frameworks etc?

3 Likes

being completely ignorant of the topic… can you provide some pointers as to what it means to support this? are there generic (or probably os specific?) libraries/apis available to implement?

some thoughts:

  • “ImGui not intended for making end-user UI” - i think the way to read this is: on end-user-facing UIs you’ll likely run into restrictions using ImGui and you should then not complain about that fact. but if you just don’t see any restrictions, it is a perfectly good choice.
  • ImGui/Elementa not currently cross-platform. well,… they actually are, it is just that vvvv doesn’t provide an out-of the box way to open a corresponding rendering window on other platforms at this point
  • without knowing anything, option 4. is the way i’d intuitively favor. it seems to be the quickest way to get something working… and then take it from there.
  • re options 5: you’re saying you have a website that works with a screen reader, but when viewing it through VL.CEF it doesn’t work?

Afaik assistive technologies like screen readers rely on the DOM but VL.CEF renders offscreen on a canvas which is just a bunch of pixels.
I think this might be a problem with all mentioned technologies in the context of vvvv.

Edit:

accessibility / integration with assistive technologies has luckily become a major topic in ui/ux in the last decade so much that it will be enforced by an EU directive beginning next summer. meaning, if one creates something either directly for institutions of the EU, something for a officials or governmental institutions or want to get funding from the EU, the product has to fullfill a couple of accessibility standards.

all major OSes have built in tools already (windows: narrator, android: TalkBack, apple VoiceOver) so most lectures on (web)ui design/development include a session to try those oneselves. e.g. turn off monitor, try search for something on wikipedia or even try to order something on amazon with keyboard and voiceover only.

as summarized by the first comment in the following imgui issue basic things required are

  • navigation with keyboard especially Tab
  • api for assistive technology to access the gui as tree
  • api to intercept / fire ui events
  1. ImGui
    see this discussion Focus navigation and other features for accessibility? · Issue #4122 · ocornut/imgui · GitHub
    especially the part about focus event interception.
  2. MAUI mostly implement native accessibility apis.
  3. windows/.NET provide this low-level api
    System.Windows.Automation Namespace | Microsoft Learn
3 Likes

Thanks everyone for your thoughts.

VL.CEF

I can confirm that currently VL.CEF does not present any elements to a screen reader in either stride or skia windows.

Checking if screen readers can discover a UI with a screen reader

  • To perform a basic test of screen reader compatibility yourself download NVDA here
  • Install and start NVDA. Right click on the NVDA icon in the system tray and go to settings
  • In settings go to Vision and enable highlighting with all the options on.
  • Go to a website in your browswer like vvvv.org
  • Press tab a few times and notice how you move between interactive elements and NVDA reads them out
  • Now open up equivalent vvvv windows and test them.

Complete accessibilty testing is a lot more involved but that should give a basic idea if a common screen reader can at least discover the UI elements.

Checking accessibility on a techincal level

  • Download the Windows Accessibility insights tool (windows version) and it can inspect windows apps.
  • Compare the accessibility of apps that use windows native controls like 7zip or filezilla to a vvvv window (even the gamma launcher)

Libraries and APIs

In terms of how accessibility technology discovers UI on a technical level I found this series of deep dive articles by Neill Hadder. They are also quite funny

Interesting quote from these articles

As in 1995, accessibility continues to rely for the most part on developers’ use of standard operating system components.

Through those articles discovered what seems to be an attempt at cross-platform access API

Wishlist

From the discussion so far here’s my feeling on what to try

  1. Look into a possibility of a quick win with VL.CEF. Maybe as simple as some init setting to enable accessibility? Looking for github issues etc seems a bit inconclusive if CEF has this possibility or not.
  2. Check out MAUI and effort needed to really wrap it for VL as nicely as say ImGui is now. If that effort could get us a whole new UI library and that library has accessibility by default, then it seems like a good use of effort.
  3. If it’s too complex then look into Tolk (thanks @bjoern) or AccessKit as a ‘low level’ solution that patchers can add to their apps. Then demo how to add accessibility this way to an ImGui app.

Hopefully I can use some time to work this after August. If anyone else wants to get on board more than welcome.

We are using VL.IO.RCP for a web based UI, which you can use with IBM’s Carbon Design System. It is a very well worked out Design System and is very accessible.

What I am more curious about though is what kind of UI’s you are thinking about. Most of the UIs I see made with ImGui are controlling parameters or sometimes for things like settings.

As a UX Designer myself I would be curious what you are intending to use this for and I think you’d have to do some research with some real people using Screen Readers to find out what their needs are around what you are building. I am all for accessibility, but just making sure a UI is screen-reader compatible is only half the story. What are you trying to solve that people using a screen reader are struggling with?

1 Like

@Seltzdesign
Good to know about RCP + Carbon.

This isn’t a specific app yet. Just a first step ensuring the baseline discoverability for a screen reader can be achieved in vvvv.

Personally I want to ensure that vvvv is the right tool for the job in future as accessibility becomes non-optional.

I don’t go as far as to say that screen reader accessibility is the right or wrong accessibility approach for any specific project.

‘just making sure a UI is screen-reader compatible is only half the story.’

I couldn’t agree more, I basically said the same thing as the second sentence of my original post.

2 Likes

This looks quite interesting, does it make styling and positioning RCP widgets easier or do you have to get heavily into java scripting?

Sure, if you want to use the actual features of Carbon Design System like layout, colors, etc. than it’s probably lots of java scripting.

If you want to just replace the normal RCP TS Client UI elements with the ones from Carbon than it is pretty straight forward. But then you will have pretty automatic layout in 1 column, which is basically just good for mobile.

1 Like

Small update:

I tested the CEF Sample application and it works with NVDA screen reader on windows 11.

CEF release version

07/18/2024 - 126.2.18+g3647d39+chromium-126.0.6478.183