NVDA Hack Fest June 2008

The core developers (Mick and Jamie) met in person for the second NVDA hack fest from 22 to 26 June 2008.

The rough agenda and outcomes follow:

  • NVDA 0.6p2
    • There has been much progress since 0.6p1, so another preview release should be made.
    • code for 0.6p2 to be finalised by 11 Jul 2008
    • Translators have 2 weeks from then to update translations
    • Final release date is 25 Jul 2008
    • created 0.6p2 milestone and moved some tickets there
  • NVDA 0.6
    • Internet Explorer
      • Do we simply fix the current regressions or should we keep waiting until we can implement new IE support?
        • Fix small regressions if possible
        • If IE support is not done by the end of the year, it should not block 0.6
    • Adobe
      • Can we hack something together with the current IA backend?
        • No; experience has shown that there are too many disgrepancies in the various accessibility implementations.
        • This would be another project.
        • Should approach Adobe.
        • Should ask Adobe about ETA on IA2 support.
    • What other major features/issues still need to be addressed?
      • Current 0.6 tickets, plus need to file ticket for table support
  • Tables
    • Need to do table navigation in NVDAObjects
      • Propagate scripts to focus ancestors if not matched
      • Provide table navigation scripts on table cells
      • Support IA2's IAccessibleTable interface
    • Need to expose table info from virtualBufferLibrary
      • Add parent direction to VBufStorage_findBufferFieldIDByProperties
      • For table navigation operations, use this parent search to find table cell
      • Expose table's unique ID (table-id) and the cell's row and column on table cell nodes
      • Also expose column and row header names on table cell nodes
      • Expose row and column counts on table nodes
    • Should we do table navigation in TextInfos for documents?
      • Yes
      • Can't use TextInfo.move() because tables are 2 dimensional and move can only handle 1 dimension
      • Provide a TextInfo.navigateTablee(column, row, relative) method
      • TextInfo.getUnitIndex() should be able to retrieve the row and column index relative to the table
        • For virtual buffers, this will use the parent search discussed above
  • Formatting in TextInfos using XML
    • Formatting will just be additional attributes on tags
    • Can have tags with no role if they only represent changes in formatting
    • Formatting attributes will not have their own namespace
    • Font attributes: font_name, font_size, font_bold, font_italic, font_underline, font_subscript, font_superscript, font_strikethrough
    • Need to do spelling/grammar, paging, indentation, language
    • getXMLFieldSpeech() is going to need to handle these attributes
      • This may need to be a separate helper function
      • Still needs to use getSpeechTextForProperties so that they can be configured
    • TextInfos such as Microsoft Word, Wordpad, Scintilla, etc. need to support xml* properties for formatting
    • Virtual buffer library:
      • VBufStorage_addTagNodeToBuffer should not register the identifier if docHandle and ID are both 0; i.e. optional identifier
    • gecko_ia2 virtual buffer backend:
      • When handling a node, if it has more than one run of text attributes, then separate tag node needs to be created for each run of attributes
      • If only one run of text attributes, just put the text attributes on the tag node
      • Will expose text attributes as IAccessible2::textattribute_* as we do for object attributes
        • NVDA will then convert these into NVDA specific formatting attributes
  • GDI hooks
    • Testing
      • Testing shows that the current implementation shows a lot of promise
      • Some stability issues in Notepad++
    • Where is it appropriate to use them?
      • We want to attach in gainFocus of Window NVDAObject and detach in loseFocus
      • This allows any higher level object to use the GDI support as needed
    • Decide whether they are going into 0.6
      • We don't feel they are ready at this stage
      • They won't block 0.6, but can go in if they're ready when 0.6 is to be released
  • NVDAObjectHandler
    • Choosing the appropriate class via a global map
      • Reason for this is that we want access to more parameters when mapping and also more flexible matching; e.g. regular expressions
      • For example, mapping for .net window classes will be possible using regexps
      • Also allows users to do their own mapping without rebuilding
      • Map will be a block of Python code compiled into a function
      • Code will just be ifs and returns
      • This will be compiled into a code object and executed using exec
      • Each appModule can have a map
      • Global map will be associated with default appModule
    • Functions/callbacks for post init of NVDAObjects
      • Each NVDAObject can have a postInit function
      • event_NVDAObject_init will be renamed to event_NVDAObject_postInit, but will not handle class mapping; class mapping handled by the maps as described above
    • Perhaps move api.setFocusObject(), etc. into NVDAObjectHandler
  • Flexible key binding management
    • No change to the current file naming scheme
    • Keyboard map files will be ini files consisting of sections for each key binding context
      • [AppModule] will be key bindings for the current appModule
        • Should be able to refer to classes in an appModule with [AppModule.SubClass]
      • Other sections will be named based on class code path and will provide bindings for that class; e.g. [virtualBuffers.VirtualBuffer]
    • Bindings from these key maps will not be stored on individual classes, but will instead be stored on the appModule
  • Language detection and automatic voice change
    • Need to use a speech markup language; we will use SML
      • Synths that don't support SML will need to emulate this
    • getXMLFieldSpeech will output SML where appropriate to switch languages, etc.
  • Live regions
    • There are no specific events for live regions in IA2.
    • This means we have to listen for practically all events, including show, hide, text inserted, tet removed, etc. and instantiate objects to check whether they are live.
      • This is hideously slow out of process and causes unacceptable degradation in performance.
    • Only solution at present that offers acceptable performance is to write an in-process hook which handles updates to live regions and dispatches the changed text to NVDA.
  • Hierarchical documents and how to handle them
    • e.g. Thunderbird html view, Google Docs documents in Firefox, OpenOffice?
    • Decide whether to speak particular roles; e.g. paragraphs, cells, etc.
    • How to handle cursor navigation crossing object boundaries
      • Need to be able to find the document in the focus ancestry and only do this when in a document
      • Don't speak focus changes in documents
      • Cursor navigation (arrows, etc.):
        • Add isCurrentScript(script) to determine whether the script in question is the same as the currently running script
        • This will be used to determine whether to continue executing the current script if the focus changes during script execution
      • Say all
        • When we reach the end of a TextInfo, call getNextInFlow on the object to find the next object to read
        • Also pass the document as a limiting object to getNextInFlow
        • May need to set focus when updating cursor
  • Extended/custom roles and states
    • We will speak these, but they will (usually?) make no programmatic difference