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 NVDA‑style compatibility layer for JAWS, so that BrailleSense users (and optionally keyboard users) can switch between NVDA and JAWS without retraining muscle memory.
This includes:
•
NVDA‑style navigation commands
•
NVDA‑style review cursor commands
•
NVDA‑style object navigation
•
NVDA‑style speech and info commands
•
NVDA‑style Braille input mappings for BrailleSense
•
Optional NVDA‑style 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 NVDA‑style 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 NVDA‑style 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