Skip to content

Add accessibility keyboard navigation toggle (Tab/arrows/typeahead)#2001

Draft
ScottChesworth wants to merge 1 commit intoreaper-oss:masterfrom
ScottChesworth:addAccessibilityKeyboardNav
Draft

Add accessibility keyboard navigation toggle (Tab/arrows/typeahead)#2001
ScottChesworth wants to merge 1 commit intoreaper-oss:masterfrom
ScottChesworth:addAccessibilityKeyboardNav

Conversation

@ScottChesworth
Copy link
Contributor

In the Groove tool dialog (and most others), SWS passes keystrokes through to REAPER's main window. That makes sense for most folks who split their input between mouse and keyboard, but for screen reader users, it makes navigation in those dialogs difficult. This PR adds "Enabled deeper keyboard navigation in SWS dialogs (improves accessibility)" in the SWS Options menu. For now I've used the Groove tool dialog as proof of concept, hoping I can extend this wider if the approach I've taken is suitable.

Here are the changes to test in the Groove tool dialog once the new option has been enabled:

  • Tab and Shift+Tab work to navigate through controls
  • Arrows work to change radiobuttons
    • Typeahead works in the list box, making it quicker for users to jump to grooves they know the names of
    • Space clicks buttons when those have focus, plays/stops when focus is on any other type of control
    • Control+Z passes through when focus is in the list of grooves so users can apply, undo and retry

FYI I had help from Codex on this. Have been proofing its output best I can and user testing every step along the way. I'll be happy to round up other screen reader users for wider testing too. In particular I'm aware this is all Win32 specific right now and I don't know how SWELL will handle things on Mac. It's easy for me to reach VoiceOver users who can find out though.

For now, I'd like to get feedback before spending any more time on it. All thoughts welcome.

Comment on lines +569 to +572
GetClassName(focused, className, sizeof(className));
if (!strcmp(className, "ListBox"))
return false;
if (!strcmp(className, "Button"))
Copy link
Member

@cfillion cfillion Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is only available since REAPER ~6.12 (justinfrankel/WDL@a32de87). SWS supports down to 5.982.

EDIT: Need to double-check on a Mac but ListBox might be SysListView32_LB there? https://github.com/justinfrankel/WDL/blob/1fff3feb1114b576ee5387331e9f5457a72aa723/WDL/swell/swell-wnd.mm#L3845

On Windows there's WC_LISTBOX / WC_BUTTON for these strings.

Comment on lines +591 to +592
const bool ctrlDown = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
const bool altDown = (GetKeyState(VK_MENU) & 0x8000) != 0;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SWELL only has GetAsyncKeyState. BS_TYPEMASK, BS_CHECKBOX, BS_RADIOBUTTON and IsDialogMessage are only available on Windows.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants