NVDA weekly update (December 10 2008)

Many different things have been worked on in NVDA in the past week. Much of the work has been to improve the user experience, though a few bugs have been fixed as well.

Probably one of the most important things for this week is that we have finally been able to stop crashes in Firefox in Windows Vista while using NVDA. We have known about this problem for a rather long time, but have not ever been able to reproduce it ourselves. However, due to some unknown reason, my wife's computer suddenly started doing this, and although it was very annoying for her, it was great for me as I finally had a chance at investigating the bug.

It took me about 20 minutes to fix, after I was able to run Firefox on her computer with a debug build of our virtualBuffer library. In the end the bug was a coding error probably on my part, although it is extremely surprising that Firefox wasn't crashing on everyone's systems. It seems that some installs of Windows Vista are just that little bit more secure than others.

Technically the problem was that our virtualBuffer library was trying to deallocate some memory it really wasn't allowed to deallocate. Specifically it was trying to free a string literal in c++. Again, Although this is a pretty bad error on a programmer's part, it is strange how this hasn't caused many more problems.

This fix has stopped crashes with Firefox in Windows Vista, but we are still aware of a few other crashes.

As NVDA is always in rapid development, its structure can change quite a bit over time. This has started to be come an issue when users try to install a new copy of NVDA over the top of an old one. To try and fix some issues caused by this, I have now made the installer detect and uninstall any previous copy of NVDA first before installing the new copy. As this meant I was playing with a lot of complex installer code, I also spent some time cleaning up that code, hopefully making it a little more readable. I also changed the publisher on the installer to nvda-project.org, as before it was Michael Curran (which isn't very correct).

Michel Such provided a patch for the installer, which makes the temporary copy of NVDA started by the installer use the user's existing NVDA configuration file. This means that when installing a newer copy of NVDA, it will now read the installer with your choosen voice preferences etc.

Thanks to Simone Dal Maso and others, the NVDA Excel editor dialog now works with localized formulas. This means that just like when editing formulas in Excel with its own formula bar, you are able to read and write them in the language your computer is set to, rather than just English.

Jamie spent quite a large amount of time deep in NVDA's menu handling code. He originally started trying to solve one particular problem where NVDA does not announce the focus when exiting a context menu, but in the end he has completely refactored the code, making it much easier to understand, and has also made the following noticeable changes:

  • fix: Improved the detection of the focus when leaving context menus. Previously, NVDA often didn't react at all when leaving a context menu.
  • fix: NVDA now announces when the context menu is activated in the Start menu.
  • fix: The classic Start menu is now announced as Start menu instead of Application menu.

A small bug in NVDA's sayAll code has been fixed. This bug caused NVDA to play the error sound on a rare occasion where NVDA was performing a sayAll, but then it needed to speak something else. I certainly noticed this bug when reading a large document, and then pausing for a few minutes and going back to it.

When arrowing around web content in a virtualBuffer, NVDA always tries to scroll the object you are reading on to screen, so that sighted people can see what you are looking at, and of course so you can interact with it perhaps with the mouse. However, sometimes for some unknown reason, NVDA gets a little bit out of sync with the web browser and its possible you may move to some text that is representing an object that may not actually exist at this point in time. This was causing some issues where NVDA would throw some errors on particular pages, which was rather annoying to the user. Jamie has stopped these errors from being shown to the user, so the experience will be a bit nicer. Although we still are not sure if this is just hiding a much deeper underlying problem. But for now, this works.

When the selection in an edit field or document changes, NVDA detects this and speaks the change. However somtimes, such as in a select all, NVDA may see that the entire content has been selected, and try and speak all of it in one go. Aleksey and Jamie have worked on this problem (Ticket #249) and now NVDA only announces how many characters were selected rather than the actual content, if the number of characters is 512 or higher. A part from the fact that the user probably doesn't want to hear the entire document when they select it, this does stop some problems with some speech synthesizers that can not handle large amounts of text handed to them in one go.

Peter has fixed some issues with progress bars in software such as Nokia PC Suite which uses the QT toolkit.

Finally, Jamie has worked on the code that handles the reading of content in alerts and dialog boxes. Specifically users will notice that NVDA is much more successful in reading the text in its own installer (specifically the welcome page) and alerts in Firefox no longer cause a lot of pointless info to be spoken. The text announcement in Dialogs is still not as good as we'd like (some info can be repeated) but double speaking is always better than not speaking at all.

Comments

1. SteveLee -- 2008-12-10 08:11

I really love the honest "warts and all" description of your development adventures, thanks guys. It's a while since I did serious work in C++ (or any non garbage collected language) but your tale brings back memories of long debug session. Manual memory management must the source of a very large percentage of C++ errors (quickly followed by bad pointer derefs).

Have you tried using a replacement debugging freestore allocator (malloc, new etc) or is that part of your debug build? They can tell you so much though usually too slow to leave in the release build.