Last Week in NVDA

I forgot to mention in the last update that Mick changed the way NVDA loads and unloads appModules. NVDA now associates appModules with process IDs, rather than window handles. This makes more sense, as an application is generally a single process. This change means that NVDA no longer needs to search for the main window of an application. Also, it is much more accurate in loading and unloading appModules at the appropriate times. For example, the NVDA appModule is now only loaded once instead of every time the NVDA menu is activated.

Last week, I continued work on implementing braille display support. It's coming along steadily, but there's still a lot to be done. In last week's report, I mentioned a crash in the Windows version of brltty/brlapi. This issue was causing NVDA to lock up intermittently after pressing a key on the braille display. I implemented a temporary work around for this in NVDA which should prevent most of these lock ups, although it still needs to be fixed properly in brltty. I also disabled assertion errors from wx for now, as there is a bug in wx which causes spurious assertion errors to be raised regarding timers under certain circumstances. I improved braille configuration a little, including the addition of a configuration option for the cursor blink rate, although this isn't available in the Braille Settings dialog yet. The display of controls has now been improved so that they now include value, states, description, etc., although this code needs quite a bit more work.

Meanwhile, Mick finished his work on the storage component of the virtual buffer library; i.e. the portion responsible for maintaining the text of the document and answering requests for text in a flat representation. The storage component is now fully object oriented and all of the classes and methods are documented, which will make working with this code much easier for both ourselves and other developers in the future. The Mozilla Gecko back-end still needs to be updated to work with the new storage component.

After Mick finished working on the storage component, he began to consider the mechanism we use for inter-process communication (IPC); i.e. communicating queries and data between different processes. Currently, we use a mix of window messages and reading and writing from remote process memory, which is tedious to code and requires a lot of code duplication. These mechanisms are specific to Windows, which means that the virtual buffer library cannot be used on another operating system. Also, the virtual buffer library and NVDA's other in-process component (NVDAHelper) use completely different code for IPC. We are now considering a mechanism called remote procedure call (RPC), which is designed to handle execution of functions in remote processes and transparently handles the transfer of necessary data between processes. Thus, it is much simpler to code and probably quite well suited to these tasks. NVDAHelper could be responsible for all IPC. NVDAHelper could inject the virtual buffer library into a remote process and set up RPC, thus removing all IPC code from the virtual buffer library and making it mostly platform independent. We also want to use RPC to enable applications to trigger events in NVDA, allowing applications which cannot provide information in other ways to communicate directly with NVDA. This is similar to the external APIs provided by some commercial screen readers, although it is potentially more powerful and flexible. Mick has begun work on a basic RPC implementation, which is looking promising so far.

Aside from these bigger endeavours, there have of course been other smaller changes to the main NVDA code. I made quite a few cosmetic fixes; e.g. fixing spelling errors in method names. Mick fixed a bug in the sapi4activeVoice synthesiser driver which was causing say all to fail. He fixed an issue in say all regarding bookmark values which may have caused certain synthesisers to crash. Mick also fixed a bug whereby no text was being read when reading with the mouse in Mozilla Gecko edit fields. I added events for virtual buffers which indicate when a user moves into or out of a virtual buffer. Aside from allowing for more logical coding of some existing functionality, these events are necessary for braille and may allow for other functionality in future. I also fixed an issue which meant that caret events were not being triggered on the focus object before the first focus change after NVDA was started. This meant that if you were focused on a Windows standard edit control when NVDA was started, text selection changes would not be spoken until the focus had changed at least once.

Comments

No comments.