Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move all files into trunk to allow for branching, tagging, etc. in th…
…e future.
- Loading branch information
jamie
committed
Aug 14, 2006
0 parents
commit 6b4eb90
Showing
35 changed files
with
7,104 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
python 2.4 | ||
http://www.python.org/ | ||
pywin32-208 | ||
pyAA 2.2 | ||
pyHook 1.4 | ||
pyTTS 3.0 | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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> | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
Oops, something went wrong.