Skip to content

Commit

Permalink
Move all files into trunk to allow for branching, tagging, etc. in th…
Browse files Browse the repository at this point in the history
…e future.
  • Loading branch information
jamie committed Aug 14, 2006
0 parents commit 6b4eb90
Show file tree
Hide file tree
Showing 35 changed files with 7,104 additions and 0 deletions.
235 changes: 235 additions & 0 deletions changelog.txt

Large diffs are not rendered by default.

340 changes: 340 additions & 0 deletions copying.txt

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions dependencies.txt
@@ -0,0 +1,8 @@
python 2.4
http://www.python.org/
pywin32-208
pyAA 2.2
pyHook 1.4
pyTTS 3.0


27 changes: 27 additions & 0 deletions key commands.txt
@@ -0,0 +1,27 @@
Key assignments

General
Quit NVDA: insert+q
NVDA menu: insert+n (not complete yet)

Text navigation with in current window (moving only moves the navigator, not the cursor)
current line: numpad8
previous line: numpad7
next line: numpad9
current character: numpad2
previous character: numpad1
next character: numpad3

Object navigation (moving only moves the navigator, not the focus)
read currentObject: insert+numpad5
move to and read previous object: insert+numpad4
move to and read next object: insert+numpad6
move to and read parent object: insert+numpad8
move to and read first child object: insert+numpad2
move to and read left object: insert+shift+numpad4
move to and read right object: insert+shift+numpad6
move to and read up object: insert+shift+numpad8
move to and read down object: insert+shift+numpad2
Do object default action: insert+numpadReturn
Read current object and decendants: insert+numpadPlus
read current object and ansesters: insert+shift+numpadPlus
40 changes: 40 additions & 0 deletions readme.txt
@@ -0,0 +1,40 @@
Nonvisual Desktop Access (NVDA)
Access to Windows through free, open source, and nonvisual means.

Created by Michael Curran and James Teh.

Introduction

NVDA was started because of a lack of affordable, or free, Windows access solutions for blind and vision impaired users. Currently people can be paying up to $2000 to use a Windows screen reader, yet on other platforms such as Linux, screen readers are already existing that are free.

NVDA is so far written entirely in the Python programming language, which is itself a free language, and is very quick to learn. Because Python can be also looked at as a scripting language, this also allows NVDA to be added to, and changed to suit user specific needs very easily.

All source code is included with NVDA, and anyone is free to change it to suit their own needs.

NVDA works pretty much like any screen reader you would be used to. Its main features are:
*Uses MSAA to find out a control's name, role, state, value, description, help and index.
*Uses the windows API to be able to read characters, selection and full text, of windows such as edit fields.
*Responds to many MSAA events such as focus change, active item change, object creation, object destruction etc, and also when ever any of a control's MSAA attributes change.
*Responds to key press events.
*Is modular-based (synth drivers and support for specific applications can be written as modules).
*Has the ability to navigate the MSAA object tree with out moving the focus.

Running NVDA

As long as you have installed all dependency packages (python, pyAA, pyTTS, pyHook etc) you should be able to simply press enter on core.pyw in the source directory.
Or in a cmd prompt, move to the source directory and execute core.py.

NVDA is covered by the GNU General Public Licence. More details can be found in the file COPYING in this directory.

Please send bugs and suggestions to:
mick@kulgan.net

NVDA website:
http://www.kulgan.net/nvda/

We are always looking for testers, and we are always needing people who are interested in writing support for various applications.

If interested, please email
Michael Curran <mick@kulgan.net>


77 changes: 77 additions & 0 deletions source/MSAAEventHandler.py
@@ -0,0 +1,77 @@
#MSAAEventHandler.py
#A part of NonVisual Desktop Access (NVDA)
#Copyright (C) 2006 Michael Curran <mick@kulgan.net>
#This file is covered by the GNU General Public License.
#See the file COPYING for more details.

import Queue
import pyAA
import debug
from api import *

lastProcessID=None
queue_events=Queue.Queue(10000)
objectEventHandle=None

eventMap={
pyAA.Constants.EVENT_SYSTEM_FOREGROUND:"foreground",
pyAA.Constants.EVENT_MAX:"maximize",
pyAA.Constants.EVENT_MIN:"minimize",
pyAA.Constants.EVENT_SYSTEM_MENUSTART:"menuStart",
pyAA.Constants.EVENT_SYSTEM_MENUEND:"menuEnd",
pyAA.Constants.EVENT_SYSTEM_MENUPOPUPSTART:"menuStart",
pyAA.Constants.EVENT_SYSTEM_MENUPOPUPEND:"menuEnd",
pyAA.Constants.EVENT_SYSTEM_SWITCHSTART:"switchStart",
pyAA.Constants.EVENT_SYSTEM_SWITCHEND:"switchEnd",
pyAA.Constants.EVENT_OBJECT_CREATE:"createObject",
pyAA.Constants.EVENT_OBJECT_DESTROY:"destroyObject",
pyAA.Constants.EVENT_OBJECT_FOCUS:"focusObject",
pyAA.Constants.EVENT_OBJECT_HIDE:"hideObject",
pyAA.Constants.EVENT_OBJECT_SHOW:"showObject",
pyAA.Constants.EVENT_OBJECT_ACCELERATORCHANGE:"objectAcceleratorChange",
pyAA.Constants.EVENT_OBJECT_DESCRIPTIONCHANGE:"objectDescriptionChange",
pyAA.Constants.EVENT_OBJECT_DEFACTIONCHANGE:"objectDefactionChange",
pyAA.Constants.EVENT_OBJECT_HELPCHANGE:"objectHelpChange",
pyAA.Constants.EVENT_OBJECT_LOCATIONCHANGE:"objectLocationChange",
pyAA.Constants.EVENT_OBJECT_NAMECHANGE:"objectNameChange",
pyAA.Constants.EVENT_OBJECT_PARENTCHANGE:"objectParentChange",
pyAA.Constants.EVENT_OBJECT_REORDER:"objectReorder",
pyAA.Constants.EVENT_OBJECT_SELECTION:"objectSelection",
pyAA.Constants.EVENT_OBJECT_SELECTIONADD:"objectSelectionAdd",
pyAA.Constants.EVENT_OBJECT_SELECTIONREMOVE:"objectSelectionRemove",
pyAA.Constants.EVENT_OBJECT_SELECTIONWITHIN:"objectSelectionWithIn",
pyAA.Constants.EVENT_OBJECT_STATECHANGE:"objectStateChange",
pyAA.Constants.EVENT_OBJECT_VALUECHANGE:"objectValueChange"
}

#Internal function for object events

def internal_objectEvent(event):
global lastProcessID
if (event.AccessibleObject is None) or (event.Window==0):
return False
window=event.Window
objectID=event.ObjectID
childID=event.ChildID
if (objectID==0) and (childID==0):
objectID=-4
accObject=event.AccessibleObject
objectProcessID=getObjectProcessID(accObject)
if (event.EventID==pyAA.Constants.EVENT_SYSTEM_FOREGROUND) and (objectProcessID!=lastProcessID):
queue_events.put(("appChange",window,objectID,childID))
lastProcessID=objectProcessID
else:
eventName=eventMap.get(event.EventID,None)
if eventName is not None:
queue_events.put((eventName,window,objectID,childID))
return False

#Register internal object event with MSAA

def initialize():
global objectEventHandle
objectEventHandle=pyAA.AddWinEventHook(callback=internal_objectEvent)

def terminate():
global objectEventHandle
pyAA.DeleteWinEventHook(objectEventHandle)

0 comments on commit 6b4eb90

Please sign in to comment.