Request for feedback: NVDA‑style compatibility layer for JAWS (BrailleSense + keyboard mappings)

5 views
Skip to first unread message

jco...@samobile.net

unread,
Dec 18, 2025, 6:29:08 PM (21 hours ago) Dec 18
to nvda-...@nvaccess.org

Hi all,

I’m working on a project that may interest folks who use both NVDA and JAWS, especially those who support users transitioning between the two. My goal is to build a full NVDAstyle compatibility layer for JAWS, so that BrailleSense users (and optionally keyboard users) can switch between NVDA and JAWS without retraining muscle memory.

This includes:

NVDAstyle navigation commands

NVDAstyle review cursor commands

NVDAstyle object navigation

NVDAstyle speech and info commands

NVDAstyle Braille input mappings for BrailleSense

Optional NVDAstyle keyboard mappings

A Braille chord inspector to help identify the correct JAWS chord names

I’m sharing the scripts and keymaps below and would really appreciate feedback from anyone familiar with both NVDA and JAWS scripting—especially around edge cases, review cursor behavior, and whether any NVDA semantics should be mirrored more closely.

1. Main script file: NVDACompat.jss

Code

; NVDA Compatibility Layer for JAWS

; Purpose: Emulate common NVDA commands in JAWS

 

Include "hjconst.jsh"

Include "common.jsh"

 

; ========== Utility ==========

 

Script NVDACompatToggleOnOff ()

    If GetUserVariableInt ("NVDACompatEnabled") == 0 Then

        SetUserVariableInt ("NVDACompatEnabled", 1)

        SayString ("NVDA compatibility layer on")

    Else

        SetUserVariableInt ("NVDACompatEnabled", 0)

        SayString ("NVDA compatibility layer off")

    EndIf

EndScript

 

Boolean Function NVDACompatEnabled ()

    If GetUserVariableInt ("NVDACompatEnabled") == 0 Then

        Return False

    Else

        Return True

    EndIf

EndFunction

 

Void Function NVDACompatSendKey (string sKey)

    If NVDACompatEnabled () Then

        JAWSSendKey (sKey)

    EndIf

EndFunction

 

; ========== Focus navigation ==========

 

Script NVDAUp ()           NVDACompatSendKey ("Up") EndScript

Script NVDADown ()         NVDACompatSendKey ("Down") EndScript

Script NVDALeft ()         NVDACompatSendKey ("Left") EndScript

Script NVDARight ()        NVDACompatSendKey ("Right") EndScript

Script NVDAHome ()         NVDACompatSendKey ("Home") EndScript

Script NVDAEnd ()          NVDACompatSendKey ("End") EndScript

Script NVDAPageUp ()       NVDACompatSendKey ("PageUp") EndScript

Script NVDAPageDown ()     NVDACompatSendKey ("PageDown") EndScript

Script NVDAControlHome ()  NVDACompatSendKey ("Control+Home") EndScript

Script NVDAControlEnd ()   NVDACompatSendKey ("Control+End") EndScript

Script NVDACtrlLeft ()     NVDACompatSendKey ("Control+LeftArrow") EndScript

Script NVDACtrlRight ()    NVDACompatSendKey ("Control+RightArrow") EndScript

 

; ========== System interaction ==========

 

Script NVDATab ()          NVDACompatSendKey ("Tab") EndScript

Script NVDAShiftTab ()     NVDACompatSendKey ("Shift+Tab") EndScript

Script NVDAEnter ()        NVDACompatSendKey ("Enter") EndScript

Script NVDAEscape ()       NVDACompatSendKey ("Escape") EndScript

Script NVDABackspace ()    NVDACompatSendKey ("Backspace") EndScript

Script NVDAContextMenu ()  NVDACompatSendKey ("Applications") EndScript

Script NVDAAltF4 ()        NVDACompatSendKey ("Alt+F4") EndScript

 

; ========== Speech and reading ==========

 

Script NVDASayAll ()           PerformScript SayAll () EndScript

Script NVDAToggleSpeech ()

    If GetSpeechOn () Then

        SpeechOff ()

        SayString ("Speech off")

    Else

        SpeechOn ()

        SayString ("Speech on")

    EndIf

EndScript

 

Script NVDASayCurrentLine ()      PerformScript SayLine () EndScript

Script NVDASayCurrentWord ()      PerformScript SayWord () EndScript

Script NVDASayCurrentCharacter () PerformScript SayCharacter () EndScript

Script NVDASayWindowTitle ()      PerformScript SayWindowTitle () EndScript

Script NVDASayStatusBar ()        PerformScript SayStatusLine () EndScript

Script NVDASayDateTime ()         PerformScript SayDateTime () EndScript

 

; ========== Help and info ==========

 

Script NVDAKeyboardHelp ()        PerformScript KeyboardHelp () EndScript

Script NVDASayFocus ()            PerformScript SayCurrentFocus () EndScript

Script NVDASayReview ()           PerformScript SayLineAtCaret () EndScript

Script NVDASayNavigatorObject ()  PerformScript DescribeWindow () EndScript

 

; ========== Review cursor navigation ==========

 

Script NVDAReviewPrevLine ()  PerformScript PreviousLine () EndScript

Script NVDAReviewNextLine ()  PerformScript NextLine () EndScript

Script NVDAReviewPrevWord ()  PerformScript PreviousWord () EndScript

Script NVDAReviewNextWord ()  PerformScript NextWord () EndScript

Script NVDAReviewPrevChar ()  PerformScript PreviousCharacter () EndScript

Script NVDAReviewNextChar ()  PerformScript NextCharacter () EndScript

Script NVDAReviewTop ()       PerformScript TopOfFile () EndScript

Script NVDAReviewBottom ()    PerformScript BottomOfFile () EndScript

 

; ========== Object navigation ==========

 

Script NVDANextObject ()          PerformScript NextObject () EndScript

Script NVDAPrevObject ()          PerformScript PriorObject () EndScript

Script NVDASParentObject ()       PerformScript ParentObject () EndScript

Script NVDANavigateToFocus ()     PerformScript RouteToPcCursor () EndScript

Script NVDAActivateCurrentObject () PerformScript PCursor () EndScript

2. BrailleSense NVDAstyle keymap (BrailleSenseNVDA.jkm)

These chord names are placeholders until I finish mapping the actual identifiers using the inspector script below.

Code

; BrailleSense NVDA-style keymap for JAWS

 

; Navigation

BrailleChord-1=NVDAUp

BrailleChord-4=NVDADown

BrailleChord-3=NVDALeft

BrailleChord-6=NVDARight

 

; Word navigation

BrailleChord-13=NVDACtrlLeft

BrailleChord-46=NVDACtrlRight

 

; Page / top / bottom

BrailleChord-12=NVDAControlHome

BrailleChord-45=NVDAControlEnd

BrailleChord-25=NVDAPageUp

BrailleChord-56=NVDAPageDown

 

; System

BrailleChord-2=NVDATab

BrailleChord-23=NVDAShiftTab

BrailleChord-48=NVDAEnter

BrailleChord-15=NVDAEscape

BrailleChord-7=NVDABackspace

 

; Speech / info

BrailleChord-G=NVDASayAll

BrailleChord-M=NVDAToggleSpeech

BrailleChord-L=NVDASayCurrentLine

BrailleChord-W=NVDASayCurrentWord

BrailleChord-C=NVDASayCurrentCharacter

BrailleChord-T=NVDASayWindowTitle

BrailleChord-S=NVDASayStatusBar

BrailleChord-D=NVDASayDateTime

 

; Help

BrailleChord-K=NVDAKeyboardHelp

 

; Review

BrailleChord-12R=NVDAReviewPrevLine

BrailleChord-45R=NVDAReviewNextLine

BrailleChord-13R=NVDAReviewPrevWord

BrailleChord-46R=NVDAReviewNextWord

BrailleChord-23R=NVDAReviewPrevChar

BrailleChord-56R=NVDAReviewNextChar

 

; Object nav

BrailleChord-O1=NVDAPrevObject

BrailleChord-O4=NVDANextObject

BrailleChord-O25=NVDASParentObject

BrailleChord-O36=NVDAActivateCurrentObject

 

; Toggle layer

BrailleChord-8=NVDACompatToggleOnOff

3. Braille chord inspector (BrailleKeyInspector)

This helps identify the actual chord names JAWS reports for each BrailleSense gesture.

Code

Script BrailleKeyInspector ()

    var string sInput

    sInput = GetLastScriptKey ()

    If StringLength (sInput) > 0 Then

        SayString ("Braille input: ")

        SayString (sInput)

    Else

        SayString ("No braille input information available.")

    EndIf

EndScript

4. Optional NVDAstyle keyboard mappings (KeyboardNVDA.jkm)

Code

Insert+DownArrow=NVDASayAll

Insert+S=NVDAToggleSpeech

Insert+Tab=NVDASayFocus

Insert+T=NVDASayWindowTitle

Insert+End=NVDASayStatusBar

Insert+1=NVDAKeyboardHelp

 

Insert+UpArrow=NVDASayCurrentLine

Insert+LeftArrow=NVDASayCurrentWord

Insert+NumPad5=NVDASayReview

 

Insert+PageUp=NVDAReviewPrevLine

Insert+PageDown=NVDAReviewNextLine

 

Insert+N=NVDANavigateToFocus

Insert+Enter=NVDAActivateCurrentObject

 

Insert+NumPad6=NVDANextObject

Insert+NumPad4=NVDAPrevObject

Insert+NumPad8=NVDASParentObject

Insert+NumPadEnter=NVDAActivateCurrentObject

Request for feedback

I’d love input from anyone who:

Has experience scripting for both NVDA and JAWS

Knows the nuances of NVDA’s review cursor and object navigation

Has worked with BrailleSense or other Braille displays across both screen readers

Sees any mismatches between NVDA semantics and the JAWS equivalents I’m calling

Has suggestions for improving the toggle layer or making the mappings more intuitive

My goal is to make this as seamless and predictable as possible for users who regularly switch between NVDA and JAWS.

Thanks in advance for any insights or corrections. I’m happy to share the finished package once it’s stable.

—Justin

Reply all
Reply to author
Forward
0 new messages