This will explain the problem experienced by users of JAWS versions 8.0 and older when running the Windows Calculator and having SkypeWatch announce status changes.
Users of the Windows Calculator sometimes hear their Skype status announced continuously, once every five seconds, while the Calculator is in focus.
For this problem to occur, all of the following must be true:
The Windows Calculator scripts were first written many years ago,
probably before JAWS 3.70. A function called
StringCompare was included in the scripts starting in
JAWS 3.71 or so. In JAWS 6.10 or so, a StringCompare
function was added to JAWS itself. Unfortunately, the two
StringCompare functions do not work in the same manner.
When a background script like SkypeWatch calls
StringCompare, it expects the JAWS built-in function to
respond; but when the Windows Calculator is in focus, the Calculator
script version responds instead. The StringCompare
function is often used to determine if two strings are exactly equal.
The built-in StringCompare function returns 0 if they are
equal, whereas the Calculator scripts' version of
StringCompare return 1 in that case.
In layman's terms, this leaves us with something like the following
confusing situation: You're texting with a friend in Skype.
One day, a third party quietly replaces
your friend's JAWS dictionary file with one that changes "yes" to "no"
and vice versa, but neither of you are aware of this. Your friend asks
if you want to go out for a drink, and you say "yes," only your friend
hears "no" because of the dictionary change. Your friend then asks,
"Why not?" and you try to respond, "I said 'yes,'" but again the "yes"
becomes "no," so your friend hears, "I said 'no.'" The conversation
would get quite interesting from there, as I'm sure you can imagine!
This is very much like what's actually happening: SkypeWatch asks if
the last-announced status is the same as the current one, but the
Windows Calculator scripts return the opposite of the expected result,
so SkypeWatch understands that it must now announce the "new" status
to the user. The same thing happens again five seconds later when
SkypeWatch checks the current status again, etc.
This StringCompare problem can also affect any other set
of running scripts, including those in default.jss.
Older Skype script versions did not use StringCompare
because they, like the Calculator scripts, were initially written for
older JAWS versions that did not have that function available. (I
wrote my own equivalent at the time, called
olStringsEqual.) Starting in Skype script revision 618,
though,
I am using more built-in JAWS functions instead of home-brewed script
functions because this improves the speed of the scripts, sometimes by
quite a lot.
The quickest workaround, other than to use JAWS 9, is to disable the announcement of changes in your online status. To do this,
Unfortunately, the proper solution to this problem requires changes to the scripts for the Windows Calculator. Instructions for making the required changes manually appear below. As a nice exercise for budding programmers, I invite submissions of automated solutions to this problem, provided they are smart enough to work under at least JAWS 6.0 through 8.0 and to detect when they have nothing to do, such as when the user is running JAWS 9 or has already fixed the Calculator scripts. Anyone undertaking this exercise should be aware, though, that there are multiple script files involved, corresponding to different versions of the Windows Calculator for different versions of Windows.
To fix this problem yourself, do the following. Warning: Do this at your own risk. The risk is low, but a mistake could cause the Windows Calculator scripts to stop working correctly, rendering the Calculator itself difficult or impossible to use with JAWS.