The core developers (Michael Curran and I, James Teh) met face to face on the weekend of 22-23 October 2007 for what we are calling an "NVDA Summit" or hack fest. This was made possible thanks to many generous donations to NV Access. Aside from the points of discussion below, we were able to revitalise our working relationship and I was able to familiarise myself with certain complex parts of the code after being "out of the loop" for a while.

Following are the main topics and outcomes of discussion.

Review of focus management/announcement code

Calling api.setFocusObject, and calling gain focus events should be a bit more conditional, rather than only the announcement being conditional. Currently there are cases where an object is silenced from announcing its focus, but focus is still set (example: vista windows explorer where focus jumps to the explorer pane after focusing on the command module toolbar).

Outcome

Focus and foreground windows are now handled much better by the new focus ancestor code, which Mick began to implement before the weekend. We discussed further implementation and even wrote some code! :)

Better algorithm for detecting groupboxes on the same logical level

The best thing would be if all developers made group boxes a parent of objects inside the box. But there are a lot of common windows dialogs that have the group boxes on the same level. We can either force the group box as the parent, or we can add special code to eventHandler etc, to announce entering in to these same-level group boxes. Previously NVDA had a groupName property which gave the group box name. It was costly, and it was always spoken on any object in the box.

Outcome

After gathering focus ancestors in IAccessibleHandler:

  1. Search down the ancestor chain for window with WS_GROUP
  2. if so, scan backwards through windows for nearest with class button and BS_GROUPBOX
  3. insert into chain above current ancestor
  4. break

Rules for when to speak name, text (can be sometimes redundent)

Links in Firefox3 have the link text as the name, and as the IAccessibleText. Also this happens in Open Office with Java Access Bridge, where some lists contain list items, o menus contain menu items, where the name and text are the same. We need to work out good logic about when we will actually use a text interface, its not enough to just use it if its there.

Outcome

if name == text, speak name only

Review roles that should be silenced on focus

We should perhaps work out which roles should be not spoken when given focus, currently list item, tree view item, possibly paragraph...

Outcome

  • silence paragraph and cell
  • need to review list of roles

Flag set when in a cursor movement script to better handle focus announcement

When the focus changes due to the caret moving to another object, in a line/word/character movement script, we should really only speak the new role and description etc, but not the name or text, as the movement script will read the text anyway. Example: open office documents, Lotus Symphony documents.

Outcome

deferred

Improve hash algorithm, used to check if two objects are equal or not

This should be very efficient, should decide on exactly what properties are good to use in the hash, should we use IAccIdentity, IAccessible2's uniqueID, MSAA gecko object addresses ...

Outcome

  • Decided to scrap hash algorithm altogether
  • Overriding equality/inequality operators instead
    • More efficient, as we only have to examine enough properties to make a determination
    • Conversely, hash method requires hashing all properties and then comparing the hashes
  • For IAccessible/IA2,If IAccIdentity/uniqueID are equal, objects are equal; don't need to check anything else

How do we support extended roles and extended states

In IAccessible2, developers can specify a custom role string for objects that supplements the IA2 role constant. Should NVDA announce the custom role, if so when should we announce etc. Extended states are the same idea, should we announce them, we would have to compare them in state changes etc.

Outcome

  • ignore extended role for now
  • investigate use of extended states so far
  • extended states will be a separate text property, probably named customStates

Initial talks about live regions

will we support them? how should the user experience be?

Outcome

  • Jamie to read live regions spec
  • implement support for log role; i.e. read all new text according to live region setting
  • determine use cases for other uses of live regions and discuss standardisation of new roles which clearly define how and what information should be spoken
  • Examine our roles. Can we come up with use cases ourselves?

How should we support relations

should we pop up a dialog listing them etc, should we mention them at all? currently memberOf, controlerFor, controldBy, labelFor, labeledBy, description for, describedBy. Possibly others to do with network graphs and other fun

Outcome

  • when speaking entire dialog, ignore objects marked as label for and description for
  • don't care about member of
  • need to communicate that we need separate standard relations which have speecific programatic meaning and custom relations which are present for user specific applications and are handled in a generic manner
  • will probably handle custom relations as virtual pages with headings for each relation type and links to each item

How should we convey actions to the user

e.g. select, click, etc. IA2 can tell you what actions you can perform on an object

Outcome

allow user to bring up a list of actions which can be chosen

Read word/object under mouse and audio coordinates

any improvements to be made? what should be default setting? Should we support character, line etc? currently only does word.

Outcome

  • consider three modes: line, word, character
  • user must switch between modes, possibly with shortcut key
  • no automatic switching

Important: fix debug.writeException bug in compiled NVDA

Currently, often not getting any meaningful info back from users' debug log

Outcome

  • Seems to be an issue in py2exe 0.6.5 with tracebacks where the source can't be retrieved
  • Need to use py2exe 0.6.6

Idea about caret events actually speaking movement, scripts only set a flag rather than speaking themselves

Initial tests show its very slow in dos windows etc. Very accurate though.

Outcome

  • Jamie to reimplement waitForCaretMovement code using same technique as in old patch
  • backspace and delete should not speak if timeout exceeded, but cursor keys should read on timeout

Redesign config system

Outcome

  • implement a system similar to Mozilla?
    • Probably still a single config file
    • Options have names in the form foo.bar.bas and are retrieved and manipulated by this name
  • Options are registered; can be registered anywhere (core, appModules, NVDAObjects, synthDrivers, etc.)
  • Options have types: integer, boolean and string
  • Options can have defaults
  • Should options be saved if not changed from defaults?
  • If an option is present when config file loaded but never registered before saving, just save as is

Talk about formatting and fields

xml used for representation in virtual buffers, xml always relative to the document root. For text formatting else where, should we use the xml? should we use formatting commands.

Outcome

  • Jamie to investigate old system and xml system
  • probably use xml for everything, transition to eventually abandon old system
  • need to look at having stacks per object rather than a global one

Review plans for braille so far

Outcome

  • base braille module which includes Region, SlidingWindow, etc.
  • braille drivers: brltty will be a braille driver
  • investigate using some sort of standard charset or bit vectors to communicate dots to all braille drivers
  • liblouis for translation
  • all braille drivers will handle their own keyboard input, translating to defined NVDA key names
  • braille keys fed into NVDA via a function in main braille module which queues them