orca r4197 - in branches/phase2: . icons po src src/louis src/orca src/orca/scripts src/orca/scripts/apps src/orca/scripts/toolkits



Author: wwalker
Date: Fri Sep 12 17:49:57 2008
New Revision: 4197
URL: http://svn.gnome.org/viewvc/orca?rev=4197&view=rev

Log:
Beginning of Orca refactoring.


Added:
   branches/phase2/   (props changed)
   branches/phase2/AUTHORS
   branches/phase2/ChangeLog
   branches/phase2/MAINTAINERS
   branches/phase2/Makefile.am
   branches/phase2/NEWS
   branches/phase2/README
   branches/phase2/acinclude.m4
   branches/phase2/autogen.sh   (contents, props changed)
   branches/phase2/configure.in
   branches/phase2/icons/   (props changed)
   branches/phase2/icons/AUTHORS
   branches/phase2/icons/COPYING
   branches/phase2/icons/Makefile.am
   branches/phase2/icons/orca-16x16.png   (contents, props changed)
   branches/phase2/icons/orca-22x22.png   (contents, props changed)
   branches/phase2/icons/orca-24x24.png   (contents, props changed)
   branches/phase2/icons/orca-32x32.png   (contents, props changed)
   branches/phase2/icons/orca-48x48.png   (contents, props changed)
   branches/phase2/icons/orca-scalable.svg
   branches/phase2/logging.conf
   branches/phase2/orca.desktop.in
   branches/phase2/po/   (props changed)
   branches/phase2/po/ChangeLog
   branches/phase2/po/LINGUAS
   branches/phase2/po/POTFILES.in
   branches/phase2/po/POTFILES.skip
   branches/phase2/po/ar.po
   branches/phase2/po/bg.po
   branches/phase2/po/bn.po
   branches/phase2/po/bn_IN.po
   branches/phase2/po/ca.po
   branches/phase2/po/cs.po
   branches/phase2/po/cy.po
   branches/phase2/po/da.po
   branches/phase2/po/de.po
   branches/phase2/po/dz.po
   branches/phase2/po/el.po
   branches/phase2/po/en_CA.po
   branches/phase2/po/en_GB.po
   branches/phase2/po/es.po
   branches/phase2/po/et.po
   branches/phase2/po/eu.po
   branches/phase2/po/fi.po
   branches/phase2/po/fr.po
   branches/phase2/po/gl.po
   branches/phase2/po/gu.po
   branches/phase2/po/hi.po
   branches/phase2/po/hu.po
   branches/phase2/po/it.po
   branches/phase2/po/ja.po
   branches/phase2/po/kn.po
   branches/phase2/po/ko.po
   branches/phase2/po/lt.po
   branches/phase2/po/lv.po
   branches/phase2/po/mai.po
   branches/phase2/po/mk.po
   branches/phase2/po/ml.po
   branches/phase2/po/mr.po
   branches/phase2/po/nb.po
   branches/phase2/po/ne.po
   branches/phase2/po/nl.po
   branches/phase2/po/nn.po
   branches/phase2/po/oc.po
   branches/phase2/po/or.po
   branches/phase2/po/pa.po
   branches/phase2/po/pl.po
   branches/phase2/po/pt.po
   branches/phase2/po/pt_BR.po
   branches/phase2/po/ru.po
   branches/phase2/po/rw.po
   branches/phase2/po/si.po
   branches/phase2/po/sl.po
   branches/phase2/po/sq.po
   branches/phase2/po/sr.po
   branches/phase2/po/sr latin po
   branches/phase2/po/sv.po
   branches/phase2/po/ta.po
   branches/phase2/po/te.po
   branches/phase2/po/th.po
   branches/phase2/po/tr.po
   branches/phase2/po/uk.po
   branches/phase2/po/vi.po
   branches/phase2/po/zh_CN.po
   branches/phase2/po/zh_HK.po
   branches/phase2/po/zh_TW.po
   branches/phase2/pylintrc
   branches/phase2/run_pylint.sh.in
   branches/phase2/src/   (props changed)
   branches/phase2/src/Makefile.am
   branches/phase2/src/louis/   (props changed)
   branches/phase2/src/louis/Makefile.am
   branches/phase2/src/louis/__init__.py
   branches/phase2/src/louis/_louis.c
   branches/phase2/src/louis/constants.py.in
   branches/phase2/src/orca/   (props changed)
   branches/phase2/src/orca/Makefile.am
   branches/phase2/src/orca/__init__.py
   branches/phase2/src/orca/braille.py
   branches/phase2/src/orca/braille_monitor.py
   branches/phase2/src/orca/default.py
   branches/phase2/src/orca/input_event.py
   branches/phase2/src/orca/key_bindings.py
   branches/phase2/src/orca/orca.in
   branches/phase2/src/orca/orca.py
   branches/phase2/src/orca/orca_i18n.py.in
   branches/phase2/src/orca/platform.py.in
   branches/phase2/src/orca/script.py
   branches/phase2/src/orca/script_manager.py
   branches/phase2/src/orca/scripts/   (props changed)
   branches/phase2/src/orca/scripts/Makefile.am
   branches/phase2/src/orca/scripts/__init__.py
   branches/phase2/src/orca/scripts/apps/   (props changed)
   branches/phase2/src/orca/scripts/apps/Makefile.am
   branches/phase2/src/orca/scripts/apps/__init__.py
   branches/phase2/src/orca/scripts/toolkits/   (props changed)
   branches/phase2/src/orca/scripts/toolkits/Makefile.am
   branches/phase2/src/orca/scripts/toolkits/__init__.py
   branches/phase2/src/orca/settings.py
   branches/phase2/src/orca/utils.py

Added: branches/phase2/AUTHORS
==============================================================================
--- (empty file)
+++ branches/phase2/AUTHORS	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,5 @@
+Marc Mulcahy
+Willie Walker
+Mike Pedersen
+Rich Burridge
+Joanmarie Diggs

Added: branches/phase2/MAINTAINERS
==============================================================================
--- (empty file)
+++ branches/phase2/MAINTAINERS	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,15 @@
+Willie Walker
+E-mail: william walker sun com
+Userid: wwalker
+
+Mike Pedersen
+E-mail: michael pedersen sun com
+Userid: mpeders
+
+Joanmarie Diggs
+E-mail: <joanmarie diggs gmail com>
+Userid: joanied
+
+Eitan Isaacson
+E-mail: <eitan ascender com>
+Userid: eitani

Added: branches/phase2/Makefile.am
==============================================================================
--- (empty file)
+++ branches/phase2/Makefile.am	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,28 @@
+SUBDIRS = icons po src
+
+DISTCLEANFILES =                \
+	orca.desktop
+
+gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
+
+install-data-hook: update-icon-cache
+uninstall-hook: update-icon-cache
+update-icon-cache:
+	@-if test -z "$(DESTDIR)"; then \
+		echo "Updating Gtk icon cache."; \
+		$(gtk_update_icon_cache); \
+	else \
+		echo "*** Icon cache not updated.  After (un)install, run this:"; \
+		echo "***   $(gtk_update_icon_cache)"; \
+	fi
+
+desktopdir 	 = $(datadir)/applications
+desktop_in_files = orca.desktop.in
+desktop_DATA     = $(desktop_in_files:.desktop.in=.desktop)
+ INTLTOOL_DESKTOP_RULE@
+
+EXTRA_DIST =                \
+	$(desktop_in_files) \
+	$(icon_DATA)        \
+	ChangeLog           \
+	MAINTAINERS

Added: branches/phase2/NEWS
==============================================================================
--- (empty file)
+++ branches/phase2/NEWS	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,3767 @@
+2.23.92 - 08-Sep-2008
+
+General:
+
+* Partial fix for bug #527022 - Linked text should be "underlined" in
+  braille in Firefox.  The complexity of this space, however, has
+  caused us to table the braille underlining of links until the 2.26 
+  release of GNOME.
+
+* Fix for bug #550249 - configure doesn't use find bonobo python
+
+
+Yelp:
+
+* Much work toward the fix for bug #356041 - GNOME Help (yelp) is
+  inaccessible. Please note that access to Yelp is a work in
+  progress: on our end, and on the Yelp end, and may also require
+  the Mozilla guys to fix something on their end. As of today, in
+  order for the yelp script to work, you will need to build yelp --
+  after applying the patch attached to bug #545162. Many, many,
+  many thanks to Ginn Chen for that patch and for getting to the
+  bottom of a rather odd accessibility hierarchy.
+
+StarOffice/OpenOffice:
+
+* Fix for bug #515923 - 'Area' labels of Calc Headers/Footers dialog
+  not always announced.
+
+* Fix for for bug #550137 - Presentation of table content in OOo
+  Writer is largely hosed and we're double-speaking paragraphs in OOo
+  Writer docs.
+
+* Fix for bug #551077 - Traceback and loss of speech in OOo 
+  Writer docs with both links and multbyte characters on the 
+  same line
+
+* Fix for bug #551159 - Orca says "link" when it shouldn't and
+  sometimes fails to say it when it should in OOo Writer documents.
+
+Firefox:
+
+* Fix for bug #541605 - updateBraille() can take an unreasonable
+  amount of time with certain pages in Firefox 3.
+
+* Fix for bug #550873 - Some live region text updates are not
+  presented
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    en_GB   English/British      David Lodge
+    hi      Hindi                Rajesh Ranjan
+    ja      Japanese             Takeshi Aihana
+    mai     Maithili             Sangeeta Kumari
+    pl      Polish               Piotr LeszczyÅski
+    pt      Portuguese           Duarte Loreto
+    sv      Swedish              Daniel Nylander
+    ta      Tamil                Tirumurthi Vasudevan
+    tr      Turkish              Baris Cicek
+
+==========
+
+2.23.91 - 01-Sep-2008
+
+General:
+
+* Refix for bug #540937 - Orca doesn't check if the wnck python
+  bindings are installed.
+
+* Fix for bug #547774 - Possible small performance improvement for
+  starting preferences
+
+* Fix for bug #548380 - Character count message needs reordering in
+  translation
+
+* Fix for bug #548382 - Unreliable check for Evolution Setup Assistant
+
+StarOffice/OpenOffice:
+
+* Fix for bug #523416 - Cannot access Impress panes via the
+  keyboard (Note: Requires OOo 3.0)
+
+* Fix for bug #523452 - OOo spell check not working
+
+* Fix for bug #549664 - isDesiredFocusedItem() needs to be more
+ flexible
+
+Firefox:
+
+* Fix for bug #547477 - Cursor navigation cycles through same text
+  in Firefox--bugzilla page
+
+* Fix for bug #549529 - Improve our handling of caret-moved events
+  when Gecko is controlling the caret (Note: This doesn't fix all of
+  the issues; merely improves some of them)
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    de       German               Jochen Skulj
+    eu       Basque               IÃaki LarraÃaga Murgoitio
+    es       Spanish              Francisco Javier Dorado Martinez and
+                                  Jorge Gonzalez
+    et       Estonian             Ivar Smolin and Priit Laes
+    fi       Finnish              Timo Jyrinki
+    fr       French               Robert-Andrà Mauchin
+    gl       Galician             Ignacio Casal Quinteiro
+    sr latin Serbian              Danilo Åegan
+    sv       Swedish              Daniel Nylander
+    th       Thai                 Theppitak Karoonboonyanan
+
+==========
+
+2.23.90 - 18-Aug-2008
+
+General:
+
+* Use DBus only if DBUS_SESSION_BUS_ADDRESS is defined so as to avoid
+  unexpected launching of a DBus daemon
+
+* Fix for bug #536985 - Orca no longer reads applets on the panel
+
+* Fix for bug #540123 â Tutor help messages with orca.  (Many many
+  thanks to Mesar Hameed for his hard work here and to Hammer Attila
+  for testing)
+
+* Fix for bug #540187 - Wrapped structural navigation toggle.  (Thanks
+  Mesar!)
+
+* Fix for bug #546277 - Traceback when accessing "User Privileges" tab
+  of "Account Properties" dialog of "User Settings".
+
+* Fix for bug #546660 - The speaking of progress bars should be turned
+  on by default
+
+* Fix for bug #547938 - Magnifier should follow Alt+Tab
+
+* Fix for bug #547895 - make distcheck fails with intltools 0.40.0
+
+Firefox/Thunderbird:
+
+* Work on bug #535178 - In Gecko, we should get the needed text for
+  the speech and braille contexts while building up the line.  Also
+  fixes bug #527819 â Orca sometimes says "list" between items when
+  the list is on a single line in FF3.
+
+* Fix for bug #535183 - Word navigation is inconsistent in Thunderbird
+  and Firefox.
+
+* Work on bug #542833 - Flat review in Thunderbird is largely broken.
+ This part of the fix should stop us from hanging if flat review is
+ invoked with a message list with thousands of messages and should
+ ensure that we don't review things that are not actually on the
+ screen. There is still more work that needs to be done on this bug.
+
+* Fix for bug #546355 - The ARIA gmail interface is largely unusable
+  with Orca
+
+* Fix for bug #546895 - Braille context includes previous menu item in
+  HTML combo boxes.
+
+* Fix for bug #547345 - Can't always "Alt+Tab" back into Thunderbird
+  or Firefox
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    fi      Finnish              Ilkka Tuohela
+    gl      Galician             Ignacio Casal Quinteiro
+    pt      Portuguese           Duarte Loreto
+    ru      Russian              Nickolay V. Shmyrev and Anatol Kamynin
+    th      Thai                 Theppitak Karoonboonyanan
+
+==========
+
+2.23.6 - 04-Aug-2008
+
+General:
+
+* Fix for bug #536985 - Orca no longer reads applets on the panel.
+
+* More work on bug #542714 - Orca should indicate read-only text boxes.
+
+* Fix for bug #545342 - Can no longer shift+click using Orca.
+
+StarOffice/OpenOffice:
+
+* Fix for bug #429390 - Braille stays on current line after pressing
+  return at end of line in OOo Writer.
+
+Firefox:
+
+* Fix for bug #544122 - Problems with downloading files with Firefox 3.
+
+* Fix for bug #544197 - Orca speaks nothing when first tabbing into
+  the document frame in firefox.
+
+* Fix for bug #544771 - Orca no longer moving the cursor on same page
+  links.
+
+* Fix for bug #545623 - Revert to checking extents for navigating
+  amongst line breaks. This also seems to improve -- and may fix --
+  bug #534431 (Orca does not recognize blank lines when writing a
+  message in Thunderbird).
+
+* Fix for bug #545946 - WhereAmI fails on Gecko Trees.
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    pt_BR   Brazilian Portuguese Vladimir Melo and
+                                 Leonardo Ferreira Fontenelle
+    ru      Russian              Nickolay V. Shmyrev and Anatol Kamynin
+
+==========
+
+2.23.5 - 21-Jul-2008
+
+General:
+
+* Fix for bug #520596 - Orca should implement echo by sentence.
+
+* Additional fix for bug #525656 - Orca needs to handle the new
+  Pidgin typing status updates. This was needed due to a change
+  in Pidgin.
+
+* Fix for bug #533095 - Magnifier should turn off the system
+  sprite/cursor/mouse when using full screen magnification.
+  This requires a new gnome-mag release as well.
+
+* Fix for bug #534022 - The Line-end symbol (46 123) should be
+  configurable per application.
+
+* Fix for bug #536825 - Allow bypass of Orca's keyboard commands.
+  (The default keybinding is Orca+Backspace, but you can change
+  that by specifying a new binding in the Orca Preferences dialog.)
+
+* Fix for bug #536985 - Orca no longer reads applets on the panel.
+
+* Fix for bug #538058 - The role for accessibles of ROLE_LIST_ITEM
+  should not be spoken when the accessible is given focus.
+
+* Fix for bug #538729 - In Orca preferences window /text attributes 
+  page the text attribute names not marked for translation.
+
+* Fix for bug #538773 - Enable a quick 'smoke test' for whether Orca
+  can see things via the AT-SPI.  Added a --list-apps option to print
+  the list of known applications.
+
+* Fix for bug #540937 - Orca doesn't check if the wnck python bindings
+  are installed.
+
+* Fix for bug #541094 - Back out 'silent focus' code.
+
+* Fix for bug #541437 - Trying to quit Orca with the mouse doesn't
+  give focus to the Quit dialog.
+
+* Fix for bug #542260 - Orca should only keep track of
+  active/non-defunct progress bars.
+
+* Fix for bug #542262 - Orca should only echo words once when word
+  echo is enabled.
+
+* Fix for bug #542367 - Some key names not marked for translation.
+
+* Fix for bug #542714 - Orca should indicate read-only text boxes.
+
+* Fix for bug #542719 - Modified column header does not appear
+  translated in Preferences - Key bindings page.
+        
+* Fix for bug #543775 - Orca uses incorrect voice sometimes in text
+  setup.
+
+Java:
+
+* Much work on bug #435623 - Java Platform Metabug (see comment #6 in
+  the bug for more information).
+
+StarOffice/OpenOffice:
+
+* Fix for bug #538053 - Word echo is not echoing the word typed 
+  when return is pressed while editing an Impress slide.
+
+* Fix for bug #538056 - Orca should announce the "view" as part of 
+  the scroll pane context in Impress.
+
+* Fix for bug #538064 - Orca should speak placeholder contents when
+  that placeholder is given focus on an Impress slide.
+
+* Fix for bug #538835 - Word echo is not echoing the word typed when
+  return is pressed while creating an oowriter text document.
+
+Firefox:
+
+* Fix for bug #519515 - Support ARIA "required" state.  This adds
+  support for presenting the fact that the required state has been
+  set for the following types of ARIA widgets: 
+
+      - checkbox
+      - gridcell
+      - radiogroup
+      - slider
+      - spinbutton
+
+  We'll add support for additional widgets over time.  In order to
+  minimize verbosity, this state is not presented by default. To
+  change this setting, set orca.settings.presentRequiredState to
+  True in your user-settings.py or orca-customizations.py. In
+  addition, we've added in support for customizing the strings
+  used to present the required state. By default, "required" (or
+  the localized form of it) will be used for both speech and
+  braille.  Modify orca.settings.brailleRequiredStateString and/or
+  orca.settings.speechRequiredStateString if you would prefer a
+  different string.
+
+* Fix for bug #530783 - Orca speaks an image map link's shape as part
+  of the whereAmI info in FF3.
+
+* Fix for bug #533109 - Orca doesn't speak alerts in Firefox.
+
+* Fix for bug #535023 - Structural Navigation should be pulled out of
+  Gecko and include more objects.
+
+* Fix for bug #536455 - Contents of "Save In Folder" combo box not
+  indicated in speech/braille in Firefox/Thunderbird.
+
+* Fix for bug #537839 - Orca does not remember the last position
+  on a webpage in firefox when using the back command.
+
+* Fix for bug #539075 - Navigation problems with Firefox 3 & Aria
+  example.
+
+* Fix for bug #540187 - Wrapped structural navigation toggle. There
+  is a new setting (wrappedStructuralNavigation) which controls
+  whether or not we wrap around the document when structural 
+  navigation is used. The default value is True (i.e. do wrap). If
+  you would prefer Orca not wrap, you can set it to False in your
+  user-settings.py or your orca-customizations.py.
+
+* Fix for bug #542324 - When launch Firefox 3.0 and pressing
+  CTRL+Orca+space key, In Orca application preferences/keybindings
+  page some structural navigation description not marked for
+  translation.
+
+* Fix for bug #542927 - Live region commands should be treated as
+  structural navigation commands when in form fields in Firefox 3.
+
+* Fix for bug #543496 - Problems with performing mouse clicks in
+  Firefox.
+
+Thunderbird:
+
+* Fix for bug #533042 - Orca should be less verbose when reading
+  autocompletes in Thunderbird.
+
+* Fix for bug #536451 - Newly focused message not spoken after message
+  deletion in Thunderbird.
+
+* Fix for bug #536455 - Contents of "Save In Folder" combo box not
+  indicated in speech/braille in Firefox/Thunderbird.
+
+* Fix for bug #540039 - Newly focused message not spoken after message
+  deletion in Thunderbird if a message is open.
+
+* Fix for bug #540407 - Problems reading messages in Thunderbird
+  when arrowToLineBeginning is False.
+
+* Fix for bug #540833 - Word echo not working in Thunderbird address
+  fields if autocompletion is not active.
+
+* Fix for bug #541018 - Mail messages not automatically read when
+  opened in Thunderbird.
+
+* Fix for bug #543024 - Important header fields for received
+  messages not spoken when tabbing through headers in Thunderbird
+  message view.
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    gl      Galician             Ignacio Casal Quinteiro
+    hu      Hungarian            Atilla Hammer and Gabor Kelemen
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    oc      Occitan              Yannig Marchegay
+    ru      Russian              Nickolay V. Shmyrev and Anatol Kamynin
+
+==========
+
+2.23.4 - 16-Jun-2008
+
+General:
+
+* Fix for bug #397306 - Orca's default synthesis engine choice should
+  take language into account.
+
+* Fix for bug #464194 - Refactor keybindings to always care about
+  Control/Shift/Alt/Orca modifiers.
+
++ Refix for bug #487585 - Orca Usage message should be localized.  Do
+  not mark the command line options for translation.
+
+* Fix for bug #517532 - change dict.has_key() usage to set operator
+  'in'.
+
+* Fix for bug #529655 - After inputting an incorrect password on the
+  screensaver, orca can't speak the whole dialog.
+
+* Fix for bug #530368 - Only move focus if the event is for the
+  focused/active window.
+
+Java:
+
++ Fix for bug #435585 - Java ControlPanel GIVING UP AFTER 5 TRIES.
+
+OOo:
+
+* Fix for bug #521450 - Orca should read the next/previous paragraph
+  by a keystroke.
+
+* Fix for bug #537851 - Moving cursor with mouse in oowriter causes
+  traceback.
+
+Thunderbird:
+
+* Fix for bug #507922 - Include page tab name in braille context for
+  Thunderbird.
+
+* Fix for bug #535192 - Misspelled word and suggestion not spoken in
+  Thunderbird spell check.
+
+* Fix for bug #537425 - Orca should provide context for misspelled
+  words in Thunderbird spell check.
+
+Firefox:
+
+* Fix for bug #531806 - Wrapped item lists don't give proper braille
+  in Gecko.
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi
+    bg      Bulgarian            Alexander Shopov
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    oc      Occitan              Yannig Marchegay
+    vi      Vietnamese           Clytie Siddall
+
+==========
+
+2.23.3 - 02-Jun-2008
+
+General:
+
++ Fix for bug #371637 - Orca repeats "Location:" info repeatedly in
+  Nautilus File Browser Dialog.
+
+* Fix for bug #448817 - Being able to configure autostart from orca's
+  settings.
+
+* Fix for bug #463646 - Orca doesn't announce the presence of
+  unfocused dialogs when an app gains focus.
+
+* Additional fix for bug #520494 - Keyboard review punctuation in Firefox.
+  (This was actually a general fix not isolated to Firefox)
+
+* Fix for bug #524998 - Selection is not shown if Ctrl+A is used to do
+  "Select All".
+
+* Reversed the fix for bug #529784 - Speech cannot always be
+  interrupted with flat review.  Further investigation done by
+  Rich and Will indicate that the bug in question is an espeak
+  bug and this "fix" introduces more problems than it solves
+  (see, for instance, bug #532982).
+
+* Fix for bug #534383 - Orca mouse review traceback at startup.
+
+* Fix for bug #535747 - Do not assume
+  orca_state.lastNonModifierKeyEvent is non-None.
+
+Evolution:
+
+* Fix for bug #516565 - Orca speaks the full line of a message in Evo
+  when it should not.
+
++ Fix for bug #533499 - Evolution contacts not being spoken when you
+  navigate them.
+
+Firefox/Thunderbird:
+
+* Fix for bug #511561 - Orca should not impact the cursor position
+  when replying to a message in thunderbird.
+
+* Fix for bug #515665 - Orca has problems with tables that have
+  captions in FF3.
+
++ Fix for bug #527959 - Incorrect caret movement in Firefox 3 on
+  certain Web pages.
+
+* Fix for bug #528644 - Orca should indicate when an autocomplete list
+  has appeared in FF.
+
+* Fix for bug #532069 - Orca should read field labels on the NLS site.
+
++ Fix for bug #533125 - Orca does not speak Search textbox in Firefox
+  Download Manager if it is empty.
+
+* Fix for bug #534393 - Moving by large object in firefox can skip
+  text.
+
+* Fix for bug #535149 - Orca should override Home and End in Firefox 3
+  and Thunderbird.
+
+OOo:
+
+* Fix for bug #517048 - Orca does not always speak the correct
+  information when navigating and/or selecting text across object
+  boundaries in OOo Writer.
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    hu      Hungarian            Attila Hammer and Gabor Kelemen
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    vi      Vietnamese           Clytie Siddall
+
+==========
+
+2.23.2 - 12-May-2008
+
++ = means it's also part of the gnome-2-22 branch
+
+General:
+
+* Fix for bug #426010 - Implement Verbalized Links.
+
+* Fix for bug #517127 - Orca doesn't always speak expected message
+  when selecting all.
+
++ Fix for bug #517387 - Orca should not read password out in gdm login
+  window.  This just turns off key echo when the login window is up.
+  The real fix belongs in gdm (see bug #529145).
+
++ Fix for bug #517736 - whereAmI does not handle text with embedded
+  object characters.
+
++ Fix for bug #522797 - Orca should not speak false "inaccessible"
+  messages when switching applications.
+
++ Additional fix for bug #525831 - isn't properly handling SIGTERM.
+  Needed to fix this so orca_console_prefs would work again.
+
+* Fix for bug #528147 - Broke up multi-class scripts into packages.
+
++ Fix for bug #528507 - Escape doesn't exit "learn mode" if the active
+  script changes.
+
++ Fix for bug #528797 - gnome-speech inappropriately uses
+  g_return_if_fail.  Only set "punctuation mode" if we can.
+
+* Fix for bug #530541 - Suspending Orca in terminal screws up session.
+
+* Fix for bug #531378 - FSF address has changed.  Also updated
+  copyright messages to 2008.
+
+* Fix for bug #532376 - Running pylint can potentially overwrite
+  previous results.
+
+Pidgin:
+
+* Fix for bug #474673 - Add option to have chatroom-specific message
+  histories in Pidgin.
+
++ Fix for bug #523731 - Pidgin events interfere with app-specific
+  Prefs dialog.
+
+Firefox:
+
+* Fix for bug #529784 - Speech cannot always be interrupted with flat
+  review.
+
++ Fix for bug #530766 - (ff3) split headings not fully read when nav
+  by structure.
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    es      Spanish              Francisco Javier Dorado Martinez
+    hu      Hungarian            Attila Hammer and Gabor Kelemen
+    nb      Norwegian BokmÃl     Kjartan Maraas
+
+==========
+
+2.23.1 - 21-Apr-2008
+
++ = means it's also part of the gnome-2-22 branch
+
+General:
+
++ Fix for bug #517505 - Orca doesn't present new active descendant
+  when deleting from the top of a list
+
++ Fix for bug #518507 - getSpeechForAlert() assumes unrelated labels
+  have names
+
++ Fix for bug #518518 - Need to do some sanity checks for broken table
+  hierarchies
+
++ Fix for bug #518762 - When using gnome-terminal with multiple tabs,
+  the name on the tab is not announced when switching between tabbed
+  windows
+
+* Fix for bug #518914 - table column number missing in whereAmI info
+
++ Fix for bug #519901 - Orca doesn't warn via braille that an
+  inaccessible object got the focus
+
+* Fix for bug #520611 - New mouse review feature
+
+* Fix for bug #520974 - Some script names are not marked for
+  translation
+
+* Fix for bug #522657 - this may take a while should be removed from
+  the orca prefs
+
++ Fix for bug #523082 - text-setup should not use speech if
+  --disable=speech is used
+
++ Fix for bug #523147 - "space" keyname is not marked for translation
+
+* Fix for bug #523309 - "return" and "backspace" keynames is not
+  marked for translations
+
+* Fix for bug #523268 - refactor braille support of text attributes
+
++ Fix for bug #523642 - orca_prefs.py:_writePronunciation should not
+  generate bad Python syntax
+
++ Fix for bug #523712 - Orca application specific preferences window
+  doesn't always get focus when user types Insert-Control-Space
+
+
+* Fix for bug #525348 - Orca uses wget. (It now uses DBus)
+
++ Fix for bug #525831 - isn't properly handling SIGTERM
+
+* Fix for bug #525592 - Provide 'diff' like output for regression test
+  failures
+
+* Fix for bug #525649 - Don't bomb when no DISPLAY is set
+
+Evolution:
+
+* Fix for bug #519936 - In Evolution Orca does not read the messages
+  list properly when in "read table row" mode
+
+Pidgin:
+
++ Fix for bug #525644 - Pidgin buddy status changes cause Orca to
+  display "cell" in braille
+
++ Fix for bug #525656 - Orca needs to handle the new Pidgin typing
+  status updates
+
+OOo:
+
++ Fix for bug #517502 - Orca should not speak the previously focused
+  menu item when arrowing across the menu bar in OpenOffice
+
++ Fix for bug #523018 - Orca does not speak the role for edits in the
+  find and replace dialog in openoffice
+
+Firefox:
+
++ Fix for bug #491837 - Implement Gecko.py 'go to' functions with Collections
+
+* Fix for bug #512103 - Orca speaks too much of the context in FF3
+
++ Fix for bug #512503 - Remove "object:visible-data-changed" listener
+  from Gecko.py
+
++ Fix for bug #515804 - Whitespace needs to be removed from speech and
+  braille contexts in FF3
+
++ Fix for bug #517277 - Orca should not get stuck while browsing
+  articles at espn.com
+
++ Fix for bug #518893 - extra verbosity in web pages with nested frames
+
++ Fix for bug #519416 - Zoomer loses focus when doing a web search
+
++ Fix for bug #519478 - (ff3) missing text with line down navigation
+  (www.fixedearth.com)
+
+* Fix for bug #519587 - Navigating nested lists with Collection not
+  functioning properly
+
++ Fix for bug #519931 - Orca does not read certain news feeds
+  correctly
+
++ Fix for bug #520029 - Better handle our presentation of images and
+  text on a web page when the image spans multiple lines
+
+* Fix for bug #520612 - Add cursor key routing support to Gecko
+
++ Fix for bug #520760 - (ff3) read document ignoring remainder of
+  object when first subelement is non-text.
+
++ Fix for bug #523480 - Unwanted roles appearing in the braille
+  context for dojo in FF3
+
++ Fix for bug #523759 - Gecko.getCharacterOffsetInParent() needs
+  to check the parent for text
+
+* Fix for bug #526366 - Remove the unused line navigation code from
+  Gecko.py
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    ca      Catalan              Gil Forcada
+    cs      Czech                Lucas Lommer, Martin Sukany and
+                                 Petr Kovar
+    da      Danish               Kenneth Nielsen
+    de      German               Jochen Skulj
+    el      Greek                Giannis Katsampipis and Kostas Papadimas
+    en_GB   Philip Withnall      English/British
+    es      Spanish              Francisco Javier Dorado Martinez
+    hu      Hungarian            Attila Hammer and Gabor Kelemen
+    ja      Japanese             Takeshi Aihana
+    ml      Malayalam            Ani Peter
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    nl      Dutch                Vincent van Adrighem
+    nn      Norwegian Nynorsk    Eskild Hustvedt
+    pt_BR   Brazilian Portuguese Tiago Melo Casal and
+                                 Leonardo Ferreira Fontenelle
+    sv      Swedish              Daniel Nylander
+    te      Telugu               Krishna Babu K and Sunil Mohan Adapa
+
+==========
+
+2.21.92 - 25-Feb-2008
+
+General:
+
+* Fix for bug #419136 - Planner toggle button in main window not
+  accessible
+
+* Fix for bug #486897 - Where Am I doesn't present row/column headers
+
+* Fix for bug #513238 - Flat review is broken in Evolution
+
+* Fix for bug #516321 - Caps lock not correctly reporting the state
+  when toggled
+
+* Workaround for bug #517026 - crash in Open Folder: Deleting the last
+  file in a directory
+
+OOo:
+
+* Fix for bug #515651 - Navigation of cells in oocalc now says "not
+  selected"
+
+Firefox:
+
+* Fix for bug #508163 - Orca tends to be slow in the vicinity of combo
+  boxes in Firefox
+
+* Fix for bug #511885 - Support relevant and channel live region
+  properties
+
+* Fix for bug #512261 - We should implement better support for the FF
+  A11y extension
+
+* Fix for bug #515263 - ARIA tooltips should respect presentToolTips
+  setting
+
+* Fix for bug #512503 - Remove "object:visible-data-changed" listener
+  from Gecko.py
+
+* Fix for bug #515571 - FF3 form field structural navigation should
+  handle form fields that are not in forms
+
+* Fix for bug #516121 - Orca stalls on barackobama.com when navigating
+  by heading in FF3
+
+* Fix for bug #516174 - FF line navigation needs to be more
+  accurate. (We know these aren't all the issues, but hopefully this
+  fix will resolve many of them.)
+
+* Fix for bug #517521 - Gecko.py is throwing exception in onCaretMoved
+
+* Fix for bug #517336 - Spaces interfere with Orca's ability to get
+  the line contents
+
+* Fix for bug #517371 - Orca gets stuck when browsing humanware.ca in FF3
+
+* Fix for bug #517716 - Live regions being output on listitem changes
+  for Bugzilla
+
+* Fix for bug #517752 - (ff3) more orca+left/right inconsistency
+
+* Fix for bug #518502 - Orca doesn't always speak wrapping
+  announcement for link structural nav in FF3
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    de      German               Jochen Skulj
+    es      Spanish              Francisco Javier Dorado Martinez
+    fi      Finnish              Ilkka Tuohela
+    fr      French               Robert-Andrà Mauchin and Claude Paroz
+    hu      Hungarian            Attila Hammer and Gabor Kelemen
+    kn      Kannada              Shankar Prasad and Runa Bhattacharjee
+    mk      Macedonian           Jovan Naumovski
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    ne      Nepali               Pawan Chitrakar
+    nl      Dutch                Vincent van Adrighem
+    pt      Portuguese           Duarte Loreto
+    ru      Russian              Nickolay V. Shmyrev
+    th      Thai                 Theppitak Karoonboonyanan
+    vi      Vietnamese           Nguyán ThÃi Ngác Duy
+    zh_HK   Traditional Chinese  Chao-Hsiung Liao
+    zh_TW   Traditional Chinese  Chao-Hsiung Liao
+
+==========
+
+2.21.91 - 11-Feb-2008
+
+General:
+
+* Fix for bug #133275 - (gedit) accessible description for page not
+  correct
+
+* Work on bug #354470 - Contracted braille.  This provides fundamental
+  contracted braille support via liblouis.
+
+* Fix for bug #434654 - Orca skips a line in flat review mode or
+  with braille navigation (braille up / down).  This fixes the
+  bug in question, but there is an asymmetric behavior that happens
+  when flat reviewing by word.  Flat review by previous word will
+  land blank line at the end of a text area (if it has one), but
+  won't do do when navigating by next work.  Tracking the asymmetric
+  navigation issue in bug #515817.
+
+* Fix for bug #440490 - Key bindings should allow double and triple
+  press features to be rebound
+
+* Fix for bug #486908 - Selection and navigation in multiselectable
+  items are not properly handled
+
+* Fix for bug #512608 - Punctuation in keyboard review mode
+
+* Fix for bug #512639 - rhythmbox Library table not accessible
+
+* Fix for bug #512847 - Flat review is quite broken in OpenOffice and
+  Firefox
+
+OpenOffice:
+
+* Fix for bug #363830 - Provide feedback in OOo when toggling bold,
+  underline, and italics
+
+Firefox:
+
+* Fix for bug #462883 - ARIA tooltips/alerts are not being output
+
+* Fix for bug #506360 - find{Next,Previous}Line() should be more
+  efficient
+
+* Fix for bug #511354 - cannot press enter to activate links in area
+  tags, although tabbing works
+
+* Fix for bug #511389 - Orca doesn't always speak a link that regains
+  focus in FF3
+
+* Fix for bug #512236 - missing links in ff3 when navigating down page
+
+* Fix for bug #512303 - table captions are not being presented
+
+* Fix for bug #513217 - object navigation sticking on same line
+  comboboxes
+
+* Fix for bug #513425 - orca object navigation is not consistant when
+  moving to the left/to the right
+
+* Fix for bug #514427 - Orca skips over headings at the end of
+  sections in FF3
+
+* Fix for bug #515652 - Gecko.py script causing Traceback
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi
+    de      German               Jochen Skulj
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    it      Italian              Luca Ferretti
+    oc      Occitan              Yannig Marchegay
+    pt      Portuguese           Duarte Loreto
+    sv      Swedish              Daniel Nylander
+
+==========
+
+2.21.90 - 28-Jan-2008
+
+General:
+
+* Workaround for blocked bug #432308 - Problem with Evolution and
+  threads always speaking "expanded 0 items". Adding in code to no
+  longer speak the "0 items" if this is a table cell in the mail
+  message header list with an expanded state.
+
+* Fix for bug #482294 - Contextual information for gnome-terminal
+  should only be shown in braille when you're on the first line.
+  Orca now automatically enters flat review mode when you pan left
+  past the beginning of the line containing the cursor.
+
+* Fix for bug #503874 - Read by row in Evolution reads cell
+  information incorrectly
+
+* Fix for bug #506874 - Flat review should support status bars that
+  have accessible text and children
+
+* Fix for bug #508682 - Orca speak combobox item three time in Pidgin
+  2.3.0
+
+* Fix for bug #510019 - Orca can continue trying to dequeue events
+  when queue is empty (thanks to Mike Gorse for this fix!)
+
+* Fix for bug #511447 - Orca speaks passwords when they are been typed
+
+OpenOffice:
+
+* Fix for bug #510207 - key echo by word is broken in OOo Writer.
+
+Firefox:
+
+* Updates to the regression tests.
+
+* Fix for bug #483023 - Orca should give the user the ability to
+  move between objects in order.  You can now use Orca+Left and
+  Orca+Right to move from object to object.  This should come
+  in handy for "escaping" combo boxes and lists in forms after
+  making your selection.  Because these new commands treat each
+  object as if it were on a line by itself, users who have
+  requested this type of line navigation will hopefully find that
+  this new functionality also addresses some of those needs.
+
+* Fix for bug #505742, Accommodate no ARIA markup for live regions
+
+* Work on bug #506360 - find{Next,Previous}Line() should be more
+  efficient
+
+* Fix for bug #509394 - First focusable item in document frame not
+  always spoken in FF3
+
+* Fix for bug #509482 - Line navigation in FF wraps from top of file
+  to bottom
+
+* Fix for bug #509588 - Header information disappearing in ff3 on
+  minefield page
+
+* Fix for bug #509731 - braille for collapsed html combo boxes is not
+  updating correctly
+
+* Fix for bug #509809 - We should try to do a better job of guessing
+  labels in poorly-coded forms
+
+* Fix for bug #510478 - Character navigation in FF wraps from bottom
+  of file to top
+
+* Fix for bug #511118 - We sometimes get stuck on images that are also
+  links
+
+* Partial fix for bug #511893 - Live region performance
+  enhancements. Fix for navigation performance issue.
+
+* Fix for bug #512270 - orca crash on visiting www.gmail.com after login
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    sv      Swedish              Daniel Nylander
+
+==========
+
+2.21.5 - 14-Jan-2008
+
+General:
+
+* Fix for bug #354462 - SayAll of dialogs (versus just a single text
+  area)
+
+* Fix for bug #463867 - Source display and Target display should
+  self-populate in Orca Prefs dialog
+
+* Fix for bug #463881 - Evaluate other gnome-mag features for inclusion
+  in Orca prefs
+
+* Fix for bug #485522 - Orca should allow the user to specify the
+  chat messages that get spoken/brailled
+
+* Fix for bug #486895 - Arrowing down from column header to table
+  presents wrong column header
+
+* Fix for bug #489504 - Invoking a Say All should result in any text
+  selection being cleared
+
+* Fix for bug #504356 - Unchecking "Enable speech" doesn't grey out
+  all speech items in the Preferences dialog
+
+* Fix for bug #504384 - The Orca Preferences dialog is a bit too "tall"
+
+* Fix for bug #505293 - Zoomer borders should only be displayed at
+  source display intersection
+
+* Fix for bug #505306 - Orca's color filtering combo box should be
+  greyed out if the filters are not available
+
+* Fix for bug #508679 - The second time to enable the Braille Monitor,
+  it can not be lauched
+
+* Fix for bug #508777 - HTTP-based Recording ability should not be
+  enabled by default
+
+Evolution:
+
+* Fix for bug #490317 - Orca echoes the first letter of each new line
+  when composing a message in Evolution
+
+Java platform:
+
+* Fix for bug #507886 - Orca+Space when in Java application presents
+  script summary debug
+
+Firefox/Thunderbird:
+
+* Work on bug #414762 - Control Home/End, Up/Down Arrow don't always
+  work in Firefox.  Firefox still has some navigation issues which
+  prevent things like Control Home and Control End from doing what we
+  would want/expect.  Therefore, we've taken over these keystrokes by
+  default. :-) They should always move you to the top and bottom of
+  the document now if Orca is controlling the caret.  If you would
+  prefer to have Control Home and Control End exhibit the default FF
+  behavior, toggle to a Gecko-controlled caret or change the
+  keybindings in the Orca Preferences dialog for Minefield.
+
+* Fix for bug #480881 - Firefox is very slow on pages with forms
+
+* Fix for bug #500016 - Reading web pages by line in Firefox 3 is
+  slow
+
+* Fix for bug #502084 - Running Orca with Thunderbird v2.0.X with
+  compose window open generates a stack trace
+
+* Fix for bug #504742 - Gecko.py should not call
+  getLineContentsAtOffset() twice unnecessarily
+
+* Fix for bug #504785 - Orca repeats certain lines twice in Firefox 3
+
+* Fix for bug #505102 - Pressing Up/Down in FF3 is moving to spaces at
+  the end of the current line
+
+* Fix for bug #506360 - find{Next,Previous}Line() should be more
+  efficient.  Note that this is one of the new "performance
+  enhancements" that has been well-tested, but may contain side
+  effects.  Please give us your feedback.  If you're unsure as to
+  whether this change is responsible for a problem you are seeing, you
+  can place the following two lines in your
+  ~/.orca/orca-customizations.py file:
+
+  import orca.Gecko
+  orca.Gecko.useNewLineNav = False
+
+  If True (the default), the new enhancements are used; if False, they
+  are not.  If this change is responsible, let us know.
+
+* Fix for bug #508624 - Checkbox tristate not announcing state changes
+
+* Work on bug #508784 - Orca needs to handle FF hierarchies that don't
+  match reality.  Part of the solution is making sure the user can
+  navigate to the areas.  That is what has been done.  We still need
+  to present the elements and allow the user to navigate among them
+  according to their spatial layout (e.g. reverse the list whose
+  elements are ordered right-to-left).
+
+* Fix for bug #509068 - We should prevent the user from arrowing into
+  combo boxes in FF.  Now you can arrow "up to" a combo box, but
+  should not be able to arrow into it accidentally.  If you arrow to a
+  combo box and want to it give focus, you can do several things:
+  Press Tab (as it's the next focusable item), press Orca+Tab (as it's
+  the next form field, assuming your combo box is contained in a
+  form), or press Alt+Down Arrow (which is the Firefox command to
+  expand the current combo box).
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    et      Estonian             Ivar Smolin and Priit Laes
+    it      Italian              Luca Ferretti
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    oc      Occitan              Yannig Marchegay
+    sv      Swedish              Daniel Nylander
+    vi      Vietnamese           Clytie Siddall
+
+==========
+
+2.21.4 - 17-Dec-2007
+
+NOTE: There have been keybindings changes for this release.
+
+* Instead of Orca+F1 to enter learn mode, the binding is now
+  Orca+h.
+
+* Instead of Orca+{1,2,3,4,5,6,7,8,9} to read the last nth message
+  that was presented in an application such as gaim or gnome-mud, the
+  binding is now Orca+{F1,F2,F3,F4,F5,F6,F7,F8,F9}.
+
+* The debugging keys have been rebound as well.  The new bindings
+  are Orca+Ctrl+Alt+{the following}, where {the_following} is one
+  of:
+
+   End       - report active script info
+   Home      - print list of known apps and their windows
+   Page_Up   - print locus of focus ancestry
+   Page_Down - print accessible hierarchy of active application
+
+Magnification:
+
+* Support "live updating" when setting various magnification features
+
+  Changes made to the zoomer in the Orca Preferences now update in
+  real time: it is no longer necessary to press the Apply button to
+  see if the option you've chosen works for you and then undo it or
+  adjust it if it doesn't.  Note that you must still press the Apply
+  or the OK button to make your changes permanent.
+
+* Bug #452316 - should have a "fullscreen" checkbox
+
+  We've added a Position combo box so that it's easy to select the
+  position of the zoomer.  The options are full screen, left half,
+  right half, top half, bottom half, and custom.  Choosing custom
+  allows you to specify the location of each edge of the zoomer.
+  The new default zoomer position is full screen if full screen
+  magnification is possible.  Otherwise, the right half of the
+  screen will be used by default.
+
+* Bug #463881 - Evaluate other gnome-mag features for inclusion in
+  Orca prefs
+
+  You can now adjust the brightness and contrast levels and use the
+  colorblind filters from libcolorblind.  Basic brightness and
+  contrast levels can be adjusted through the spin buttons on the
+  Magnifier pane of the Orca Preferences dialog.  If you press the
+  Advanced Settings button at the bottom of that pane, you'll be
+  placed in a dialog box where you can customize the red, green, and
+  blue brightness levels and contrast levels individually.  The
+  Advanced Settings dialog is also where you can choose a color
+  filter.  These options should enable you to create the color
+  scheme that works best for you.  Note that in order for colorblind
+  filtering to work, you must install libcolorblind and then
+  re-build gnome-mag.
+
+  You can also add a border to your zoomer to help separate it from
+  the non-magnified area.  The border size and color are
+  customizable.  We've also separated the cursor color from the
+  cross-hair color so you no longer have to find the one color that
+  works best for both.
+
+* Bug #464705 - Provide option to keep caret in center of magnifier
+  region of interest
+
+  We've added individual tracking and alignment settings for
+  controls and the text cursor: each can have an alignment of
+  centered or push (move the magnifier window the least).  In
+  addition, you can now specify an edge margin for the text cursor.
+  This margin is how close the caret should be allowed to get to the
+  edge of the screen before it's time to "push."  The margin can
+  range from 0 to 50%, with 50% being the equivalent of choosing
+  centering.  These options should make it easier to keep track of
+  your location on the screen and ensure that you can always see the
+  area around your point of focus.
+
+* Bug #501414 - Orca should have (unbound) keybindings for quickly
+  changing magnification settings
+
+  We've added the following new commands:
+
+  - Toggle color enhancements
+  - Toggle mouse enhancements
+  - Increase magnification level
+  - Decrease magnification level
+  - Cycle to the next magnifier position
+  - Toggle magnifier on/off
+
+   These should help you quickly change the zoomer to best access
+   what you're working on.  These commands are "unbound," meaning
+   they do not have a keystroke assigned to them.  You can define the
+   keystrokes you would like to use on the Key Bindings pane of the
+   Orca Preferences dialog: locate each command you wish to define a
+   keystroke for, move to the Key Binding column, and press Return.
+   You'll be prompted for the new key.  Press it (rather than type it
+   out) and then press Return.  Note that these commands do not
+   permanently change the settings; they merely alter them "on the
+   fly."
+
+* Bug #503965 - Orca should provide support for the pointer
+  following focus and the zoomer
+
+  If you're using the keyboard to perform a task and then move the
+  mouse pointer, the zoomer would move away from your task and to
+  the location of the mouse pointer.  We've added two options for
+  dealing with this:
+
+  - Pointer follows zoomer (enabled by default): If the mouse
+    pointer is not on the screen when you initially move the mouse,
+    it will be moved into the zoomer so that you can continue to see
+    what you were working on.  If your preferred mouse tracking mode
+    is centered, the pointer will be moved to the center; otherwise
+    it will be moved to the item with focus.
+
+ - Pointer follows focus (disabled by default): If this option is
+   enabled, the mouse pointer will follow you as you arrow through
+   menu items and move among controls in dialog boxes.
+
+We also know we have more work to do and are tracking the work with
+these bugs:
+
+http://bugzilla.gnome.org/show_bug.cgi?id=464734
+Provide some kind of visual feedback for the item with focus
+
+http://bugzilla.gnome.org/show_bug.cgi?id=504075
+Orca should provide support for smooth/linear panning of the zoomer
+
+http://bugzilla.gnome.org/show_bug.cgi?id=504077
+Orca should support mouse bindings
+
+Firefox:
+
+* Fix for bug #451988 - Firefox: navigation by landmark
+
+  The XHTML role attribute module defines the following roles: banner,
+  contentinfo, definition, main, navigation, note, search, secondary,
+  seealso.  New functionality in Orca allows you to navigate to the
+  next and previous landmark on a page via the unbound keybindings:
+
+  - Goes to previous landmark
+  - Goes to next landmark
+
+  These commands are "unbound," meaning they do not have a keystroke
+  assigned to them.  You can define the keystrokes you would like to
+  use on the Key Bindings pane of the Orca Preferences dialog: locate
+  each command you wish to define a keystroke for, move to the Key
+  Binding column, and press Return.  You'll be prompted for the new
+  key.  Press it (rather than type it out) and then press Return.
+
+* Fix for bug #466251 - Support ARIA live regions in Firefox/Gecko.
+  http://developer.mozilla.org/en/docs/AJAX:WAI_ARIA_Live_Regions
+
+  Asynchronous JavaScript and XML (AJAX) has recently received a great
+  amount of attention, and the number of websites using or planning to
+  use the technique is increasing. AJAX enables web developers to
+  easily create sites that change areas of their content in response
+  to user actions (such as in webmail applications) or real world
+  changes (such as updates of stock prices).
+
+  http://www.w3.org/TR/aria-state/ is designed to address these
+  issues. Live region markup allows web page authors to specify when
+  and how live changes to specific areas of a web page should be
+  spoken or shown on a Braille display by a screen reader.
+
+  The support for live regions in Orca is exposed via these
+  keybindings:
+
+  r and Shift+r: go to the next and previous live region relative to
+  the current caret position
+
+  y: go to the last (or current) live region that spoke
+
+  \: cycle through the different levels of politeness
+
+  Shift+\: turn monitoring of live regions on and off
+
+  Orca+F1, Orca+F2, ..., Orca+F9: review the last nth live region
+  announcement, where n is the number of the function key (i.e., the
+  last announcement is obtained via Orca+F1, the 9th last announcement
+  is obtained via Orca+F9).
+
+* Fix for bug #473009 - Cannot arrow to the end of an HTML entry if
+  Orca is controlling the caret
+
+* Fix for bug #501447 - Orca sometimes fails to speak our location
+  when entering FF3 entries
+
+Performance and Quality:
+
+* Much work on performance (bug #491756).  If you have specific areas
+  that you think are slow, please let us know the exact details.  These
+  performance fixes also rely upon fixes being made in other modules
+  (pyorbit, pyatspi) for the GNOME 2.21.4 release.
+
+* Completed major pylinting work (bug #486726).  This helped us
+  greatly and found a few latent bugs.
+
+General:
+
+* Fix for bug #486970 - Where Am I should let you know you are in a
+  toolbar
+
+* Fix for bug #496846 - When tabbing to an editable combobox, text
+  selection should be displayed in braille
+
+* Fix for bug #503527 - Mnemonics are not supported well
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    ko      Korean               Changwoo Ryu
+    nb      Norwegian BokmÃl     Espes Stefansen and Kjartan Maraas
+    sl      Slovenian            Matej UrbanÄi
+
+==========
+
+2.21.3 - 03-Dec-2007
+
+General:
+
+* Lots and lots of pylint'ing (bug #486726)
+
+* Beginning of work on performance (bug #491576).  We still have a bit
+  of work to do.  We actually have some changes, but we're not comfortable
+  with them yet.
+
+* Fix for bug #407647 - Indicate the tree level, expanded state, and
+  child nodes in the Pidgin buddy list
+
+* Fix for bug #472665 - Speech Pane combo boxes mis-populating in Orca
+  Preferences dialog
+
+* Fix for bug #486899 - Where Am I doesn't present checkbox state in
+  tables
+
+* Fix for bug #486901 - When tabbing to a text area for a spinbox or
+  editable combobox, text selection should be presented
+
+* Fix for bug #486909 - Where Am I should say "n of m items selected"
+  and "on item x of y" in layered pane
+
+* Fix for bug #486971 - Where Am I doesn't present toggle button state
+
+* Fix for bug #486976 - Basic Where Am I in multiline text areas
+  should only present info for current line
+
+* Fix for bug #487189 - Where Am I should present accessible
+  description if it exists
+
+* Fix for bug #500193 - Update keybindings for reviewing previous
+  messages.  The keybindings have been moved from the number keys
+  to the F1-F9 keys.  Bookmarks are still on the number keys.
+
+  NOTE: this effects the Orca learn mode key.  Instead of Orca+F1,
+  it is now Orca+h.
+
+  NOTE: this effects the review of previous messages in gaim and
+  gnome-mud.  Instead of Orca+{1,2,3,...} to read the last nth
+  message, you now use Orca+{F1,F2,F3,...}.
+
+  NOTE: this also effects the debugging tools.  The new bindings
+  are Orca+Ctrl+Alt+{the following}, where {the_following} is one
+  of:
+
+  End - reportScriptInfoHandler
+  Home - printActiveAppHandler
+  Page_Up - printAncestryHandler (think "look upward in hierarchy")
+  Page_Down - printHierarchyHandler (think "look down from the top")
+
+Firefox:
+
+* Fix for bug #462883 - ARIA tooltips/alerts are not being output
+
+* Fix for bug #468551 - Support ARIA checkboxTriState
+
+* Fix for bug #469718 - Gecko.inDocumentContent() needs to account for
+  'embedded component'
+
+OpenOffice:
+
+* Fix for bug #435201 - Orca is too chatty when navigating by
+  paragraph in OOo Writer
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    gl      Galician             Ignacio Casal Quinteiro
+    hu      Hungarian            KÃlmÃn KÃmÃnczy and Gabor Kelemen
+    sl      Slovenian            Matej UrbanÄi
+
+==========
+
+2.21.2 - 12-Nov-2007
+
+General:
+
+* Fix for bug #469083 - Refactor Gecko.py's getContainingRole() to
+  take a list
+
+* Fix for bug #481488 - Implement increased support for
+  user-customized keybindings
+
+* Fix for bug #486918 - Page tab role should be presented in braille
+
+* Fix for bug #486969 - Status bar not being read with Where Am I
+
+* Fix for bug #486972 - Expanding/collapsing tree nodes in a table
+  should not speak nodename again
+
+* Fix for bug #487226 - "/" and the OrcaKey should not be hardcoded in
+  default.py:whereAmI.  There are now two handlers instead of one,
+  helping reduce a lot of confusion and complexity.  There is the
+  "Performs the where am I operation" handler (same as we used to
+  have) and the new "Speaks the title bar or status bar" handler.
+  All keybindings are still the same.
+
+* Fix for bug #487514 - Keys for navigation purposes should not be
+  echoed
+
+* Fix for bug #489875 - Some Orca macaroon oowriter and oocalc tests
+  have timeout problems
+
+* Fix for bug #489913 - Changing preferences from a test causes
+  tracebacks and spontaneous speech
+
+* Fix for bug #489928 - Orca oocalc macaroon test for bug #363804
+  doesn't completely restore initial state
+
+* Fix for bug #491417 - Orca script should inherit PATH and PYTHONPATH
+  from environment.  (Thanks David Csercsics!!!)
+
+* Fix for bug #494651 - Orca's OBJECT EVENT debug routine not
+  outputting all information for "object:selection-changed"
+  menu bar event
+
+* Additional work related to pyatspi migration (bug #489490,
+  bug #491885).  We will be looking at improving performance for the
+  next release.
+
+Firefox:
+
+* Fix for bug #485903 - Orca doesn't read message list in gmail
+
+* Fix for bug #490266 - Endless loop in navigating ARIA trees
+
+* Fix for bug #490568 - Implement Firefox page summary using
+  Collections
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    pt_BR   Brazilian Portuguese Leonardo Ferreira Fontenelle
+                                 and Tiago Melo Casal
+    nb      Norwegian BokmÃl     Espes Stefansen and Kjartan Maraas
+
+==========
+
+2.21.1 - 28-Oct-2007
+
+Things marked with a '+' indicate stuff that is not planned for a Orca
+2.20.x release.  Everything else should appear in a Orca 2.20.x
+release.
+
+General:
+
+* Fix for bug #462984 - Orca failed to detect the resolution of second screen.
+
+* Fix for bug #473699 - Adjust Orca Preferences dialog to
+  speak/braille three components that are multiply labelled.
+
+* Fix for bug #474958 - Orca has no onboard help.
+
+* Fix for bug #483018 - We should remove (or redefine) the orca speech
+  change hotkeys.  Hot keys removed per discussion on Orca user's list.
+
+* Fix for bug #484428 - Orca should not speak role for list items when
+  navigating.
+
+* Fix for bug #484499 - Orca should not braille the node level for
+  every cell in row.
+
+* Fix for bug #489604 - Enabling the attribute indicator but disabling
+  all attributes results in traceback.
+
++ Much work on bug #448848 - Port Orca to pyatspi.  The first major phase
+  is done, which was to remove Orca's atspi.py module in favor of pyatspi.py.
+  Much testing has been done, and we think we've caught all functional
+  regressions.  Much performance work remains, however.
+
++ Fix for bug #467664 - unmagnified area becomes too small to use.
+
++ Work on bug #486726 - Eliminate pychecker warnings/errors.  This was used
+  mainly as a means to help with bug #448848, but we plan to do more work
+  since it helped catch issues that have been in the code for a while.
+
++ Fix for bug #487230 - get{Speech,ShortBraille,LongBraille,Braille}ForRoleName
+  should allow role to be overridden.
+
++ Fix for bug #488391 - Orca doesn't announce finds in Gedit if combo
+  box has focus.
+
++ Fix for bug #489797 - _speakListItem defined twice in where_am_i.py.
+
++ Increased coverage of the code in the regression/assertion tests.
+
+Firefox:
+
+* Work on bug #472345 - Cannot arrow out of entries in FF3 if text is
+  inserted via javascript.
+
+* Fix for bug #480501 - readPageSummary() prevents access to FF status
+  bar contents.
+
++ Additional work for bug #478204, Orca should handle navigation around
+  HTML focusable lists better.
+
++ Fix for bug #480264 - ARIA sliders not outputting
+  Braille/childCount:embed defense.
+
+OpenOffice:
+
+* Fix for bug #376517 - Orca does not report indentation in OOo Writer
+  documents correctly.
+
+* Fix for bug #435852 - Orca and OpenOffice Calc have a memory lovefest.
+
+* Fix for bug #480278 - where-am-I ("double click") for StarOffice.py
+  smushs the output.
+
++ Fix for bug #489490 - Test for OOo Writer bug #413909 not producing the
+  correct output.
+
++ Fix for bug #490623, work around for flat_review __cmp__ issue for
+  OpenOffice.
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    sl      Slovenian            Matej UrbanÄi
+    sv      Swedish              Daniel Nylander
+
+==========
+
+2.21.0 - 03-Oct-2007
+
+Things marked with a '+' indicate stuff that is not planned for a Orca
+2.20.x release.  Everything else should appear in a Orca 2.20.x
+release.
+
+General:
+
+* Work on bug 356068 - Provide a command for identifying the default
+  button within a dialog
+
+* Fix for bug 364518 - Create a GUI interface to the pronunciation
+  dictionary
+
+* Fix for bug 455308 - Output module and voice selection with Speech
+  Dispatcher backend
+
+* Fix for bug 456970 - Orca says "0 items" for tree tables that use
+  NODE_CHILD_OF relationship
+
+* Fix for bug 457198 - Orca shouldn't exit if user-settings import
+  fails
+
+* Fix for bug 461719 - gnome-mud script failed at import
+  (Thanks Javier!!!)
+
+* Fix for bug 462650 - Traceback when using whereAmI in Evolution New
+  Contact dialog
+
+* Fix for bug 462475 - crash due Non-ASCII characters in
+  ~/.orca/user-settings.py file
+
+* Fix for bug 464855 - orca speaks/brailles scroll bar arrows as
+  anonymous "push buttons"
+
+* Work on bug 465989 - Adding panel applets.  Manage the presentation
+  of images in tables better
+
+* Fix for bug 466500 - Speech Dispatcher backend crashes with older SD
+  versions (Thanks Tomas Cerha!)
+
+* Fix for bug 466725 - Traceback when using SayAll in Gedit when text
+  lacks sentence punctuation
+
+* Fix for bug 467425 - Orca should default to an empty pronunciation
+  dictionary
+
+* Fix for bug 467425 - Orca causes pygtk application to generate
+  GtkWarning messages
+
+* Fix for bug 467563 - Speech Dispatcher backend crashes in text setup
+  (Thanks Tomas Cerha!)
+
+* Work on bug 468098 - The whereAmI implementation doesn't always
+  match the whereAmI spec
+
+* Fix for bug 469615 - A few lingering i18n issues
+
+* Fix for bug 469786 - Braille verbosity setting not reset
+
+* Fix for bug 471220 - Gaim's prefixChatMessage setting should have
+  option to only prefix non-focused tabs
+
+* Fix for bug 472407 - Orca doesn't always announce new messages
+  in unfocused tabs in Pidgin
+
+* Fix for bug 472962 - Trailing space at end of message/string
+
+* Fix for bug 473420 - Orca speaking an extra "seconds" for the
+  Preferences dialog
+
+* Fix for bug 473422 - Orca has traceback when giving focus to the
+  pidgin application
+
+* Fix for bug 473991 - Orca doesn't announce autocompleted user names
+  in Pidgin
+
+* Fix for bug 477683 - Orca failed to bring full screen mag up
+
+* Fix for bug 480331 - tree table headers should not be repeated in
+  braille
+
+* Fix for bug 480746 - Labels for panels should not be repeated in
+  braille
+
+* Fix for bug 481101 - getClickCount() sometimes returns bogus values
+
+* Fix for bug 481343 - Initial top/left/bottom/right zoomer position
+  settings don't match screen
+
++ Much work on the test harness and many new regression tests.
+  The tests are now Macaroon-based.
+
++ Fix for bug 458150 - flat-review should present slider orientation
+
++ Fix for bug 462627 - Refactor orca_prefs.py
+
++ Fix for bug 464754 - Pronunciation dictionary checks should be
+  case insensitive
+
++ Fix for bug 469098 - Orca should indicate when a new chat window/tab
+  has appeared in Pidgin
+
++ Fix for bug 472907 - Characters "ÃÂ" and "ÃÂ" shouldn't have the
+  same description
+
++ Fix for bug 472978 - Short Braille and spoken word for "dial" should
+  be different messages
+
++ Fix for bug 476639 - Remove requirement of annotating accessible
+  objects
+
+Firefox:
+
+* Fix for bug 457988 - Firefox SSL Dialogs are not read
+
+* Fix for bug 460284 - Orca should not allow the user to arrow into
+  the FF3 status bar
+
+* Fix for bug 461620 - Orca doesn't speak find results in FF3 when
+  focus is on Next/Previous buttons.
+
+* Fix for bug 466764 - Orca doesn't provide access to alerts that
+  appear when page is loading in FF3
+
+* Fix for bug 468633 - No output when tabbing to ARIA slider
+
+* Fix for bug 469686 - Sanity check needed in
+  gecko.getHeadingLevel/getNodeLevel
+
+* Fix for bug 470332 - Can no longer arrow to push buttons in FF3
+
+* Fix for bug 471537 - We need to find a way to identify truly
+  "focusable" elements in FF3
+
+* Fix for bug 471955 - Orca does not provide access to state changes
+  in HTML radio buttons in FF3
+
+* Work on bug 472029 - Cannot arrow into autocompletes in HTML forms
+  if Orca is controlling the caret
+
+* Fix for bug 472345 - Cannot arrow out of entries in FF3 if text is
+  inserted via javascript
+
+* Work on bug 472377 - Need to fix braille for radio buttons and
+  checkboxes in HTML content
+
+* Fix for bug 473585 - Caret not being set to ARIA listbox when
+  navigating to it
+
+* Fix for bug 475956 - Orca sometimes "guesses" index.htm* as the
+  base name for a link in FF3
+
+* Fix for bug 476786 - whereAmI fails in Firefox menus
+
+* Fix for bug 478204 - Orca should handle navigation around HTML
+  focusable lists better
+
+* Fix for bug 480021 - Need to handle list items in whereAmI and
+  better address XUL list items
+
+* Fix for bug 481398 - Absence of a defined speech server causes Orca
+  to fail to display its Preferences dialog
+
+* Fix for bug 481907 - Traceback in Gecko.locusOfFocusChanged()
+
++ Fix for bug 459584 - ARIA widget labels not read correctly
+
++ Fix for bug 462156 - No announcements for ARIA trees
+
++ Fix for bug 462509 - ARIA dialogs are not being announced
+
++ Fix for bug 471885 - ARIA trees should output only state change if
+  item is unchanged
+
++ Fix for bug 471878 - ARIA widgets should not echo characters during
+  traversal using arrows
+
++ Fix for bug 475177 - Support new AT-SPI event name format
+
+Thunderbird:
+
+* Fix for bug 468765 - Orca does not provide access to shortcuts for
+  FF3 or Thunderbird menu items
+
+OpenOffice/StarOffice:
+
+* Fix for bug 469367 - Orca StarOffice script not properly announcing
+  (potential) indentation in OOo Writer
+
++ Fix for bug 462256 - Orca doesn't speak/braille anything when going
+  to the 2nd screen in the OOo Presentation startup wizard
+
++ Fix for bug 465087 - Orca speaks "Available fields panel" too
+  many times with OOo sbase Tables wizard
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi
+    bg      Bulgarian            Alexander Shopov
+    da      Danish               Kenneth Nielsen
+    de      German               Jochen Skulj
+    ca      Catalan              Gil Forcada and Josep Puigdemont i Casamaj
+    el      Greek                Nikos Charonitakis
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    fi      Finnish              Ilkka Tuohela
+    fr      French               Claude Paroz and StÃphane Raimbault
+    it      Italian              Luca Ferretti
+    ja      Japanese             Takeshi Aihana
+    lt      Lithuanian           Gintautas Miliauskas and Romas MaÅeika
+    lv      Latvian              Raivis Dajus
+    mk      Macedonian           Jovan Naumovski
+    nb      Norwegian BokmÃl     Espes Stefansen and Kjartan Maraas
+    pt      Portuguese           Duarte Loreto
+    pt_BR   Brazilian Portuguese Djavan Fagundes and Raphael Higino
+                                 and Tiago Melo Casal
+    ru      Russian              Anatoly Kamynin and Maxim Dziumanenko
+    si      Sinhala              Danishka Navin
+    sq      Albanian             Laurent Dhima
+    sv      Swedish              Daniel Nylander
+    th      Thai                 Theppitak Karoonboonyanan
+    uk      Ukranian             Maxim Dziumanenko
+    vi      Vietnamese           Clytie Siddall
+
+==========
+
+2.19.6 - 29-Jul-2007
+
+General:
+
+* NOTICE: the automake requirement for Orca has been moved from
+  automake 1.7.2 to 1.9.
+
+* Work on bug 364518 - Create a GUI interface to the pronunciation
+  dictionary
+
+* Fix for bug 409731 - Orca should speak text selected by the mouse
+
+* Work on bug 415061 - regression test results should be repeatable
+
+* Fix for bug 439191 - sayAll by sentence can position the text cursor
+  in the wrong place when interrupted
+
+* Additional fix for bug 449964 - Pass the key event information to
+  the speech system to allow more advanced key echo handling (needed
+  to eliminate a stack trace)
+
+* Fix for bug 455230 - Read table cell row should insert column
+  headers for non-text cells
+
+* Fix for bug 456296 - Traceback in braille.py when doing a
+  "Select All" in gedit.
+
+* Fix for bug 459080 - Some files missing from POTFILES.in (sorry!)
+
+* Fix for bug 460215 - Include new Tango icons.  Many thanks to
+  Stephen Brandt for his work here!  The icons look sharp.
+
+Firefox:
+
+* Fix for bug 456446 - Gecko autocompletes not always spoken
+
+* Fix for bug 459618 - ARIA widgets should not consume navigation keys
+
+Thunderbird:
+
+* Fix for bug 460774 - Orca doesn't provide access to message being
+  composed in Thunderbird
+
+Java platform:
+
+* Fix for bug 458142 - flat-review does not review Swing panels with
+  titled borders
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    fi      Finnish              Ilkka Tuohela
+    lv      Latvian              Raivis Dejus
+    pt_BR   Brazilian Portuguese Leonardo Ferreira Fontenelle
+    sv      Swedish              Daniel Nylander
+
+==========
+
+2.19.5 - 09-Jul-2007
+
+General:
+
+* More work on the regression testing framework and tests
+
+* Adjusted the uppercase pitch setting so that it is still noticable
+  but not quite so high
+
+* Fix for bug 354468 - support bookmarked objects
+
+* Fix for bug 354479 - Automatic presentation of "balloon" type
+  messages
+
+* Fix for bug 375396 - Orca failed to exit after stopping the full
+  screen mag.
+
+* Tweak for the fix for bug 376515 - Add GUI support for the new
+  customizable text-attribute feature: avoid errors when ~/.orca is
+  not present
+
+* Fix for bug 382601 and bug 400720 - Orca should indicate selected
+  text on the braille display and support accurate presentation of
+  text attributes on the braille display
+
+* Work on bug 395146 - Crash at start. Try to start an HTTP server on
+  settings.httpServerPort. If this fails, retry
+  settings.maxHttpServerRetries times, each time incrementing the
+  server port number by 1. If we are still unable to start a server,
+  just fail gracefully.
+
+* Fix for bug 436888 - Include widget status information in speech and
+  braille for flat review
+
+* Fix for bug 438333 - Need to present progress bar activity
+
+* Fix for bug 439191 - sayAll by sentence can position the text cursor
+  in the wrong place when interrupted
+
+* Fix for bug 442069 - Unneeded gnome-speech drivers not stopped when
+  GUI setup window is dismissed
+
+* Fix for bug 446881 - Orca braillegenerator code assumes that what's
+  in a table is a table cell
+
+* Fix for bug 449964 - Pass the key event information to the speech
+  system to allow more advanced key echo handling (thanks Tomas Cerha!)
+
+* Fix for bug 449978 - Punctuation keys not echoed (thanks Tomas Cerha!)
+
+* Fix for bug 450037 - Password field for gdm speaks characters you
+  type instead of "star star star star"
+
+* Fix for bug 450213 - should acc._narrow(Accessibility.Accessible) be
+  a SEVERE error?
+
+* Fix for bug 451531 - Orca failed to report the conversation message
+  of pidgin.  This was solved by simply mapping the gaim script to pidgin
+
+Firefox:
+
+* Fix for bug 409728 - Orca repeats mouse-selected text numerous times
+  in Gecko
+
+* Fix for bug 447191 - Firefox read page summary
+
+* Fix for bug 448096 - Orca does not provide access to progress bars
+  for FF3 downloads
+
+* Fix for bug 449171 - Orca gets stuck in endless loops on woot.com
+
+* Fix for bug 449232 - Firefox move to next large object additional
+  tweak
+
+* Fix for bug 453229 - Orca should honor the repeated character count
+  setting in Firefox
+
+Thunderbird:
+
+* Fix for bug 449152 - Cannot create a new message in thunderbird
+  while using Orca
+
+OpenOffice:
+
+* Fix for bug 450210 - StarOffice.py needs null-check for
+  self.getFrame(event.source)
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    ta      Tamil                I. Felix
+    vi      Vietnamese           Clytie Siddall and Nguyán ThÃi Ngác Duy
+
+==========
+
+2.19.4 - 17-Jun-2007
+
+General:
+
+* Fix for bug 376515 - Add GUI support for the new customizable
+  text-attribute feature. There is a new "Text Attributes" pane in
+  the Orca preferences dialog for this. It can also be set on an
+  individual app-specific basis.
+
+* Fix for bug 433818 - Messages on system tab of gnome-system-monitor
+  are not reported by Orca.
+
+* Fix for bug 433951 - making changes in the Orca Preferences dialog
+  causes loss of script state.
+
+* Fixes for bug 435199 - Orca is bloating the swap partition, so the
+  system is no more usable after a short time.  We did a lot of
+  analysis of Orca's memory usage and patched the leaks we were able
+  to detect.  There is still a leak in the AT-SPI infrastructure; it
+  is being worked on by the AT-SPI maintainers and is tracked via bug
+  446277.
+
+Firefox:
+
+* Fix for bug 442709 - Need to do "combo box cleanup"/refactor for
+  Firefox.
+
+* Fix for bug 443337 - Orca should not use the alt text if it is empty
+  to infer a link name.
+
+* Fix for bug 444148 - Orca doesn't speak form fields at landsend.com
+
+* Fix for bug 445578 - Link preview information would be desirable for
+  Firefox.  This is obtained when performing a "Where Am I" operation
+  (KP_Enter for desktop bindings, ORCA_MODIFIER+Return for laptop
+  bindings).  Many thanks to new community member Scott Haeger for
+  this functionality!
+
+Java platform:
+
+* Fix for bug 435553 - KeyError: 'startOffset' during Java Control
+  Panel flat-review.
+
+* Fix for bug 436658 - flat-review speaks "filler" for SwingSet2
+  demo/source tabs.
+
+* Fix for bug 436661 - flat-review speaks SwingSet2 toolbar image
+  paths instead of item names.
+
+* Fix for bug 437226 - Orca should handle Java labels and text where
+  LABEL_FOR is not set.
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    dz      Dzongkha             Pema Geyleg
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+
+==========
+
+2.19.3 - 04-Jun-2007
+
+General Orca:
+
+* Make checkbox and radio button indicator strings customizable
+  (thanks Mario Lang!)
+
+* Present checkbox and radio button indicators before label/name in
+  braille (thanks Mario Lang!)
+
+* Fix for bug 345399 - Key echo missing alpha numeric and punctuation
+  keys
+
+* Fix for bug 349394 to make Speech Dispatcher Factory work better
+  with Orca GUI preferences (thanks Tomas Cerha!)
+
+* Fix for bug 376015 - [a11y] time-admin time servers table is not
+  accessible
+
+* Fix for bug 412837 - Need a single number to summarize test code
+  coverage
+
+* Fix for bug 434600 - cursor routing keys cannot be used to position
+  caret at end of line
+
+* Fix for bug 435226 - Where-am-I doesn't correctly handle multiple
+  selected paragraphs in OOo Writer and Evolution
+
+* Fix for bug 439155 - Flat review is broken in gcalctool
+
+* Fix for bug 439487 - Combobox role not shown in braille in 'brief'
+  verbosity mode
+
+* Fix for bug 439509 - Run Application Dialog prints entered text
+  twice in braille (thanks Mario Lang!)
+
+* Fix for bug 440592 - Orca doesn't speak gcalctool's status bar
+  correctly
+
+* Fix for bug 440294 - Voice Properties in Speech Dispatcher backend
+  (thanks Tomas Cerha!)
+
+* Fix for bug 441640 - Rename processCursorKey to processRoutingKey
+  (thanks Mario Lang!)
+
+* Fix for bug 441673 - Define InputEventHandler.__eq__
+  (thanks Mario Lang!)
+
+* Fix for bug 441723 - Orca should not speak "double prime" for the
+  number 3
+
+* Fix for bug 443012 - atspi.py:_onParentChanged upsets
+  atspi.py:_cache in a bad way
+
+Firefox:
+
+* Fix for bug 407941 - Infer labels for objects in HTML content
+
+* Fix for bug 414657 - Linked headings should be announced as both
+  heading and link
+
+* Fix for bug 420540 - Firefox keyboard control wish list. Q/Shift+Q
+  can now be used to navigate among blockquotes.
+
+* Fix for bug 423435 - Orca is too chatty when loading a page in
+  Firefox
+
+* Fix for Bug 433655 - Orca's structural navigation should wrap at the
+  end of a page
+
+* Fix for bug 437753 - Orca should speak and braille the current locus
+  of focus after a page is loaded in Firefox and then start reading
+  the page
+
+* Fix for bug 437986 - Orca should not first speak page and frame
+  title when opening a menu in firefox
+
+* Fix for bug 439286 - Gecko.py's find{Next,Previous}Object fails when
+  object is document_frame.
+
+* Fix for bug 440079 - Orca cannot arrow past certain combo boxes in
+  Firefox
+
+* Fix for bug 440529 - Orca bounces out of Firefox Help Contents tree
+  and into the document frame
+
+* Fix for bug 441476 Orca should attempt to detect erroneously-marked
+  list labels in Firefox
+
+* Fix for bug 441484 - Need to adjust Firefox form field navigation to
+  accommodate Firefox changes.
+
+* Fix for bug 441610 - Orca should identify bogus/redundant checkbox
+  labels in Firefox.
+
+* Fix for bug 442083 - Orca skips over empty entries with Up/Down
+  Arrow in Firefox
+
+* Fix for bug 442691 - Form field structural navigation is slow to and
+  in large lists
+
+* Fix for bug 443067 - sayAll by sentence skips content that is
+  in HTML tables in Firefox
+
+* Fix for bug 443337 - Orca should not use the alt text if it is empty
+  to infer a link name
+
+* Fix for bug 443650 - Orca "loops" on certain pages in Firefox
+
+OpenOffice:
+
+* Work on bug 435199 - Orca is bloating the swap partition, so
+  the system is no more usable after a short time (improvements
+  made to OpenOffice script)
+
+* Additional fix for bug 435201 - Orca is too chatty when navigating
+  by paragraph in OOo Writer
+
+* Fix for bug 435226 - Where-am-I doesn't correctly handle multiple
+  selected paragraphs in OOo Writer and Evolution
+
+* Fix for bug 435852 - Orca and OpenOffice Calc have a memory lovefest
+
+Java platform:
+
+* Fix for bug 435825 - Non-ORBit object typecodes ignored when
+  instantiating stubs.  NOTE: this was a pyorbit fix from Peter Parente
+  that had a major impact on a number of bugs we were running into with
+  the Java platform.  Thanks so much, Peter Parente!
+
+* Fix for bug 436674 - flat-review only visits right-most tree nodes
+  in SwingSet2 JTree demo
+
+* Fix for bug 437049 - Orca does not speak Java Control Panel spinbox
+  changes
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    de      German               Jochen Skulj
+    sv      Swedish              Daniel Nylander
+    en_GB   English/British      David Lodge
+
+==========
+
+2.19.2 - 13-May-2007
+
+General Orca:
+
+* Typo fixes from Mario Lang (thanks Mario!)
+
+* Updates to the specification
+
+* Additions to the regression tests
+
+* Fix for bug 368640 - Allow user to optionally ignore or be notified
+  of tool tips
+
+* Fix for bug 372273 - Add ability to configure app-specific settings
+  via GUI. NOTE: Adjusted ORCA_MODIFIER+Control+Space to now bring
+  up the application-specific preferences dialog. The previous usage
+  (reload user settings) is now gone.
+
+* Fix for bug 400716 - sayAll should be done by sentences
+
+* Fix for bug 432674 - In password entries, Orca should respect key
+  echo settings and say "star" for the inserted characters
+
+* Fix for bug 432685 - Using brltty can consume all the CPU
+
+* Fix for bug 433146 - Add ability to configure app-unique settings
+  via GUI
+
+* Fix for bug 434394 - orca -t causes traceback
+
+* Fix for bug 434948 - KP_Insert+Shift cannot be used as modifiers in
+  an entry
+
+* Fix for bug 435223 - Where-am-I doesn't correctly identify multiple
+  selected objects in Nautilus
+
+* Fix for bug 435577 - Orca does not speak labels of embedded
+  components in gnome-panel
+
+* Fix for bug 437004 - Add in hooks for allowing
+  activation/deactivation script methods
+
+Firefox:
+
+* Fix for bug 407663 - Support the "Find" operation in Firefox
+  better.  Requires Firefox 3 from at least May 9, 2007.
+
+* Fix for bug 412677 - Navigation to links with { overflow:hidden }
+  stylesheet results in bad behavior
+
+* Partial fix for bug 420540 - Firefox keyboard control wish list.
+  ORCA_MODIFIER+Z will now toggle the structural navigation keys
+  on/off.
+
+* Fix for bug 422924 - Add more support for accessing HTML tables in
+  Firefox.  Orca now supports non-uniform
+  tables: When you navigate to a non-uniform table using T or
+  Shift+T, Orca will indicate that this is a non-uniform table.
+  When using structual navigation by cell, if the cell you navigate
+  to has multiple headers that apply to it such as "week 2" and
+  "Thursday", Orca will speak those headers if they are different from
+  the headers from your previous location.  Orca also announces cell
+  coordinates when navigating using structural navigation among cells.
+  And, finally, Orca announces cells that span more than one row or
+  column.  Of course, depending on your preferences, that's a lot
+  of verbiage.  Therefore, these are all customizable settings.
+
+* Fix for bug 423427 - Need to add form field structural navigation in
+  Firefox.  ORCA_MODIFIER+Tab should move you to the next form field
+  and ORCA_MODIFIER+Shift+Tab should move you to the previous form
+  field.
+
+* Fix for bug 423435 - Orca is too chatty when loading a page in
+  Firefox
+
+* Fix for bug 428114 - Orca should attempt to detect
+  erroneously-marked combo box labels in Firefox
+
+* Fix for bug 436718 - Navigating in focusable lists in FF 7 May build
+  hangs Orca
+
+OpenOffice:
+
+* Fix for bug 363804 - Add ability to turn off coordinate announcement
+  when navigating in Calc
+
+* Fix for bug 433398 - Orca does not provide access to the state of
+  checked menu items in OOo
+
+* Fix for bug 435201 - Orca is too chatty when navigating by
+  paragraph in OOo Writer
+
+* Fix for bug 435307 - OOo Calc output traceback for
+  UnboundLocalError: local variable 'focusRegion' referenced before
+  assignment
+
+* Fix for bug 435852 - Orca and OpenOffice Calc have a memory lovefest
+
+Java platform:
+
+* Pending fix for bug 436674 - flat-review only visits right-most tree
+  nodes in SwingSet2 JTree demo
+
+* Fix for bug 437049 - Orca does not speak Java Control Panel spinbox
+  changes
+
+New and updated translations (THANKS EVERYONE!!!):
+
+    en_GB   English/British      David Lodge
+
+==========
+
+2.19.1 - 23-Apr-2007
+
+* Turn on Orca's caret navigation mode by default for Firefox.
+  NOTE TO USERS: you can still toggle between Orca's caret navigation
+  mode and Firefox's (i.e., Gecko) navigation mode by pressing
+  Insert+F12.
+
+* Much work on bug 400716 and 426360 (Firefox) to provide "say all"
+  support by sentences.
+
+* Fix for bug 430278 to improve the "where am I" functionality.  This
+  also includes bug 427481 to fix the "where am I" feature of the
+  Evolution Mail...Tasks toggle buttons.  This also is related to
+  the fix for bug 423011 to finish the refactor of where_am_I module
+  to have knowledge of the script it is working with.
+
+* Fix for bug 426336 to refactor the find{Next,Previous}Role methods
+  in Gecko.py for Firefox.  In addition, list navigation (L and
+  Shift+L) is now restricted to ordered/unordered lists.  Before, form
+  field lists were included because they, too, have a role of
+  ROLE_LIST.
+
+* Fix for bug 426684 to speak the entry text in Firefox when the caret
+  is at the end of the line.
+
+* Fix for bug 427722 to prevent web page navigation from getting stuck
+  on separators.
+
+* Work on bug 411261 to prevent Orca from saying just "Link" when
+  arrowing up and down by line in some web content in Firefox.
+
+* Fix for bug 426687 to only speak the entry text when arrowing up and
+  down in a text entry field in Firefox.
+
+* Fix for bug 413990 to provide more smarts in Orca to detect tables
+  that are used for layout only purposes.
+
+* Fix for bug 414926 to present level of headings in Firefox.
+
+* Fix for bug 423198 to prevent Orca from speaking "text" repeatedly
+  when moving around in a text entry area on a web page in Firefox.
+
+* Fix for bug 416971 to speak and braille numbers and bullets of
+  list items.
+
+* Fix for bug 432674 to respect key echo settings and say "star" when
+  speaking characters inserted into password entry fields.
+
+* Fix for bug 398009 to present the tooltip text for an object.
+  NOTE TO USERS: the standard toolkit method for brining up a tooltip
+  is Ctrl+F1 when the object has focus.
+
+* Fix for bug 368626 to prevent gnome-panel from crashing when it
+  pops up a tooltip.
+
+* Fix for bug 423849 to reduce the chattiness of speech context.
+
+* Fix for bug 427880 to restore metacity behavior of presenting the
+  name of the window to get focus when you're doing an Alt+Tab.
+
+* Fix for bug 413109 to add combobox and slider mnemonics to the
+  Orca preferences dialog.
+
+* Fix for bug 425498 to provide option to allow user to quit Orca
+  without needing to go through the "quit" confirmation dialog.
+
+* Fix for bug 413109 to address HIG violations.  Thanks to Calum
+  Benson for his work here.
+
+* Fix bug 423738 to use gconf module methods instead of using exec.
+
+* Work on bug 422487 to move the caret the first line of a message in
+  in Evolution.  There are still issues with HTML messages, which may
+  require changes in Evolution itself.  We're tracking this with the
+  Evolution RFE: http://bugzilla.gnome.org/show_bug.cgi?id=423395.
+
+* Workaround for Evolution bug 347964 to provide better user feedback
+  when deleting messages in Evolution.
+
+* Fix for bug 418147 to make sure we treat characters in strings as
+  characters and not as bytes when spelling an item.
+
+* Fix for bug 430434 to make the key echo settings be enabled by
+  default.
+
+* Fix for bug 430726 to implement GNOME GOAL #4.
+
+* Updated orca man page.
+
+* Updated the user experience specifications.
+
+* NOTE TO TRANSLATORS: finish first major pass on bug 412200 to
+  address I18N/L10N issues.  We are now ready for you to take a
+  look and give us feedback.
+
+* New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi
+    en_GB   English/British      David Lodge
+    es      Spanish              Francisco Javier Dorado Martinez and
+                                 Jorge Gonzalez
+    sv      Swedish              Daniel Nylander
+
+==========
+
+2.19.0 - 27-Mar-2007
+
+* Fix for bug 410302 to provide support for the gnome-mud application.
+  (Thanks to community member Javier for this contribution!!!).
+
+* Fix for bug 349394 to roll in experimental speech dispatcher
+  support.  NOTE: SPEECH DISPATCHER IS STILL UNSUPPORTED AT THIS TIME.
+  USE AT YOUR OWN RISK.  (Thanks to community member Tomas Cerha for
+  this contribution!!!).
+
+* Fix for bug 395548 to refactor util.py into default.py.  This allows
+  subclasses to more easily provide specialized behavior.
+
+* Fix for bug 402494 to refactor how 'for' statements are used.
+
+* Fix for bug 419089 to refactor speech and braille generators in
+  StarOffice.py script to use self._script.
+
+* Fix for bug 419006 to refactor acroread.py to remove global methods.
+  This also takes care of a side effect of the refactoring work done
+  in bug 395548.
+
+* Work on bug 423011 to refactor the where_am_I module to know about
+  the script that is using it.
+
+* Fix for bug 319778 to remove hierarchical_presenter (we'll rely on
+  an external utility, such as Accerciser, to provide this functionality).
+
+* Fix for bug 420173 to prevent the Escape key from becoming bound
+  when exiting learn mode.
+
+* Fix for bug 423009 to prevent Orca from speaking the role name
+  "list item" on web pages.
+
+* Fix for bug 418430 to handle empty sections in Firefox.
+
+* Fix for bug 423214 to use 1 through 6 and Shift+1 through Shift+6 to
+  navigate among headings by level.
+
+* Work on bug 414926 to speak heading levels in Firefox (still need
+  to add braille).
+
+* Fix for bug 422924 to add table navigation in Firefox.  T and
+  Shift+T move you among tables.  Alt+Shift+{Left,Right,Up,Down} will
+  move you among table cells. Alt+Shift+{Home,End} will move you to
+  the{top,bottom} of the current table.
+
+* Fix for bug 417001 to add link structural navigation. U moves you to
+  the next unvisited link; Shift U to the previous unvisited link; V
+  to the next visited link; Shift V to the previous visited link.
+
+* Fix for bug 416853 to prevent structural navigation keys from
+  interfering with shortcuts. Ctrl+o and Ctrl+h now work as expected.
+
+* Fix for bug 416908 to add list structural navigation.  L moves you
+  to the next list; Shift L moves you to the previous list.
+
+* Fix for bug 423537 to add list item structural navigtion.  I and
+  Shift I move you among list items.
+
+* Fix for bug 416857 to reposition caret better in HTML content after
+  leaving and returning to the content (e.g., opening a separate
+  dialog and then closing it).
+
+* Fix for bug 423531 so O and Shift O do not stop on images and now
+  say "large objects" instead of "chunks".
+
+* Fix problem with SayAll where the speech engine might not give us a
+  callback if we pass it nothing or text that is just whitespace.
+
+* Fix for bug 416964 to account for "no break space" character in word
+  delimiters.
+
+* Fix for bug 404052 to let the user know the Preferences dialog is
+  loading.
+
+* Fix for bug 402192 to speak text that is pasted in by a middle mouse
+  click.
+
+* Fix for bug 392939 so that the dash character ("-") is spoken when
+  used as a negative sign at "some" punctuation.
+
+* Fix for bug 350674 to announce when a new folder is opened and
+  announce number of items.
+
+* Work on bug 415061 to help make regression test results repeatable.
+
+* Work on bug 412837 and bug 416332 to measure and increase testing
+  coverage.
+
+* Updates to the specification.
+
+* New and updated translations (THANKS EVERYONE!!!):
+
+    ca      Catalan              Gil Forcada and Josep Puigdemont i Casamaj
+    da      Danish               Peter Bach
+    de      German               Hendrik Richter and Jochen Skulj
+    en_GB   English/British      David Lodge and Gareth Owen
+    nb      Norwegian BokmÃl     Kjartan Maraas and Sigurd Gartmann
+
+==========
+
+2.18.0 - 12-Mar-2007
+
+* See http://live.gnome.org/TwoPointSeventeen/ReleaseNotes/Orca for a
+  summary of what's changed since Orca v1.0.0.  The remainder of these
+  NEWS entries cover what's changed since Orca v2.17.92.
+
+* Much more work on Gecko.py support for Firefox.  Firefox support
+  still has a ways to go, both inside Firefox itself and inside Orca.
+
+* Much more work on Gecko.py support for Thunderbird.  Thunderbird
+  support still has a ways to go, both inside Thunderbird itself and
+  inside Orca.
+
+* Implemented GNOME GOAL #3 - removed "Application" from Categories in
+  desktop file.
+
+* Work to make sure Orca still works with the latest gnome-mag release.
+
+* Updated man page.
+
+* Fix for bug 413457 to prevent Orca from speaking various names for
+  the "-" character twice in a row in German.
+
+* Adjusted StarOffice.py to prevent a traceback in face of some regressions
+  in oowriter.
+
+* Support for better filtering of events in debug logs.
+
+* New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Khaled Hosny and Djihed Afifi
+    bg      Bulgarian            Alexander Shopov, Rostislav Raykov,
+                                 Vladimir Petkov, and Iassen Pramatarov
+    ca      Catalan              Gil Forcada and Josep Puigdemont i Casamaj
+    de      German               Hendrik Richter and Jochen Skulj
+    dz      Dzongkha             Pema Geyleg
+    en_GB   English/British      David Lodge and Gareth Owen
+    fi      Finnish              Ilkka Tuohela
+    fr      French               Jonathan Ernst and StÃphane Raimbault
+    gu      Gujarati             Ankit Patel
+    hu      Hungarian            KÃlmÃn KÃmÃnczy and Gabor Kelemen
+    it      Italian              Luca Ferretti
+    ko      Korean               Changwoo Ryu
+    lt      Lithuanian           Åygimantas BeruÄka and Gintautas Miliauskas
+    mk      Macedonian           Jovan Naumovski
+    pt      Portuguese           Duarte Loreto
+    pt_BR   Brazilian Portuguese Raphael Higino, Og Maciel, Jonh Wendell and
+                                 FÃbio Nogueira
+    ru      Russian              Nickolay V. Shmyrev
+    sv      Swedish              Daniel Nylander
+    uk      Ukrainian            Maxim Dziumanenko
+    zh_HK   Traditional Chinese  Chao-Hsiung Liao and Woodman Tuen
+    zh_TW   Traditional Chinese  Chao-Hsiung Liao and Woodman Tuen
+
+==========
+
+2.17.92 - 26-Feb-2007
+
+* Much more work on Gecko.py support for Firefox.  Firefox support
+  still has a ways to go, both inside Firefox itself and inside Orca.
+
+* Fix for bug 412058 to terminate the python process better when it
+  receives a TERM signal.  Note that one must send the TERM signal
+  directly to the Python process.  Sending it to the shell script
+  won't do since the shell script turns around and does a kill -9 on
+  the Python process when it gets a TERM signal.  The motivation for
+  this is to better support the code coverage analysis work that is
+  being done by Lynn Monsanto.
+
+* Work on bug 354479 to announce what we can about changes to the
+  battery status.  There are currently issues with the AT-SPI
+  support from the Galago support used by gnome-panel that prevent
+  us from doing a more effect job here.
+
+* Fix for bug 407480 to prevent "orca --help" and other informative
+  commands from killing other Orca processes that might be running.
+
+* Fix for bug 409708 to remove unnecessary code from Thunderbird
+  script now that a few Thunderbird bugs have been fixed.
+
+* Fix for bug 405541 to better handle Thunderbird message summary
+  list in braille.
+
+* Fix for but 408174 to make laptop keybindings work better
+  (Thanks to community member Juan Ramon Jimenez for this fix!!!).
+
+* Fixed for bug 405624 so Orca wille report a label even if it was
+  same as previous one.
+
+* New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Khaled Hosny and Djihed Afifi
+    bg      Bulgarian            Alexander Shopov
+    en_GB   English/British      David Lodge
+    fi      Finnish              Ilkka Tuohela
+    fr      French               Jonathan Ernst and StÃphane Raimbault
+    it      Italian              Luca Ferretti
+    ko      Korean               Changwoo Ryu
+    nb      Norwegian BokmÃl     Kjartan Maraas and Sigurd Gartmann
+    pl      Polish               Artur Flints and GNOME PL Team
+    pt      Portuguese           Duarte Loreto
+    sv      Swedish              Daniel Nylander
+    zh_CN   Simplified Chinese   Funda Wang and Abel Cheung
+    zh_HK   Traditional Chinese  Chao-Hsiung Liao and Woodman Tuen
+    zh_TW   Traditional Chinese  Chao-Hsiung Liao and Woodman Tuen
+
+==========
+
+2.17.91 - 11-Feb-2007
+
+* Fix for bug 385949: Better handling of comboboxes in Firefox 3.0.
+
+* Work on bug 363830: announce when bold, underline, italics, and
+  the various alignment toggle buttons change state in OpenOffice.
+  (Thanks for the fix, Joanie!)
+
+* Fix for bug 397787: Orca now handles if OpenOffice recovery mode
+  better.
+
+* Fix for bug 405541: provide better handle brailling of message
+  summaries in Thunderbird message summary list.
+
+* Fix for bugs 403767 and 405562: provide better support for
+  autocompletion components in Thunderbird.
+
+* Fix for bug 398531: handle the speech preferences tab page better.
+
+* Fix for bug 380050: Orca windows are now focused after user
+  presses "Quit" or "Preferences" button in Orca Preferences
+  window.  (Thanks for testing, Joanie!)
+
+* Work on bug 400763: much improvement to the responsiveness after
+  starting an update from the update manager.
+
+* Fix for bugs 400766 and 348464: better handling of autocomplete
+  entries in GTK widgets as used by the "Run..." dialog and Evolution.
+
+* Continued work on Gecko.py script for Firefox 3.0.  We're getting
+  there step by step, and it requires work both inside Firefox 3.0
+  and inside Orca.
+
+* Updated to support latest BrlAPI.  Orca should now work various
+  versions of BrlTTY and BrlAPI.
+
+* New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi and Khaled Hosny
+    ca      Catalan              Gil Forcada and Josep Puigdemont i Casamaj
+    en_GB   English/British      David Lodge
+    fr      French               StÃphane Raimbault, Robert-Andrà Mauchin
+                                 and Jonathan Ernst
+    it      Italian              Luca Ferretti
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    sv      Swedish              Daniel Nylander
+    th      Thai                 Supranee Thirawatthanasuk and
+                                 Theppitak Karoonboonyanan
+    zh_HK   Traditional Chinese  Chao-Hsiung Liao
+    zh_TW   Traditional Chinese  Chao-Hsiung Liao
+
+==========
+
+2.17.90 - 21-Jan-2007
+
+* Much more work on the Gecko script (to support both Firefox and
+Thunderbird).  Please note that this is still a work in progress
+and much more work needs to be done both inside Orca and inside
+Firefox and Thunderbird.  We're working very very hard.
+
+* More work on the Thunderbird script to accommodate some unique
+aspects of the Thunderbird UI.  We've also logged several bugs
+with the Thunderbird folks to help address these things.
+
+* Fix for bug 376791: Orca now provides better access to the buddy
+list in Gaim 2.0.0 beta 5.
+
+* Fix for bug 397797: Orca now exposes the language attribute of a
+speech synthesizer voice to allow people to more easily disambiguate
+voices.
+
+* Fix for bug 394397: Orca now handles arrowing to the end of a line
+better and prevents the line from being spoken again.
+
+* Fix for bug 392939: "-" is now spoken spoken when used as a negative
+sign at "some" punctuation.
+
+* Fix for bug 395749: make sure we reference any_data values when we
+get an event rather than waiting to work with them asynchronously.
+
+* Added new 'attributes' field to the Python Accessible class
+defined in at-spi.py.  This allows scripts to more easily access
+the attributes of an AT-SPI object.
+
+* New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi and Mohamed Magdy
+    bg      Bulgarian            Alexander Shopov
+    de      German               Hendrik Richter
+    en_GB   English/British      David Lodge
+    mk      Macedonian           Jovan Naumovski
+    sv      Swedish              Daniel Nylander
+
+==========
+
+2.17.5 - 07-Jan-2007
+
+* Brand new script for Adobe Acrobat Reader from Joanie Diggs (Thanks
+  Joanie!!!).  NOTE:  there are still some accessibility issues to
+  be worked out with the team at Adobe, but this script helps provide
+  some level of access to PDF documents via Reader.
+
+* Much more work on Gecko.py script for Firefox 3.0.  There's still
+  much more work to do in the Firefox 3.0 internals as well as the
+  Gecko.py script.  We're still working feverishly on it.
+
+* Update to outloud.py to add more voices and prevent crash when
+  ViaVoice is used (thanks to community member Bart Bunting!!!)
+
+* Adjusted bleeding edge Orca code to work with bleeding edge BrlAPI
+  code.  We expect there to be one more change in BrlAPI 0.5.0 before
+  it stabilizes, but it wasn't ready at the time of this release.
+
+* Work on bug 350233 (actually an RFE): New script for the Liferea
+  application from community member Francisco Javier Dorado MartÃnez
+  (thanks Javier!!!).
+
+* Work on bug 376517: Orca now speaks the unit of measure (pixels)
+  after the left-margin and/or right-margin text attributes if they
+  differ from the norm.
+
+* Work on bug 347124: Added feature to allow user to tell gksu to
+  disable keyboard grabs.  This is just one of the several pieces
+  of the puzzle to help prevent hangs when launching sysadmin apps
+  from the desktop of a non-root user.
+
+* Fix for bug 393074: Repeated characters are now correctly read.
+  (Thanks to Juan Ramon Jimenez for this fix!!!).
+
+* Fix for bug 362546: Fixed problem speaking status bar contents
+  (Insert+KP_Enter) when the status bar is a single component (e.g.,
+  text field), rather than a container with multiple
+  sub-components.
+
+* Moved the keyboard layout to the first tab in the preferences
+  dialog.
+
+* Fix for bug 388620: Fixed wording of "not not" string.
+
+* Fix for bug 388317: Prevent crash in Adobe Acrobat Reader (thanks
+  Joanie!!!).
+
+* Fix for bug 387556: Make arrowing to end of line in OOo consistent
+  with what happens in gedit (thanks Joanie!!!).
+
+* Fix for bug 388039: prevent stack trace when running orca -t.
+
+* Fix for bug 386267: In Evolution, Orca now speaks/brailles the
+  unread status instead of the read status in the message summary
+  list.
+
+* Fix for bug 382890: Extended dynamic row and column header support
+  to OOo Writer tables.
+
+* New and updated translations (THANKS EVERYONE!!!):
+
+    ar      Arabic               Djihed Afifi
+    en_GB   English/British      David Lodge
+    es      Spanish              Francisco Javier F. Serrador
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    sv      Swedish              Daniel Nylander
+
+==========
+
+2.17.4 - 17-Dec-2006
+
+* Added new support to edit your key bindings from the Orca
+  preferences dialog (thanks Jorge SandÃn <jorges elsendero es>!!!)
+
+* Added new implementation of "Where Am I" based upon the discussion
+  on the Orca user's list (thanks for your work, everyone!).
+
+* Fix for bug 382891: Flat review now works in the face of empty text
+  areas (thanks Joanie Diggs!!).
+
+* Fix for bug 381391: Flat review initialization now handles
+  situations where the caret is at the end of a text area (thanks
+  Joanie Diggs!!).
+
+* Fix for bug 382408: Eliminated significant sluggishness when
+  navigating in OOo Writer tables (many thanks to our Orca users
+  for speaking up about this!).
+
+* Fix for bug 382495: orca --setup is now localized (thanks Takao!).
+
+* Fix for bug 382418: Orca now announces when you enter/leave a table
+  in OOo Writer documents.
+
+* Fix for bug 382880: Orca now provides speech output when tabbing
+  among cells in OOo Writer documents.
+
+* Fix for bug 382888: Orca now announces when you cross a cell boundary
+  in OOo Writer tables.
+
+* Fix for bug 382415: Orca now honors speak cell/row setting in OOo
+  Writer tables.
+
+* Fix for bug 384393: Orca now reports bold or underline in OOo Writer
+  when Insert F is pressed (this was a regression).
+
+* Fix for bug 375395: Orca now speaks blank lines in Evolution when
+  appropriate.
+
+* Allow Orca to run better under gdm for accessible login.  With this
+  work, we've been informed by the gdm maintainer that Orca is the
+  first assistive technology ever that can run without requiring gdm
+  to have a home directory. NOTE: the typical line to add to
+  /etc/X11/gdm/modules/AccessKeyMouseEvents is something like the
+  following, depending upon what you want Orca to do when it starts:
+
+  <Control>o  1 1000 10000  /bin/sh -c "GTK_MODULES=gail:atk-bridge ctrun -l child -i none orca -n -d main-window"
+
+* Improved support for BrlTTY v3.8.  Orca will now first attempt to
+  use the new Python bindings for BrlAPI 0.5 (which is what comes with
+  BrlTTY v3.8) and then fallback to its own bindings for BrlAPI 0.4.1
+  (which is what comes with BrlTTY 3.7.2).  When using BrlTTY v3.8,
+  Orca is now a better BrlTTY citizen: Orca only consumes BrlTTY
+  events that it cares about, and Orca is also smarter about which TTY
+  it chooses. NOTE: Our plan is to eventually retire Orca's BrlAPI 0.4.1
+  Python bindings as BrlAPI 0.5 becomes more prevalent.
+
+* More work done with Gecko.py (the Firefox script), but there's still
+  a lot of work to do here, both on the Firefox and Orca
+  implementations.
+
+* More work done with Thunderbird, but there's still a lot more work
+  to be done with it as well, both on the Firefox and Orca
+  implementations.
+
+* Improvements and additions to the Orca regression test harness.
+
+* New and updated translations (THANKS!):
+
+    es      Spanish              Jorge SandÃn and Francisco Javier F. Serrador
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    sl      Slovenian            Matic Zgur
+
+==========
+
+2.17.3 - 03-Dec-2006
+
+* Implementation of RFE 373566: Added support to switch between
+  desktop and laptop bindings.  Also added support for allowing the
+  Caps Lock key to act as the Orca modifier.
+
+* Added feature to the preferences dialog to present the key bindings
+  as progress towards RFE 354970.  Many thanks to Jorge SandÃn for
+  this work!
+
+* Implementation of RFE 354463 - The "Find" command is now working,
+  with the exception of bug 381391.  Many thanks to Joanie Diggs for
+  her hard work on this!
+
+* Implementation of RFE 376002: Added command line options to tell
+  Orca to start with speech, braille, and/or magnification.  This
+  is mostly to aid things such as accessible installs and logins.
+
+* Work on RFE 371122: much of the "Where am I" command has been
+  implemented, though we're still testing and refining it.
+
+* A fair amount of work has been done on the Gecko script for Firefox 3.
+  Please note this is still a work in progress and is still somewhat
+  unstable.  The Orca and Firefox teams are working feverishly on the
+  support and are still targetting Firefox 3 for compelling web
+  access.
+
+* Continued work on identifying (and resolving when possible) accessibility
+  issues in other applications.  Please do a search on the "orca" component
+  at http://bugzilla.gnome.org for summaries containing the "[blocked]"
+  string to get a list.
+
+* In the callback for the Cancel button on the Orca Preferences
+  window, the code has been adjusted to destroy that window, so that
+  the next time the user displays the Preferences dialog, all of the
+  settings will reflect the current running state rather than how the
+  user left the GUI components before hitting the Cancel button.
+
+* Fix for bug 372808: Orca now reports the appropriate header
+  information when tabbing between tables.
+
+* Fix for bug 377085: family-name text attribute are no longer
+  malformed for multi-word family names.
+
+* Implementation of RFE 377955: Suggested additions to pronunciation
+  dictionary.
+
+* Fix for bug 376347: Orca no longer speaks new-line in the
+  Evolution menu bar.
+
+* Fix for bug 372964: Added text-attribute settings.
+
+* Fix for bug 376006: Handle minimum increment value of 0.0 when
+  calculating decimal places to present for sliders.
+
+* Fix for bug 358467: Mapped the time-admin to the users-admin
+  script so that Orca can correctly read the table of time servers.
+
+* Change for bug 364529. Initial value in the Preferences Glade file
+  for pitch is now 5.0 and not 9.0.  Also allow voice styles to be
+  undefined.  The hypertext link voice will now initially derive
+  its values from the default voice settings.
+
+* Partial fix for bug 356060: Provide access to tree item level and
+  state in OOo Navigator.
+
+* Defensive fix for bug 353432: Orca no longer announces name changes
+  for objects who tell us their name has changed when it really
+  hasn't.
+
+* Work on bug 363815: Implement the ability to have application
+  specific settings.
+
+* Fix for bug 364452: make sure Orca's name shows up as "orca" and not
+  "-c" in at-poke.
+
+* Fix for bug 319666: Orca now announces "0 items" when encountering
+  various empty objects.
+
+* Fix for bug 381653: Orca now announces the new state of a checkbox
+  when it is changed inside a table cell.
+
+* More work on the specification and regression test suite.
+
+* New and updated translations (THANKS!):
+
+    et      Estonian             Ivar Smolin and Priit Laes
+    hu      Hungarian            KÃlmÃn KÃmÃnczy and Gabor Kelemen
+    sv      Swedish              Daniel Nylander
+
+==========
+
+2.17.2 - 05-Nov-2006
+
+* Updates to requirements and specifications documents.
+
+* Fair amount of work on Gecko.py script, though it is not at all ready
+  for compelling access to Firefox (and hence the web) yet.  Also did
+  a fair amount of work looking at flat review and filing a number of
+  bugs against the AT-SPI implementation in progress in Firefox 3.
+
+* Fix for bug 369292: gcalctool now speaks the new result when
+  the "=" button is activated.
+
+* Fix for bug 337063: Orca now supports an alternate .orca location via
+  the -u and --user-prefs-dir command line options.
+
+* Fix for bug 365939: reading of message list in Evolution now provides
+  more concise information for check box items.
+
+* For for bug 353422: Mapped vte application to gnome-terminal script and
+  also fixed the "backspace" problem in gnome-terminal.
+
+* Workaround for bug 368626: prevent gnome-panel from crashing and add
+  some defensive code to work in the case where there is no event
+  source in an at-spi event.
+
+* Fix for bug 338838: Orca now speaks "newline" only when moving by
+  character or word.
+
+* Fix for bug 358467: Orca now reads check items status
+  in "Users and groups" dialog of users-admin application.
+
+* Fix for bug 355733: SayAll function now works better for OpenOffice.
+
+* Fix for bug 364086: Orca no longer reports "paragraph 0 paragraph"
+  when you begin typing in a OpenOffice Calc cell.
+
+* Fix for bug 363801: Orca provides confirmation when dynamic row and/or
+  column headers are set.  In addition, column numbers in OpenOffice
+  Calc are now spoken as column letters.
+
+* Fix for bug 363807: Orca now reports the number of items in a table.
+
+* Fix for bug 321184: Orca now supports a custom pronunciation dictionary.
+
+* Fix for bug 363802: Orca no longer says "cell" when navigating from
+  cell to cell in OpenOffice Calc.
+
+* Fix for bug 363796: Second press of a letter in learn mode now provides
+  the phonetic ("military") spelling of the letter.
+
+* Fix for bug 355525: Orca handled EMBEDDED_OBJECT_CHARACTERs in text
+  better.
+
+* Fix for bug 357063: If there are a bunch of repeated characters
+  (like the greater thans) on a line that also has text, Orca respects the
+  punctuation settings in Orca.  But, if the repeated characters are on
+  a line by themselves (i.e.  30 greater thans, nothing else), Orca
+  indicates their presence ("30 greater than characters") regardless
+  of the level of punctuation.
+
+* Fix for bug 344249: Orca reports menu mnemonics as part of the
+  "Where am I" functionality.
+
+* Fix for bug 348975: the state for radio buttons is now spoken prior
+  to the role.
+
+* Fix for bug 363423: Orca now speaks the "Applications" menu if it is
+  brought up while the focus is in a GAIM chat window.
+
+* Fix for bug 349956: Orca no longer causes the gedit Print Dialog to slow
+  down.
+
+* Fix for bug 361624: Flat review no longer fails to move to second
+  column of text in OOo Writer documents.
+
+* Fix for bug 357829: Use real active descendant of a table cell when
+  looking for locus of focus in flat review.
+
+* Fix for bug 341406: Orca now presents results when finding files.
+
+* Fix for bug 319783: Orca now speaks/brailles the insensitive states
+  of objects if they are insensitive.
+
+* Fix for bug 338111: Use new BrlAPI Python bindings if they exist.
+
+* Fix for bug 348693: Announcement of new mail in Evolution is now
+  toggleable via Insert-m.
+
+* Fix for bug 361670: flat review no longer fails after minimizing the
+  Orca main window.
+
+* Fix for bug 355893: Network Preferences "Port" label is now reported
+  by Orca.
+
+* New and updated translations (THANKS!):
+
+    et      Estonian             Ivar Smolin and Priit Laes
+    nb      Norwegian BokmÃl     Kjartan Maraas
+    sv      Swedish              Daniel Nylander
+
+==========
+
+2.17.1 - 14-Oct-2006
+
+* Implemented RFE 361167: add use of Insert+r and Insert+c as a means
+  to specify dynamic column headers and dynamic row headers in Open
+  Office spreadsheets.
+
+* Fixed bug 361747: provide support for the 'weight' text attribute.
+  Also make sure that character text attributes are handled correctly.
+
+* Implemented RFE 319657: In gedit, Orca now speaks the context of
+  search ('find') results.
+
+* Implemented RFE 339789: Added code to "Where Am I" to report the
+  number of items in menus and submenus as well as the current
+  position of a menu item or menu in its menu.
+
+* Fix for bug 350523: In gcalctool, give reference to accessible name
+  of a button over the text that is being displayed on a button.
+
+* Added use of Python logging API to log speech and braille at the
+  INFO level.  This will dovetail in with the larger testing work
+  being done for GNOME.
+
+* Fix for bug 350219: provide announcement when you create a new
+  document for the very first time in Open Office.
+
+* Fix for bug 354785: read the entire line in the "Process Fields"
+  preferences table in gnome-system-monitor. Fix involved a rework
+  of how table cells are brailled and spoken.
+
+* Fix for bug 349954: do not make assumptions that UTF-8 strings
+  contain only single byte characters.  Handle this by converting
+  to the Python unicode type before doing processing such as
+  string length and character analysis.
+
+* Added 'getText' method to script to provide a means for the script
+  to work around shortcomings in some accessible text implementations.
+
+* Exploratory work on the Gecko.py script to help debug and provide
+  an understanding of what the Gecko AT-SPI implementation is providing
+  us.
+
+* Added ZONE support for goBegin and goEnd functions of flat review
+  (thanks Joanie Diggs!)
+
+* Improvements to the test harness.  NOTE: as a result of the GNOME
+  Boston 2006 Accessibility Summit, we may revise this harness as
+  the overall testing strategy for GNOME develops.
+
+* New and updated translations (THANKS!):
+
+    et      Estonian             Ivar Smolin
+
+==========
+
+2.17.0 - 04-Oct-2006
+
+* Updates to user requirements and functional specification.
+
+* Added Orca man pages.
+
+* New and improved regression test harness.
+
+* Added new Orca main window to allow one to have a GUI option for
+  quitting Orca and invoking the configuration settings.  The appearance
+  of this window can be enabled/disabled in the new "General" tab
+  of the configuration dialog.  Also added "Apply" button the configuration
+  GUI window.
+
+* Added new Orca "Quit" dialog.
+
+* Refactor in default.py and other scripts to add isTextArea method to
+  determine if an object is a text area or not.  This allows us to deal
+  with the growing number of things that are text areas, but choose to
+  give themselves different roles (e.g., GTK's 'text', OpenOffice's
+  'paragraph', and Gecko's 'entry').
+
+* Added Gecko.py toolkit script to cover apps that use the Mozilla
+  Gecko toolkit (e.g., Firefox, Thunderbird, Yelp, etc.).  Some work
+  done with new Firefox 3 at-spi implementation, but much work is
+  still needed.
+
+* Added repeated character count handling (rfe/bug 354469).
+
+* Added military spelling (rfe/bug 354460).
+
+* Fix for bug 351957: Orca now allows the setting of the source and target
+  displays for magnification.
+
+* Fix for bug 351569: no longer hang when gnome-keyring password box
+  appears.
+
+* Fix for bug 344192: no longer hang when the "bug buddy" dialog
+  appears.
+
+* Fix for bug 355602: $ was being echoed twice in terminal with word
+  echo enabled.
+
+* Fix for bug 357150: use 'append' instead of 'extend' to avoid
+  spelling out the 'No focus' message.
+
+* Fix for bug 358508: use obj instead of event.source in
+  visualAppearanceChanged for speech.
+
+* Fix for bug 353532: provide a workaround for a java-access-bridge
+  bug (bug 355011) where popup menu events are not sent to Orca.
+
+* Fix for bug 353531: 'checked'/'unchecked' are no longer reported
+  twice for check boxes in java applications.
+
+* Fix for bug 357556: Insert key no longer sticks after running test
+  keystroke files. The hot-key to start/stop recording of keystrokes
+  within Orca has been reverted to just "Pause".  Also adjusted the
+  "don't write pause keystrokes" code to recognize F21 (which is the
+  Pause key on my Sun type 6 keyboard).
+
+* Partial work on bug 354970: add command_name dictionary from Jorge
+  Sandin (thanks Jorge!).  Also refactored the way keybindings and
+  braille bindings are defined and obtained to make it easier to
+  discover and override their definitions.
+
+* Partial work on bug 349954: become more cognizant of multibyte UTF-8
+  characters.
+
+* Fix for bug 357509: Flat review now uses the "uppercase" voice
+  settings for uppercase text when navigating by line.
+
+* Fix for bug 357507: SayAll now uses the "uppercase" voice settings
+  for uppercase text.
+
+* Fix for bug 356970: repeated character count now works with Evolution
+
+* Fix for bug 356911: Orca no longer generates a traceback with
+  Numpad-Minus when positioned at the end of a line.
+
+* Fix for bug 356179: the test in Orca to determine if the desktop
+  is running now works better.
+
+* Fix for bug 340849: Orca now provides an option to allow the user to
+  automatically logout of the GNOME desktop if the gconf accessibility
+  flag wasn't previously enabled before running the setup utility.
+
+* Fix for bug 355927: duplicate window titles are now spoken when
+  navigating between them using Alt+Tab.
+
+* Fix for bug 350216: "LAYERED_PANE" is no longer in speech context.
+
+* Fix for bug 351797: make sure configuration GUI pops to top.
+
+* Fix for bug 347128: allow pan buttons to be used on braille display
+  while in learn mode.
+
+* Fix for bug 347650: allow a script to determine if it is the active
+  script or not (compare self to orca_state.activeScript).
+
+* For for bug 354983: From Rodrigo Moya <rodrigo novell com> (THANKS!) - fill
+  in dead code paths in brlmodule.c.
+
+* Fix for bug 354487: apostrophe no longer delimits a word boundary.
+
+* Fix for bug 354985: gedit script no longer generates a traceback due to
+  a missing import line.
+
+* Fix for bug 342602: StarOffice Writer table cell speaking order fixed.
+
+* Fix for bug 351826: change orca shell script from sh to bash to allow
+  it to better respond to "kill -HUP" signals.
+
+* Fix for bug 352866: add "-q" and "--quit" usage information
+
+* Fix for bug 353600: don't require the user to be root when doing a
+  "make distcheck".
+
+* New and updated translations (THANKS!):
+
+    dz      Dzongkha             Pema Geyleg
+    el      Greek                Simos Xenitellis
+    es      Spanish              Francisco Javier F. Serrador
+    et      Estonian             Priit Laes
+    gl      Galician             Ignacio Casal Quinteiro
+    th      Thai                 Supranee Thirawatthanasuk
+    tr      Turkish              Deniz Kocak and Baris Cicek
+
+==========
+
+1.0.0 - 04-Sep-2006
+
+* Updates to User's Guide, Architecture, Requirements, and Script Writing
+  Guide.
+
+* Fix for bug 353467: run in a terminal if we detect text setup will
+  be used.
+
+* Fix for bug 353476: apply better fallback algorithm to find a
+  working synthesis engine.
+
+* Fix for bug 352578: ensure that checking/unchecking speech in the
+  configuration GUI does the appropriate thing.
+
+* Refixed bug 350854 and fix for bug 353268: do not double read lines
+  in OpenOffice and also make sure focus is properly handled in gedit
+  after a window maximize.
+
+* Fix for bug 353237: prevent COMM_FAILURE messages when trying to get
+  the object state (thanks Oana from Baum!).
+
+* Fix for bug 352866: add "-q" and "--quit" options to orca script to
+  allow one to more easily kill orca (thanks Javier from ONCE!).
+
+* Fix for bug 352240: prevent wrong object report for Java
+  applications in case of different event ordering (thanks Oana from
+  Baum!).
+
+* Fix for bug 352257: improved isSameObject() function (thanks Oana from
+  Baum!).
+
+* Fix for bug 352254: better handling of expand/collapse events for the
+  Java platform (thanks Oana from Baum!).
+
+* Translations:
+    bg      Bulgarian            Alexander Shopov, Rostislav Raykov,
+                                 Vladimir Petkov, and Iassen Pramatarov
+    bn      Bengali              Runa Bhattacharjee
+    bn_IN   Bengali              Runa Bhattacharjee
+    ca      Catalan              Gil Forcada and Josep Puigdemont i Casamaj
+    cs      Czech                Miloslav Trmac
+    cy      Welsh                Rhys Jones
+    de      German               Hendrik Brandt
+    dz      Dzongkha             Guntupalli Karunakar
+    el      Greek                Nikos Charonitakis
+    en_CA   English/Canada       Adam Weinberger
+    en_GB   English/British      David Lodge and Gareth Owen
+    es      Spanish              Francisco Javier F. Serrador
+                                 and Maria Majadas
+    eu      Basque               IÃaki LarraÃaga Murgoitio
+    fi      Finnish              Ilkka Tuohela
+    fr      French               Cedric Corazza, Robert-Andrà Mauchin,
+                                 and Christophe Merlet
+    gu      Gujarati             Ankit Patel
+    hi      Hindi                Rajesh Ranjan
+    it      Italian              Aldo Giambelluca and Alessio Frusciante
+    ja      Japanese             Satoru Satoh
+    ko      Korean               Changwoo Ryu
+    lt      Lithuanian           Åygimantas BeruÄka and Gintautas Miliauskas
+    lv      Latvian              Raivis Dejus
+    mk      Macedonian           Jovan Naumovski
+    ml      Malayalam            Ani Peter
+    mr      Marathi              Rahul Bhalerao
+    nb      Norwegian BokmÃl     Kjartan Maraas and Sigurd Gartmann
+    ne      Nepali               Pawan Chitrakar and Shiva Prasad Pokharel
+    nl      Dutch                Tino Meinen, Elros Cyriatan, Taco Witte,
+                                 Vincent van Adrighem, and Wouter Bolsterlee
+    or      Oriya                Subhransu Behera
+    pa      Punjabi              Amanpreet Singh Alam
+    pt_BR   Brazilian Portuguese Raphael Higino, Gustavo Noronha Silva,
+                                 and EstÃvÃo Samuel ProcÃpio
+    pt      Portuguese           Duarte Loreto
+    ru      Russian              Nickolay V. Shmyrev
+    rw      Kinyarwanda          Steve Murphy, Philibert Ndandali,
+                                 Viateur Mugenzi, NoÃlla Mupole,
+                                 Carole Karema, Jean Baptiste Ngendahayo,
+                                 Augustin Kiberwa, and Donatien Nsengiyumva
+    sr Latn Serbian              Danilo Åegan
+    sr      Serbian              Danilo Åegan
+    sv      Swedish              Christian Rose and Daniel Nylander
+    ta      Tamil                I. Felix
+    uk      Ukrainian            Maxim Dziumanenko
+    vi      Vietnamese           Clytie Siddall
+    zh_CN   Simplified Chinese   Funda Wang and Li Shaojie
+    zh_HK   Traditional Chinese  Chao-Hsiung Liao and Woodman Tuen
+    zh_TW   Traditional Chinese  Chao-Hsiung Liao and Woodman Tuen
+
+==========
+
+0.9.0 - 21-Aug-2006
+
+* Updates to the requirements guide and input and output style guides.
+
+* For regression testing purposes, allow us to get what would have
+been spoken even if settings.speechServerFactory is None.
+
+* Improvements to the "orca" shell script.  Provides better
+availability and also provides a better means for killing/restarting
+Orca.
+
+* New orca.desktop file and icon.
+
+* New latent support to allow the setting of the source and target
+displays for magnification.  If it exists,
+settings.magnifierTargetDisplay will be treated as an X Window System
+DISPLAY string (e.g., ":0.1") that says where to display the magnified
+area (the default is split screen magnification on the primary
+display).  If it exists, settings.magnifierSourceDisplay will be
+treated as an X Window System DISPLAY string (e.g., ":0.0") that says
+what is to be magnified.
+
+* Many thanks to our friends at Baum for providing many fixes and testing
+for the Java platform:
+
+   * Fix for bug 351891: provide better handling when receiving an
+     active descendant changed for an object with no active
+     descendant.
+
+   * Fix for bug 350740: report combo box selection change for Java
+     applications.
+
+   * Fix for bug 350736: better presentation for focused lists in Java
+     applications.
+
+   * Fix for bug 350739: improve list navigation for the Java platform.
+
+   * Fix for bug 350724: improve handling of LABEL_FOR and LABELLED_BY
+     objects.
+
+   * Fix for bug 351914: provide better support for combo boxes on
+     Java platform.
+
+   * Fix for bug 352233: prevent exception when getting the child of
+     an object from a Java application.
+
+   * Fix for bug 352238: do not assume last input event was a keyboard
+     event.
+
+* Fix for bug 350213: provide defensive programming for combo box
+braille generator.
+
+* Fix for bug 351501: do not generate a traceback when trying to
+braille Evolution message folder tree.
+
+* Fix for bug 350854: handle object:state-changed:focused events so
+Orca will recognize when GEdit's edit area has focus again after a
+maximize/unmaxmize of GEdit's window on GNOME 2.15/16.
+
+* Fix for bug 352073: provide "gnome-python with bonobo" hint for
+missing dependency.  Also provide a note at the end providing a more
+obvious message when support for BrlTTY/BrlAPI cannot be found.
+
+* Fix for bug 351847: add defensive code in the event the AT-SPI
+implementation gives us a cycle when looking at the
+RELATION_NODE_CHILD_OF relation.
+
+* Fix for bug 349465: take some defensive actions in the event that
+the AT-SPI implementation has implemented getTextAtOffset incorrectly
+(i.e., it gives back garbage for offsets).
+
+* Fix for bug 350218: GtkDemo Editable cells tree demo no longer
+speaks both cells in a row
+
+* Fix for bug 350294: Eliminate TypeError in _initGUIState in GUI prefs.
+
+* Fix for bug 350212: Improve speaking of Spin Button changes.
+
+* New/Updated Translations (Thanks!):
+    Catalan:     Josep Puigdemont i Casamajà (NEW)
+    Chinese:     (Traditional Hong Kong) Chao-Hsiung Liao
+    Chinese:     (Traditional Taiwan) Chao-Hsiung Liao
+    Dutch:       Tino Meinen and Vincent van Adrighem
+    Dzongkha:    Guntupalli Karunakar
+    Finnish:     Ilkka Tuohela
+    German:      Hendrik Brandt
+    Greek:       Nikos Charonitakis
+    Gujarati:    Ankit Patel
+    Japanese:    Satoru SATOH (NEW)
+    Korean:      Changwoo Ryu (NEW)
+    Lithuanian:  Åygimantas BeruÄka (NEW)
+    Macedonian:  Jovan Naumovski
+    Marathi:     Rahul Bhalerao (NEW)
+    Norwegian:   (BokmÃl) Sigurd Gartmann
+    Oriya:       Subhransu Behera (NEW)
+    Russian:     Nickolay V. Shmyrev (NEW)
+    Spanish:     Francisco Javier F. Serrador
+    Swedish:     Danial Nylander
+    Ukrainian:   Maxim Dziumanenko
+    Vietnamese:  Clytie Siddall
+
+==========
+
+0.2.8 - 06-Aug-2006
+* Orca has been approved for inclusion into GNOME 2.16!!!  YEAH!
+  Thanks everyone for your support.
+* Many thanks also to the team from Baum for their contributions in
+  improving the support for the Java platform.
+* Much improvement in the reliability and availability department.
+  Thanks very much to community members for helping test Orca and
+  provide us with constructive feedback and informative bug reports.
+  These community members include: Joanmarie Diggs, Al Puzzuoli,
+  Fco. Javier Dorado MartÃnez, and Cody Hurst.
+* Improvements to Yelp access.
+* Improvements to Firefox 2 chrome.  NOTE: we are targeting Firefox 3
+  as the means for providing compelling access to web content.
+* The main 'orca' executable is now a shell script that launches the
+  Python process for orca.  It includes some utilities to clean up
+  stray processes and latent support to automatically detect failures
+  in Orca and restart it if necessary.  We will be improving this
+  script prior to the GNOME 2.16 release.  Your testing and feedback
+  will be helpful!
+* Improved support for the emacspeak speech service, including better
+  ACSS support for DECtalk and overall support for rate/pitch
+  parameters.  Many thanks to Joanmarie Diggs for her contributions to
+  this space.  The community model works!
+* Fix for bug 347691: In standard print dialog, printer table items
+  not always spoken/displayed.
+* Fix for bug 345462: Orca should speak changes when moving up a level
+  in menus.
+* Fix for bug 341371: Orca will not report the file name in file
+  picker when there is only one file existing in current folder.
+* Fix for bug 319738: The child routine() needs to be more careful
+  about indices out of bounds.
+* Fix for bug 319660: Exiting learn mode should display current locus
+  of focus.
+* Fix for bug 348980: Get braille cursor routing keys working again.
+* Fix for bug where window activated and deactivated events can arrive
+  out of order.  Thanks to Baum for this fix!
+* Defensive programming in the event that expected object specializations
+  (e.g., text, component, selection, etc.) don't exist.  Thanks to Baum
+  for this fix!
+* Created orca.desktop to add orca to menu items.
+* Migrated to LINGUAS model (http://live.gnome.org/GnomeGoals/PoLinguas).
+* Added additional testing and debugging utilities.  Also added
+  additional helper lines to ~/.orca/user-settings.py that make
+  it more convenient to turn on/off various debugging and testing
+  utilities.
+* Pychecker fixes and also eliminated circular imports in the python
+  modules.
+* Additional keystrokes files for testing.  We're ramping up our regression
+  tests and hope to have a more complete set by the GNOME 2.16
+  release.
+* Provide smoother handling of the crosswires and cursor in the
+  magnifier when tracking the mouse.
+* New/Updated Translations (Thanks!):
+    Latvian:     Raivis Dejus
+    Macedonian:  Jovan Naumovski
+    Dutch:       Tino Meinen and Vincent van Adrighem
+    Gujarati:    Ankit Patel
+    Spanish:     Francisco Javier F. Serrador
+    Greek:       Nikos Charonitakis (NEW)
+
+==========
+
+0.2.7 - 24-Jul-2006
+* Much work on hangs.  It's better, but we still have work to do.
+* Vastly improved work with GAIM.  Also added Insert+{1,2,3,...} to
+  allow you to read the last n messages.
+* Fix bug 348084 - fail gracefully if speech is not available.
+* Handle situations where the label the label for a FILLER or PANEL is
+  done by placing an unbound label as the first child of the
+  FILLER/PANEL and the content of the FILLER/PANEL is the second
+  child.
+* Fix bug 348131 - make SayAll perform properly in Evolution.
+* Moved the Orca specific keybindings out of the init() routine in
+  orca.py over to the setupInputEventHandlers and getKeyBindings()
+  routines in default.py.
+* Reworked how Orca handles "no focus."  It is much better now.
+* Added new keynames for various keys.
+* Fixed bug #347228 - correctly identify state of top level item in
+  some tree tables.
+* Improved access to Evolution and StarOffice set up wizards.
+* Additional work on access to the Java platform.
+* Added in support for numeric keypad 8 double-clicking, which spells
+  the current line, and numeric keypad 5 double clicking, which spells
+  the current word.
+* Translations:
+    Latvian:     Raivis Dejus
+    Spanish:     Francisco Javier F. Serrador
+    Gujarati:    Ankit Patel
+    Norwegian:   Kjartan Maraas
+    Dzongkha:    Guntupalli Karunakar
+    Finnish:     Ilkka Tuohela
+    Bulgarian:   Alexander Shopov
+    Bengali:     Runa Bhattacharjee
+    Macedonian:  Jovan Naumovski
+    Hindi:       Rajesh Ranjan
+    Dutch:       Tino Meinen and Vincent van Adrighem
+    Welsh:       Rhys Jone
+    Tamil:       I. Felix
+
+==========
+
+0.2.6 - 09-Jul-2006
+* Addition of verbalized punctuation settings.
+* Addition of spoken indentation information for lines.
+* Adjustments to brief verbosity settings for speech.
+* Additional work on automatic reading of the entire row for a table cell,
+  which is controlled by the orca.settings.readTableCellRow property.
+* Additional work on the StarOffice script to better support
+  configuration wizards.
+* Additional work on Evolution to better support configuration wizards.
+* Very preliminary support for the Java platform.
+* Moved a number of utilities from various places to util.py.
+* Moved http server support into its own module.  Note that
+  orca.settings.speechServerPort is now defunct and has been replaced
+  by orca.settings.httpServerPort.
+* Fixes for reading table row and column headers.
+* Fix for bug 347054 to allow readTableCellRow and speechVerbosityLevel
+  settings to be set properly from the configuration GUI.
+* Fix for bug 343897 to allow configuration GUI to pop to top when it
+  is shown.  This requires a more recent version of PyGTK (2.9.3) to work.
+* Fix for bug 341388 to stop speech for an object when its window loses focus.
+* Fixes for bug 343133 to do defensive programming in flat review to
+  help prevent hangs.
+* Fix for bug 345472 to not assume the last input event was a keyboard event.
+* More work on bug 319652 to reduce even more hangs.
+* Fix for bug 344880 - process command line arguments even if a11y is not
+  enabled.
+* Updates to the style guide.
+* Translations to date (many thanks!):
+    Bengali:     Runa Bhattacharjee
+    British:     David Lodge and Gareth Owen
+    Bulgarian:   Alexander Shopov
+    Canadian:    Adam Weinberger
+    Chinese:     (Simplified) Funda Wang
+    Czech:       Miloslav Trmac
+    Dutch:       Tino Meinen, Taco Witte, Elros Cyriatan,
+                 and Vincent van Adrighem
+    Dzongkha:    Guntupalli Karunakar
+    Finnish:     Ilkka Tuohela
+    French:      Christophe Merlet
+    German:      Hendrik Brandt
+    Gujarati:    Ankit Patel
+    Hindi:       Rajesh Ranjan
+    Italian:     Alessio Frusciante
+    Kinyarwanda: Steve Murphy
+    Macedonian:  Jovan Naumovski
+    Nepali:      Pawan Chitrakar
+    Portuguese:  (Brazilian) Raphael Higino, Gustavo Noronha Silva,
+                 and EstÃvÃo Samuel ProcÃpio
+    Serbian:     Danilo Åegan
+    Spanish:     Francisco Javier F. Serrador
+    Swedish:     Christian Rose
+    Tamil:       I. Felix
+    Ukrainian:   Maxim Dziumanenko
+    Vietnamese:  Clytie Siddall
+    Welsh:       Rhys Jones
+
+==========
+
+0.2.5 - 11-Jun-2006
+* Re-map keyboard bindings and add additional keyboard bindings.
+  See http://live.gnome.org/Orca/KeyboardCommands for the list.
+* Improvements to StarOffice support to provide better access to text
+  documents and spreadsheets.  Also get rid of spurious "0.00" text
+  that was showing up in braille for StarOffice buttons.
+* Addition of announcing text selection as it is selected and unselected.
+* Generalize the "read table cell row" functionality.  If you press
+  Insert+F11, it will toggle the feature to read the entire row of
+  a table or just the selected table cell when you move from row to row.
+* Improved support for SayAll of text objects (SayAll for flat review
+  is still on the to do list).
+* Addition of self-voicing module to tell Orca to be quiet when a
+  self-voicing application is present.
+* Addition of ability to turn Orca into a speech server that can
+  accessed via simple HTTP commands (default port is 20433, but this
+  is customizable via orca.settings.speechServerPort).  This will
+  allow self-voicing applications to use Orca for their speech, thus
+  letting them get the user's speech settings preferences.
+* Addition of orca.settings.enableBrailleGrouping (default=False).
+  NOTE: this represents a change in the UI for Orca - the behavior to
+  date has been to always group menu items on the braille display.
+  The system responsiveness was bad for large menus, however, so we
+  decided to make this an optional feature turned off by default.
+* Addition of utility to report information on the currently active
+  script.  This is primarily for helping script writers do debugging
+  and is accessed by pressing Insert+F3.
+* Addition of orca.settings.cacheAccessibles (default=True) as a
+  means to turn the local caching of accessible objects on or off.
+  This is primarily an orca developer debugging feature.
+* Fix for bug 344218 - gnome-terminal would not be presented properly
+  if it was started after Orca.
+* Fix for bug 343666: pressing buttons on braille displays could cause
+  a hang.
+* Partial fix for bug 342022 - provide some defensive mechanisms to help
+  prevent some hangs.
+* Fix for bug 343133 - do not hang when doing a flat-review of a man
+  page in gnome-terminal.
+* Fix for bug #343013 - the command line option strings should not be
+  translatable.
+* Partial fix for bug 319652 - become a better Python thread citizen
+  to help reduce hangs.
+* Fix for bug 342303 - stop speech when the user presses the mouse button.
+* Fix for bug 342122 - use all labels for an object when presenting
+  an object.
+* Fix for bug 342133 - do not read all labels in gnome-window-properties
+  application when it appears.
+* Fix for bug 341415 - when moving between workspaces with metacity,
+  eliminate redundant output and also make sure workspace names are
+  announced.
+* Refactor of various modules to move script writing utilities into
+  util.py.
+* More fleshing out of the test plan.
+
+==========
+
+0.2.4 - 15-May-2006
+* Addition of text and GUI preferences configuration tools.
+  NOTE: 0.2.4 eliminates orca-setup and replaces it with the
+  "--setup" (GUI or text, depending upon your environment),
+  "--gui-setup" (GUI), "--text-setup" (text), "--no-setup"
+  (bypass any automatic setup mechanism - useful for running
+  with gdm accessible login) command line options to the
+  "orca" command.  You can also bring up the GUI while orca
+  is running by pressing Insert+space.
+  WARNING: 0.2.4 also introduces an incompatible change to
+  the configuration file and requires you to "rm -rf ~/.orca"
+  and rerun orca setup.
+* Fix for bug 340662 - do not require the desktop to be running
+  to set up orca preferences.
+* Addition of support for magnification similar to that in
+  Gnopernicus.
+* Fix for bug 331512 - addition of key and word echo.  We need
+  community feedback on this.
+* Work on specifying the external dependencies for building
+  and running Orca.
+* Fix for bug where metacity workspaces (accessed via
+  Ctrl+Alt+Arrow) were being announced as inaccessible.
+* Work on dealing with the Java platform giving us
+  CORBA::Unknown objects instead of Bonobo::Unknown objects.
+  Java platform support, however, still has a long way to go.
+* Work on coping with CORBA COMM_FAILURES a little better.
+* Fix for bug 338097 - better support for the "planner"
+  application.
+* Work for bug 338890 - add ""--version" option to orca to
+  output the version.  Orca also now uses the getopt facility
+  to get command line options.
+* Fix for bug 340773 - focus events were interrupting the
+  automatic reading of dialog boxes.
+* Fix for bug 340625 - better handling of table cells.
+* Fix for bugs 340559, 337371 - reduce repetitive output of
+  slider values.
+* Fix for bug 319732 - move .label logic from atspi.spi to
+  something that can be more easily overridden by scripts.
+* Fix for bug 340481 - combo box updates were not being
+  handled correctly.
+* Fix for bug 340305 - combo box labels were not being presented.
+* Fix for bug 340556 - radio button group names were not being
+  presented.
+* Fix for bug 338839 - allow speech to be enabled/disabled using
+  Insert+s.
+* Fix for bug 339932 - shutdown orca better on Ctrl+C from
+  the command line.
+* Fix for bug 339927 - use floating point values for speech
+  rate, gain, and pitch to provide finer granularity of settings.
+* Fix for bug 341415 - attempt to listen for AT-SPI events and
+  present accessible information even if no accessible windows
+  are active when orca starts.
+* Work on bug 340849 - automatically enable desktop accessibility
+  if needed and remind the user to log out and log back in for
+  this to take effect.
+* Additions to and development of the test plan.
+
+==========
+
+0.2.3 - 22-Apr-2006
+* Many changes to the way settings are handled, including allowing them
+  to be dynamically reloaded at run time.
+* Nascent support for configuration GUI (still needs work).
+* First pass at key and word echo (still needs work).
+* Added support for ~/.orca/orca-customizations.py, a file that will
+  not be overwritten, but will also be loaded if it exists.
+* New settings.orcaModifierKeys setting to allow the user to specify
+  which key(s) are to be used as the Orca modifier key.
+* Refactor of script.py to include methods for getKeyBindings,
+  getBrailleBindings, getInputEventHandlers, and getListeners to make it
+  easier for subclasses to override these things.
+* Provide support to allow a script on a toolkit basis versus just being on
+  a per app basis.
+* Fixed the way localized files were being found and used.
+* Reduced repetitive verbosity.
+* Reincorporated nascent support for magnification (still needs work).
+* Updates to the requirements document.
+* Make metacity script recognize apps started after Orca was started.
+* New script for planner.
+* Better handling of spell checking in StarOffice, Evolution, and GEdit.
+* More reliable synchronization of local Accessible cache.
+* Fixes for bugs 338687, 334294, 319643, 319789, 330631, 319651,
+  339690, 334893, 338240, 337857, 337704, 337709, 337489, 337322,
+  336648, 330487.
+
+==========
+
+0.2.2 - 17-Mar-2006
+* CSUN release - the bits we plan to show at CSUN '06.
+* Add output of text attributes at caret - press Insert+f (Rich Burridge)
+* Pre-filter TTS strings to prevent them from being interpreted as commands
+  by DECtalk (Willie Walker)
+* Default to using BrlTTY if it is available (Willie Walker)
+* Fix for bug 333168: scripts were not being reclaimed (Willie Walker)
+* Add extra KeySyms to account for Solaris keyboard layouts (Willie Walker)
+* Beginning of util.py for common script utilities (Rich Burridge and
+  Willie Walker)
+* Fix for speechgenerator._getSpeechForTableCell (Rich Burridge)
+* More work on Evolution script (Rich Burridge)
+* Work on StarOffice script, including spell checking (Rich Burridge)
+* Fix for bug 333765 to allow Orca to better clean up when shutting
+  down under adverse conditions (Willie Walker)
+* Fix for bug 333792 and also provide better fallback for broken
+  speech drivers (Willie Walker)
+* Fix for bug 333915 to transform unicode ellipses into "..." (Willie Walker)
+* Use window manager struts for braille monitor and also adapt better to
+  dynamic changes in size (e.g., themes using larger fonts)
+* Provide better support for accessible login via gdmlogin.
+* A little more work on the Firefox script, but Firefox/Orca are still
+  not ready for prime time (Willie Walker)
+
+==========
+
+0.2.1 - 22-Feb-2006
+* *Much* work on Evolution script - this far outshadows much of the
+  other work done for this release (Rich Burridge and Mike Pedersen)
+* Various code cleanup (Willie Walker and Rich Burridge)
+* Introduction of prototype testing harness (Willie Walker)
+* Creation of bugs/* to keep track of external bug dependencies (team)
+* Additional debug features (Willie Walker):
+  > Insert+Ctrl+F5 - cycle through debug levels
+  > Insert+F7      - print ancestry for locus of focus
+  > Insert+Ctrl+F7 - print entire application hierarchy for app with locus
+                     of focus
+* Minor enhancement to flat review to attempt to better handle parents
+  that manage a very large number of descendants (Willie Walker)
+* Take better care when installing on 64-bit platforms (Willie Walker)
+* Fix gaim.py to better handle text areas (bug 325917) (Willie Walker)
+* Support ABI incompatible change made to AT-SPI 1.7.0 (Willie Walker)
+* Use EventDetails.host_application if it is available (Willie Walker)
+* Internationalize script mappings.
+* Some work with OOo and its new UNO<->ATK bridge (Willie Walker)
+* Allow scripts to be picked up from . directory where orca is run
+  (Willie Walker).
+* Added braille monitor - add useBrailleMonitor=True to
+  ~/.orca/user-settings.py to enable it (Willie Walker)
+* Many localizations also performed by a number of very enthusiastic
+  folks: Francisco Javier F. Serrador, Adam Weinberger, Clytie Siddall
+* Add Insert+s option to manually tell speech to reset should something
+  go awry (Willie Walker)
+* Add KP_Insert as an equivalent of Insert for the Orca modifier.
+  (Willie Walker)
+
+==========
+
+0.2.0 - 29-Nov-2005
+* Many many changes: new scripting architecture; better support for
+speech and braille; decent support for GTK applications; flat review
+mode.
+* Many localizations also performed by a number of very enthusiastic
+folks: Francisco Javier F. Serrador, Pawan Chitrakar, Adam Weinberger,
+Maxim Dziumanenko, Hendrik Brandt, David Lodge, Raphael Higino, Steve
+Murphy, Miloslav Trmac, Christian Rose, Alessio Frusciante, Aldo
+Giambelluca, Vincent van Adrighem, Danilo Segan, Ankit Patel, EstÃvÃo
+Samuel ProcÃpio, Christophe Merlet, Cedric Corazza, Gustavo Noronha
+Silva, Funda Wang, Gareth Owen, and Duarte Loreto.
+
+==========
+
+0.1.0 - 25-Jun-2004
+* Changed scripting model -- scripts are now always all loaded at once
+and the Orca event processor decides which script should receive which
+events
+
+==========
+
+0.0.13 - 10-Jun-2004
+* Added spec file
+* Sorted out packaging issues
+* Fixed automatic dialog reading

Added: branches/phase2/README
==============================================================================
--- (empty file)
+++ branches/phase2/README	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,3 @@
+This is an experimental branch for "Phase 2" of Orca.
+
+http://live.gnome.org/Orca

Added: branches/phase2/acinclude.m4
==============================================================================
--- (empty file)
+++ branches/phase2/acinclude.m4	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,174 @@
+dnl a macro to check for ability to create python extensions
+dnl  AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE])
+dnl function also defines PYTHON_INCLUDES
+AC_DEFUN([AM_CHECK_PYTHON_HEADERS],
+[AC_REQUIRE([AM_PATH_PYTHON])
+AC_MSG_CHECKING(for headers required to compile python extensions)
+dnl deduce PYTHON_INCLUDES
+py_prefix=`$PYTHON -c "import sys; print sys.prefix"`
+py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"`
+PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
+if test "$py_prefix" != "$py_exec_prefix"; then
+  PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
+fi
+AC_SUBST(PYTHON_INCLUDES)
+dnl check if the headers exist:
+save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
+AC_TRY_CPP([#include <Python.h>],dnl
+[AC_MSG_RESULT(found)
+$1],dnl
+[AC_MSG_RESULT(not found)
+$2])
+CPPFLAGS="$save_CPPFLAGS"
+])
+
+dnl AM_CHECK_PYGTK(VERSION [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]])
+dnl Check if pygtk supports the given version.
+AC_DEFUN([AM_CHECK_PYGTK],
+[AC_REQUIRE([AM_PATH_PYTHON])
+AC_MSG_CHECKING(for pygtk version $1)
+py_mod_var=`echo $1 | sed 'y%./+-%__p_%'`
+AC_CACHE_VAL(py_cv_mod_$py_mod_var, [
+prog="
+import sys
+try:
+	import pygtk
+	pygtk.require('$1')
+except:
+	sys.exit(1)
+sys.exit(0)"
+if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC
+  then
+    eval "py_cv_mod_$py_mod_var=yes"
+  else
+    eval "py_cv_mod_$py_mod_var=no"
+  fi
+])
+py_val=`eval "echo \`echo '$py_cv_mod_'$py_mod_var\`"`
+if test "x$py_val" != xno; then
+  AC_MSG_RESULT(yes)
+  ifelse([$2], [],, [$2
+])dnl
+else
+  AC_MSG_RESULT(no)
+  ifelse([$3], [],, [$3
+])dnl
+fi
+])
+
+dnl AM_CHECK_PYMOD(MODNAME [,SYMBOL [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]])
+dnl Check if a module containing a given symbol is visible to python.
+AC_DEFUN([AM_CHECK_PYMOD],
+[AC_REQUIRE([AM_PATH_PYTHON])
+py_mod_var=`echo $1['_']$2 | sed 'y%./+-%__p_%'`
+AC_MSG_CHECKING(for ifelse([$2],[],,[$2 in ])python module $1)
+AC_CACHE_VAL(py_cv_mod_$py_mod_var, [
+ifelse([$2],[], [prog="
+import sys
+try:
+	import $1
+except ImportError:
+	sys.exit(1)
+except:
+	sys.exit(0)
+sys.exit(0)"], [prog="
+import $1
+import $1.$2"])
+if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC
+  then
+    eval "py_cv_mod_$py_mod_var=yes"
+  else
+    eval "py_cv_mod_$py_mod_var=no"
+  fi
+])
+py_val=`eval "echo \`echo '$py_cv_mod_'$py_mod_var\`"`
+if test "x$py_val" != xno; then
+  AC_MSG_RESULT(yes)
+  ifelse([$3], [],, [$3
+])dnl
+else
+  AC_MSG_RESULT(no)
+  ifelse([$4], [],, [$4
+])dnl
+fi
+])
+
+dnl AM_CHECK_PYORBIT_MOD(MODNAME [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]])
+dnl Check if a module containing a given ORBit module is visible to python.
+AC_DEFUN([AM_CHECK_PYORBIT_MOD],
+[AC_REQUIRE([AM_PATH_PYTHON])
+py_mod_var=$1
+AC_MSG_CHECKING(for PyORBit module $1)
+AC_CACHE_VAL(py_cv_mod_$py_mod_var, [
+prog="
+import sys
+try:
+	import bonobo 
+	import ORBit
+	ORBit.load_typelib(\"$1\")
+	module_name = \"$1\".replace(\"_\",\".\")
+	__import__(module_name)
+except:
+	sys.exit(1)
+sys.exit(0)"
+if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC
+  then
+    eval "py_cv_mod_$py_mod_var=yes"
+  else
+    eval "py_cv_mod_$py_mod_var=no"
+  fi
+])
+py_val=`eval "echo \`echo '$py_cv_mod_'$py_mod_var\`"`
+if test "x$py_val" != xno; then
+  AC_MSG_RESULT(yes)
+  ifelse([$2], [],, [$2
+])dnl
+else
+  AC_MSG_RESULT(no)
+  ifelse([$3], [],, [$3
+])dnl
+fi
+])
+
+dnl   PYDOC_CHECK()
+AC_DEFUN([PYDOC_CHECK],
+[
+  dnl enable/disable documentation building
+  AC_ARG_ENABLE(pydoc,
+    AC_HELP_STRING([--enable-pydoc],
+                   [use pydoc to build documentation [default=no]]),,
+    enable_pydoc=no)
+
+  have_pydoc=no
+  if test x$enable_pydoc = xyes; then
+    AC_CHECK_FILE("$prefix/bin/pydoc", PYDOC="$prefix/bin/pydoc")
+  fi
+
+  if test -z "$PYDOC"; then
+    enable_pydoc=no
+  fi
+  AM_CONDITIONAL(ENABLE_PYDOC, test x$enable_pydoc = xyes)
+])
+
+dnl
+dnl JH_ADD_CFLAG(FLAG)
+dnl checks whether the C compiler supports the given flag, and if so, adds
+dnl it to $CFLAGS.  If the flag is already present in the list, then the
+dnl check is not performed.
+AC_DEFUN([JH_ADD_CFLAG],
+[
+case " $CFLAGS " in
+*@<:@\	\ @:>@$1@<:@\	\ @:>@*)
+  ;;
+*)
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS $1"
+  AC_MSG_CHECKING([whether [$]CC understands $1])
+  AC_TRY_COMPILE([], [], [jh_has_option=yes], [jh_has_option=no])
+  AC_MSG_RESULT($jh_has_option)
+  if test $jh_has_option = no; then
+    CFLAGS="$save_CFLAGS"
+  fi
+  ;;
+esac])

Added: branches/phase2/autogen.sh
==============================================================================
--- (empty file)
+++ branches/phase2/autogen.sh	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,24 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+PKG_NAME="orca"
+
+(test -f $srcdir/configure.in \
+  && test -f $srcdir/README \
+  && test -d $srcdir/src) || {
+    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
+    echo " top-level $PKG_NAME directory"
+    exit 1
+}
+
+which gnome-autogen.sh || {
+    echo "You need to install gnome-common from the GNOME CVS"
+    exit 1
+}
+
+REQUIRED_AUTOMAKE_VERSION=1.9
+
+USE_GNOME2_MACROS=1 USE_COMMON_DOC_BUILD=yes . gnome-autogen.sh

Added: branches/phase2/configure.in
==============================================================================
--- (empty file)
+++ branches/phase2/configure.in	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,175 @@
+AC_INIT(ChangeLog)
+
+ORCA_MAJOR_VERSION=2
+ORCA_MINOR_VERSION=25
+ORCA_MICRO_VERSION=0
+ORCA_VERSION="$ORCA_MAJOR_VERSION.$ORCA_MINOR_VERSION.$ORCA_MICRO_VERSION"
+AM_INIT_AUTOMAKE(orca, $ORCA_VERSION)
+AC_SUBST(ORCA_VERSION)
+
+# libtool versioning
+LT_CURRENT=0
+LT_REVISION=0
+LT_AGE=0
+LT_VERSION_INFO='-version-info ${LT_CURRENT}:${LT_REVISION}:${LT_AGE}'
+AC_SUBST(LT_VERSION_INFO)
+AC_SUBST(LT_RELEASE)
+AC_SUBST(LT_CURRENT)
+AC_SUBST(LT_REVISION)
+AC_SUBST(LT_AGE)
+
+dnl Specify a header configuration file
+AM_CONFIG_HEADER(config.h)
+
+dnl Initialize maintainer mode
+AM_MAINTAINER_MODE
+
+dnl Gettext stuff
+
+GETTEXT_PACKAGE=orca
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package])
+AM_GLIB_GNU_GETTEXT
+
+IT_PROG_INTLTOOL([0.40.0])
+
+dnl Checks for programs
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_ISC_POSIX
+
+dnl Initialize libtool
+AM_DISABLE_STATIC
+AM_PROG_LIBTOOL
+
+# Check for various modules.  We want at least the ones
+# listed, plus:
+#
+# pyorbit 2.14.0
+# pygtk 2.8.4
+# gnome-python 2.6.2
+# libgail-gnome 1.1.3
+# gnome-mag-1.0 0.12.5 (optional)
+#
+#PKG_CHECK_MODULES(orca, \
+#	glib-2.0 >= 2.10.0 \
+#	gtk+-2.0 >= 2.8.16 \
+#	libbonobo-2.0 >= 2.14.0 \
+#	atk >= 1.11.3 \
+#	gail >= 1.8.11 \
+#	eel-2.0 >= 2.14.0 \
+#	libspi-1.0 >= 1.7.6 \
+#	cspi-1.0 >= 1.7.6 \
+#	gnome-speech-1.0 >= 0.3.10 \
+#)
+
+# Find the idl compiler
+
+ORBIT_IDL=`pkg-config --variable=orbit_idl ORBit-2.0`
+AC_SUBST(ORBIT_IDL)
+
+# Find the at-spi IDL
+
+AT_SPI_IDLDIR=`pkg-config --variable=idldir libspi-1.0`
+AC_SUBST(AT_SPI_IDLDIR)
+
+# Find the bonobo IDL
+
+BONOBO_IDLDIR=`pkg-config --variable=idldir libbonobo-2.0`
+
+# Find the bonobo-activation IDL
+
+BONOBO_ACTIVATION_IDLDIR=`pkg-config --variable=idldir bonobo-activation-2.0`
+
+AT_SPI_IDLFLAGS="-I$BONOBO_IDLDIR -I$BONOBO_ACTIVATION_IDLDIR -I$AT_SPI_IDLDIR"
+AC_SUBST(AT_SPI_IDLFLAGS)
+
+# Check for Python
+
+AM_PATH_PYTHON(2.4)
+
+# Check for PyGTK 2.0
+
+AM_CHECK_PYGTK(2.0,,[AC_MSG_ERROR(Could not find pygtk 2.0)])
+
+# Find the headers needed to build extensions
+
+AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(Could not find python headers needed to build Python extensions)])
+
+# Find the modules used by Orca
+
+AM_CHECK_PYMOD(gettext,,,[AC_MSG_ERROR(Could not find python module gettext)])
+AM_CHECK_PYMOD(getopt,,,[AC_MSG_ERROR(Could not find python module getopt)])
+AM_CHECK_PYMOD(bonobo,,,[AC_MSG_ERROR(Could not find python module bonobo - make sure you have gnome-python with support for libbonobo-2.0 >= 2.14.0 installed)])
+AM_CHECK_PYMOD(ORBit,,,[AC_MSG_ERROR(Could not find python module ORBit - make sure you have pyorbit >= 2.14.0 installed)])
+AM_CHECK_PYMOD(ORBit,CORBA,,[AC_MSG_ERROR(Could not find python module ORBit.CORBA - make sure you have pyorbit >= 2.14.0 installed)])
+
+# Don't require the DISPLAY to be set - the gtk checking will fail 
+# if DISPLAY is not set, and we don't like that.
+#
+#AM_CHECK_PYMOD(gconf,,,[AC_MSG_ERROR(Could not find python module gconf - make sure you have pygtk >= 2.8.14 installed)])
+#AM_CHECK_PYMOD(gtk,,,[AC_MSG_ERROR(Could not find python module gtk - make sure you have pygtk >= 2.8.14 installed)])
+#AM_CHECK_PYMOD(gtk,gdk,,[AC_MSG_ERROR(Could not find python module gtk.gdk - make sure you have pygtk >= 2.8.14 installed)])
+#AM_CHECK_PYMOD(gtk,glade,,[AC_MSG_ERROR(Could not find python module gtk.glade - make sure you have pygtk >= 2.8.14 installed)])
+
+AM_CHECK_PYORBIT_MOD(Accessibility,,[AC_MSG_ERROR(Could not find python ORBit module Accessibility - make sure you have the atspi libspi-1.0 >= 1.7.6 installed)])
+AM_CHECK_PYORBIT_MOD(GNOME_Speech,,[AC_MSG_WARN(Could not find python ORBit module Speech - you need gnome-speech-1.0 >= 0.3.10 installed to use speech)])
+AM_CHECK_PYORBIT_MOD(GNOME_Magnifier,,[AC_MSG_WARN(Could not find python ORBit module GNOME_Magnifier - you need gnome-mag-1.0 >= 0.12.5 installed to use magnification)])
+
+# Check for BrlAPI.
+#
+AM_CHECK_PYMOD(brlapi,,[brlapi_available="yes"],[brlapi_available="no"])
+
+AC_ARG_ENABLE(liblouis, 
+              AC_HELP_STRING([--enable-liblouis=@<:@no/yes/auto@:>@],
+                             [enable the use of liblouis]),,
+              enable_liblouis=auto)
+
+LOUIS_TABLE_DIR=""
+
+if test "x$enable_liblouis" != "xno"; then
+   PKG_CHECK_MODULES(LOUIS, "liblouis", have_liblouis=yes, have_liblouis=no)
+   if test x$have_liblouis = "xyes"; then
+      LOUIS_TABLE_DIR=`pkg-config --variable=tablesdir liblouis`
+   fi
+else
+   have_liblouis=no
+fi
+
+AC_SUBST(LOUIS_TABLE_DIR)
+if test "x$enable_liblouis" = "xyes"; then
+   if test "x$have_liblouis" != "xyes"; then
+      AC_MSG_ERROR([Couldn't find Liblouis])
+   fi
+fi
+
+AM_CONDITIONAL(WITH_LOUIS, test x$have_liblouis = "xyes")
+
+AC_SUBST(orca_LIBS)
+AC_SUBST(orca_CFLAGS)
+
+PYDOC_CHECK()
+
+AC_OUTPUT([ 
+run_pylint.sh
+Makefile
+po/Makefile.in
+icons/Makefile
+src/Makefile
+src/louis/Makefile
+src/louis/constants.py
+src/orca/Makefile
+src/orca/scripts/Makefile
+src/orca/scripts/apps/Makefile
+src/orca/scripts/toolkits/Makefile
+src/orca/orca
+src/orca/orca_i18n.py
+src/orca/platform.py
+],[chmod +x run_pylint.sh])
+
+if test "x$brlapi_available" = "xno" ; then
+echo
+echo "NOTE: Braille support requires BrlAPI from BrlTTY >= 3.8."
+echo "A suitable version could not be found, so braille will not be enabled."
+echo
+fi

Added: branches/phase2/icons/AUTHORS
==============================================================================
--- (empty file)
+++ branches/phase2/icons/AUTHORS	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,9 @@
+Orca icon created by Stephen Brandt.
+stephen stephenbrandt com
+http://www.stephenbrandt.com/
+
+This artwork is available under the terms of the GNU Lesser General Public License.
+http://www.gnu.org/licenses/lgpl.html
+
+This icon follows the Tango visual guidelines.
+http://tango-project.org/
\ No newline at end of file

Added: branches/phase2/icons/COPYING
==============================================================================
--- (empty file)
+++ branches/phase2/icons/COPYING	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+

Added: branches/phase2/icons/Makefile.am
==============================================================================
--- (empty file)
+++ branches/phase2/icons/Makefile.am	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,52 @@
+hicolordir = $(datadir)/icons/hicolor
+app_icons = \
+	orca-16x16.png	\
+	orca-22x22.png	\
+	orca-24x24.png	\
+	orca-32x32.png	\
+	orca-48x48.png	\
+	orca-scalable.svg
+
+install-data-local:
+	@-$(mkinstalldirs) $(DESTDIR)$(hicolordir)/16x16/apps
+	$(INSTALL_DATA) $(srcdir)/orca-16x16.png $(DESTDIR)$(hicolordir)/16x16/apps/orca.png
+	@-$(mkinstalldirs) $(DESTDIR)$(hicolordir)/22x22/apps
+	$(INSTALL_DATA) $(srcdir)/orca-22x22.png $(DESTDIR)$(hicolordir)/22x22/apps/orca.png
+	@-$(mkinstalldirs) $(DESTDIR)$(hicolordir)/24x24/apps
+	$(INSTALL_DATA) $(srcdir)/orca-24x24.png $(DESTDIR)$(hicolordir)/24x24/apps/orca.png
+	@-$(mkinstalldirs) $(DESTDIR)$(hicolordir)/32x32/apps
+	$(INSTALL_DATA) $(srcdir)/orca-32x32.png $(DESTDIR)$(hicolordir)/32x32/apps/orca.png
+	@-$(mkinstalldirs) $(DESTDIR)$(hicolordir)/48x48/apps
+	$(INSTALL_DATA) $(srcdir)/orca-48x48.png $(DESTDIR)$(hicolordir)/48x48/apps/orca.png
+	@-$(mkinstalldirs) $(DESTDIR)$(hicolordir)/scalable/apps
+	$(INSTALL_DATA) $(srcdir)/orca-scalable.svg $(DESTDIR)$(hicolordir)/scalable/apps/orca.svg
+
+gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
+
+install-data-hook:
+	@-if test -z "$(DESTDIR)"; then \
+		echo "Updating Gtk icon cache."; \
+		$(gtk_update_icon_cache); \
+	else \
+		echo "*** Icon cache not updated.  After install, run this:"; \
+		echo "***   $(gtk_update_icon_cache)"; \
+	fi
+
+uninstall-hook:
+	rm -f $(DESTDIR)$(hicolordir)/16x16/apps/orca.png
+	rm -f $(DESTDIR)$(hicolordir)/22x22/apps/orca.png
+	rm -f $(DESTDIR)$(hicolordir)/24x24/apps/orca.png
+	rm -f $(DESTDIR)$(hicolordir)/32x32/apps/orca.png
+	rm -f $(DESTDIR)$(hicolordir)/48x48/apps/orca.png
+	rm -f $(DESTDIR)$(hicolordir)/scalable/apps/orca.svg
+	@-if test -z "$(DESTDIR)"; then \
+		echo "Updating Gtk icon cache."; \
+		$(gtk_update_icon_cache); \
+	else \
+		echo "*** Icon cache not updated.  After uninstall, run this:"; \
+		echo "***   $(gtk_update_icon_cache)"; \
+	fi
+
+update-icon-cache:
+
+EXTRA_DIST = $(app_icons)

Added: branches/phase2/icons/orca-16x16.png
==============================================================================
Binary file. No diff available.

Added: branches/phase2/icons/orca-22x22.png
==============================================================================
Binary file. No diff available.

Added: branches/phase2/icons/orca-24x24.png
==============================================================================
Binary file. No diff available.

Added: branches/phase2/icons/orca-32x32.png
==============================================================================
Binary file. No diff available.

Added: branches/phase2/icons/orca-48x48.png
==============================================================================
Binary file. No diff available.

Added: branches/phase2/icons/orca-scalable.svg
==============================================================================
--- (empty file)
+++ branches/phase2/icons/orca-scalable.svg	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,1025 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:xlink="http://www.w3.org/1999/xlink";
+   version="1.0"
+   width="48"
+   height="48"
+   id="svg5596">
+  <defs
+     id="defs5599">
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient12663"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.984808,0.173648,-0.173648,0.984808,-6.57769,0.52398)" />
+    <linearGradient
+       id="linearGradient11599">
+      <stop
+         style="stop-color:#5b5b5b;stop-opacity:1"
+         offset="0"
+         id="stop11601" />
+      <stop
+         style="stop-color:#979797;stop-opacity:1"
+         offset="0.5"
+         id="stop11603" />
+      <stop
+         style="stop-color:#454545;stop-opacity:1"
+         offset="1"
+         id="stop11605" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient11573">
+      <stop
+         style="stop-color:#ef2929;stop-opacity:1"
+         offset="0"
+         id="stop11575" />
+      <stop
+         style="stop-color:#f79090;stop-opacity:1"
+         offset="0.5"
+         id="stop11585" />
+      <stop
+         style="stop-color:#ef2929;stop-opacity:1"
+         offset="1"
+         id="stop11577" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3394">
+      <stop
+         style="stop-color:#cc0000;stop-opacity:0.49803922"
+         offset="0"
+         id="stop3402" />
+      <stop
+         style="stop-color:#cc0000;stop-opacity:1"
+         offset="1"
+         id="stop3404" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3243">
+      <stop
+         style="stop-color:#ef2929;stop-opacity:1"
+         offset="0"
+         id="stop3245" />
+      <stop
+         style="stop-color:#efc8c8;stop-opacity:1"
+         offset="0.5"
+         id="stop3253" />
+      <stop
+         style="stop-color:#ef2929;stop-opacity:1"
+         offset="1"
+         id="stop3247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3229">
+      <stop
+         style="stop-color:#ef2929;stop-opacity:1"
+         offset="0"
+         id="stop3231" />
+      <stop
+         style="stop-color:#f35e5e;stop-opacity:1"
+         offset="1"
+         id="stop3241" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3197">
+      <stop
+         style="stop-color:#cc0000;stop-opacity:1"
+         offset="0"
+         id="stop3199" />
+      <stop
+         style="stop-color:#cc0000;stop-opacity:0.49803922"
+         offset="0"
+         id="stop3205" />
+      <stop
+         style="stop-color:#cc0000;stop-opacity:1"
+         offset="1"
+         id="stop3201" />
+    </linearGradient>
+    <linearGradient
+       x1="32.169682"
+       y1="32.340691"
+       x2="36.310467"
+       y2="37.614323"
+       id="linearGradient2552"
+       xlink:href="#linearGradient2215"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.955799,0.125613,-0.13219,1.005843,8.433071,-4.87925)" />
+    <linearGradient
+       x1="16.920895"
+       y1="41.527054"
+       x2="14.717065"
+       y2="27.556486"
+       id="linearGradient4158"
+       xlink:href="#linearGradient4152"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.386129,-2.59755)" />
+    <linearGradient
+       id="linearGradient4199">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.69072163"
+         offset="0"
+         id="stop4201" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1"
+         id="stop4203" />
+    </linearGradient>
+    <linearGradient
+       x1="5.5588484"
+       y1="8.7893238"
+       x2="26.936853"
+       y2="48.565983"
+       id="linearGradient4197"
+       xlink:href="#linearGradient4199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.015688,0,0,1,-0.427129,-2.59755)" />
+    <linearGradient
+       id="linearGradient4152">
+      <stop
+         style="stop-color:#788492;stop-opacity:1"
+         offset="0"
+         id="stop4154" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:1"
+         offset="1"
+         id="stop4156" />
+    </linearGradient>
+    <linearGradient
+       x1="5.4860573"
+       y1="32.173634"
+       x2="12.296931"
+       y2="27.665829"
+       id="linearGradient4185"
+       xlink:href="#linearGradient4152"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.290919,0,0,1.173295,-3.854317,-8.380223)" />
+    <linearGradient
+       x1="34.868965"
+       y1="39.944828"
+       x2="34.868965"
+       y2="43.475861"
+       id="linearGradient4273"
+       xlink:href="#linearGradient4242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.386129,-2.59755)" />
+    <linearGradient
+       x1="36.634483"
+       y1="38.124138"
+       x2="36.634483"
+       y2="42.427586"
+       id="linearGradient4265"
+       xlink:href="#linearGradient4242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.386129,-2.59755)" />
+    <linearGradient
+       x1="38.896549"
+       y1="38.482758"
+       x2="42.427586"
+       y2="38.482758"
+       id="linearGradient4256"
+       xlink:href="#linearGradient4242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-0.386129,-2.59755)" />
+    <linearGradient
+       id="linearGradient4242">
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0"
+         id="stop4244" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1"
+         id="stop4246" />
+    </linearGradient>
+    <linearGradient
+       x1="40.496552"
+       y1="37.848274"
+       x2="44.193104"
+       y2="37.848274"
+       id="linearGradient4248"
+       xlink:href="#linearGradient4242"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.864739,0,0,0.753105,5.591471,7.01265)" />
+    <linearGradient
+       x1="-5.2845793"
+       y1="19.362175"
+       x2="33.728188"
+       y2="66.499512"
+       id="linearGradient4146"
+       xlink:href="#linearGradient2949"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.943596,0,0,0.963374,6.792471,4.03365)" />
+    <linearGradient
+       id="linearGradient2215">
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0"
+         id="stop2217" />
+      <stop
+         style="stop-color:#505050;stop-opacity:1"
+         offset="1"
+         id="stop2219" />
+    </linearGradient>
+    <linearGradient
+       x1="26.247757"
+       y1="38.03194"
+       x2="23.782515"
+       y2="36.457325"
+       id="linearGradient4277"
+       xlink:href="#linearGradient2215"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.967422,0.946165,0,-16.09433,2.21785)" />
+    <linearGradient
+       id="linearGradient2949">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.45038167"
+         offset="0"
+         id="stop2951" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.31297711"
+         offset="1"
+         id="stop2953" />
+    </linearGradient>
+    <linearGradient
+       x1="29.425014"
+       y1="33.593369"
+       x2="43.14069"
+       y2="38.189564"
+       id="linearGradient4301"
+       xlink:href="#linearGradient2949"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-14.76113,-7.34755)" />
+    <linearGradient
+       id="linearGradient2879">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.17557251"
+         offset="0"
+         id="stop2881" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1"
+         id="stop2883" />
+    </linearGradient>
+    <radialGradient
+       cx="20.152544"
+       cy="33.636894"
+       r="15.291184"
+       fx="20.152544"
+       fy="33.636894"
+       id="radialGradient4312"
+       xlink:href="#linearGradient2879"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.257225,0,24.98463)" />
+    <linearGradient
+       x1="52.717937"
+       y1="2.3161638"
+       x2="67.465988"
+       y2="2.3161638"
+       id="linearGradient7025"
+       xlink:href="#linearGradient6721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.862482,0,0,0.580718,-16.25697,11.01348)" />
+    <linearGradient
+       x1="53.168766"
+       y1="24.244797"
+       x2="69.690994"
+       y2="24.244797"
+       id="linearGradient7020"
+       xlink:href="#linearGradient6651"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.71944,0,0,0.718914,-7.696252,9.471728)" />
+    <linearGradient
+       x1="61.871845"
+       y1="29.615223"
+       x2="61.871845"
+       y2="41.459263"
+       id="linearGradient7017"
+       xlink:href="#linearGradient6629"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.888619,0,0,0.718914,-18.29768,9.471728)" />
+    <linearGradient
+       x1="49.853039"
+       y1="64.259621"
+       x2="62.768223"
+       y2="64.259621"
+       id="linearGradient7014"
+       xlink:href="#linearGradient6748"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.718914,0,0,0.718914,-1.897103,-22.42481)" />
+    <linearGradient
+       x1="60.168766"
+       y1="40.119797"
+       x2="60.440994"
+       y2="43.869797"
+       id="linearGradient7010"
+       xlink:href="#linearGradient6651"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.737307,0,0,0.770854,-8.532023,7.121636)" />
+    <linearGradient
+       x1="48.25"
+       y1="54.75"
+       x2="48.25"
+       y2="71.25"
+       id="linearGradient7005"
+       xlink:href="#linearGradient6835"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.718914,0,0,0.718914,-1.897103,-20.68606)" />
+    <radialGradient
+       cx="26.78167"
+       cy="42.343147"
+       r="14.407301"
+       fx="26.78167"
+       fy="42.343147"
+       id="radialGradient6903"
+       xlink:href="#linearGradient6975"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.282209,0,30.39355)" />
+    <linearGradient
+       x1="13.236155"
+       y1="37.752247"
+       x2="7.7521091"
+       y2="42.282146"
+       id="linearGradient2452"
+       xlink:href="#linearGradient2446"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.852298,0,0,0.852298,-1.675107,3.753977)" />
+    <radialGradient
+       cx="26.78167"
+       cy="42.343147"
+       r="14.407301"
+       fx="26.78167"
+       fy="42.343147"
+       id="radialGradient6981"
+       xlink:href="#linearGradient6975"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.282209,0,30.39355)" />
+    <radialGradient
+       cx="15.415101"
+       cy="35.356506"
+       r="7.5791559"
+       fx="15.415101"
+       fy="35.356506"
+       id="radialGradient6969"
+       xlink:href="#linearGradient6963"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.994655,0,0,0.969322,-4.583017,0.165919)" />
+    <linearGradient
+       x1="28.058632"
+       y1="18.867767"
+       x2="33.436985"
+       y2="23.742767"
+       id="linearGradient6957"
+       xlink:href="#linearGradient6951"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3.90695,-1.802856)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="23.109331"
+       y2="33.438831"
+       id="linearGradient6945"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-53.05087,38.14868)" />
+    <linearGradient
+       id="linearGradient6939">
+      <stop
+         style="stop-color:#dddddd;stop-opacity:1"
+         offset="0"
+         id="stop6941" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.33333334"
+         id="stop6947" />
+      <stop
+         style="stop-color:#b7b7b7;stop-opacity:1"
+         offset="0.66666669"
+         id="stop6949" />
+      <stop
+         style="stop-color:#dddddd;stop-opacity:1"
+         offset="1"
+         id="stop6943" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6951">
+      <stop
+         style="stop-color:#6e3d09;stop-opacity:1"
+         offset="0"
+         id="stop6953" />
+      <stop
+         style="stop-color:#ea8113;stop-opacity:1"
+         offset="0.24242425"
+         id="stop6959" />
+      <stop
+         style="stop-color:#5c3307;stop-opacity:1"
+         offset="0.62121212"
+         id="stop6961" />
+      <stop
+         style="stop-color:#e07c12;stop-opacity:1"
+         offset="1"
+         id="stop6955" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6963">
+      <stop
+         style="stop-color:#696969;stop-opacity:1"
+         offset="0"
+         id="stop6965" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1"
+         id="stop6967" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6975">
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0"
+         id="stop6977" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1"
+         id="stop6979" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2446">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop2448" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1"
+         id="stop2450" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6629">
+      <stop
+         style="stop-color:#aeaeae;stop-opacity:1"
+         offset="0"
+         id="stop6631" />
+      <stop
+         style="stop-color:#c4c4c4;stop-opacity:0"
+         offset="1"
+         id="stop6633" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6651">
+      <stop
+         style="stop-color:#f2f2f2;stop-opacity:1"
+         offset="0"
+         id="stop6653" />
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="1"
+         id="stop6655" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6721">
+      <stop
+         style="stop-color:#729fcf;stop-opacity:1"
+         offset="0"
+         id="stop6723" />
+      <stop
+         style="stop-color:#3c74b1;stop-opacity:1"
+         offset="1"
+         id="stop6725" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6748">
+      <stop
+         style="stop-color:#729fcf;stop-opacity:1"
+         offset="0"
+         id="stop6750" />
+      <stop
+         style="stop-color:#2b5582;stop-opacity:1"
+         offset="1"
+         id="stop6752" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6835">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop6837" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1"
+         id="stop6839" />
+    </linearGradient>
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient2282"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(38.07104,6.705107)" />
+    <linearGradient
+       x1="56.162964"
+       y1="41.83876"
+       x2="54.483982"
+       y2="40.247776"
+       id="linearGradient3203"
+       xlink:href="#linearGradient3197"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient3211"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(38.07104,6.705107)" />
+    <linearGradient
+       x1="56.162964"
+       y1="41.83876"
+       x2="54.483982"
+       y2="40.247776"
+       id="linearGradient3213"
+       xlink:href="#linearGradient3197"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="54.837135"
+       y1="39.805828"
+       x2="56.428524"
+       y2="41.308434"
+       id="linearGradient3249"
+       xlink:href="#linearGradient3243"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="12.813026"
+       y1="32.056629"
+       x2="15.119371"
+       y2="34.001175"
+       id="linearGradient3263"
+       xlink:href="#linearGradient3243"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="54.837135"
+       y1="39.805828"
+       x2="56.428524"
+       y2="41.308434"
+       id="linearGradient3266"
+       xlink:href="#linearGradient3243"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-51.85143,3.42342)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient3269"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-13.78039,10.12853)" />
+    <linearGradient
+       x1="2.1018243"
+       y1="43.936359"
+       x2="4.1351514"
+       y2="45.880901"
+       id="linearGradient11844"
+       xlink:href="#linearGradient11573"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="19.268993"
+       y1="25.539364"
+       x2="21.398565"
+       y2="27.616491"
+       id="linearGradient11846"
+       xlink:href="#linearGradient11573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.374275,-0.411242)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient11848"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-13.78039,10.12853)" />
+    <linearGradient
+       x1="27.847828"
+       y1="16.542765"
+       x2="29.623844"
+       y2="18.266338"
+       id="linearGradient11850"
+       xlink:href="#linearGradient11573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1.117749,-1.179036)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient11852"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(7.629341,-13.05859)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient11854"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(3.014336,-8.04609)" />
+    <linearGradient
+       x1="27.847828"
+       y1="16.542765"
+       x2="29.623844"
+       y2="18.266338"
+       id="linearGradient11856"
+       xlink:href="#linearGradient11599"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(11.0575,-11.78)" />
+    <linearGradient
+       x1="52.717937"
+       y1="2.3161638"
+       x2="67.465988"
+       y2="2.3161638"
+       id="linearGradient14628"
+       xlink:href="#linearGradient6721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.862482,0,0,0.580718,-16.25697,11.01348)" />
+    <linearGradient
+       x1="53.168766"
+       y1="24.244797"
+       x2="69.690994"
+       y2="24.244797"
+       id="linearGradient14626"
+       xlink:href="#linearGradient6651"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.71944,0,0,0.718914,-7.696252,9.471728)" />
+    <linearGradient
+       x1="61.871845"
+       y1="29.615223"
+       x2="61.871845"
+       y2="41.459263"
+       id="linearGradient14624"
+       xlink:href="#linearGradient6629"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.888619,0,0,0.718914,-18.29768,9.471728)" />
+    <linearGradient
+       x1="49.853039"
+       y1="64.259621"
+       x2="62.768223"
+       y2="64.259621"
+       id="linearGradient14622"
+       xlink:href="#linearGradient6748"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.718914,0,0,0.718914,-1.897103,-22.42481)" />
+    <linearGradient
+       x1="60.168766"
+       y1="40.119797"
+       x2="60.440994"
+       y2="43.869797"
+       id="linearGradient14620"
+       xlink:href="#linearGradient6651"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.737307,0,0,0.770854,-8.532023,7.121636)" />
+    <linearGradient
+       x1="48.25"
+       y1="54.75"
+       x2="48.25"
+       y2="71.25"
+       id="linearGradient14618"
+       xlink:href="#linearGradient6835"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.718914,0,0,0.718914,-1.897103,-20.68606)" />
+    <radialGradient
+       cx="26.78167"
+       cy="42.343147"
+       r="14.407301"
+       fx="26.78167"
+       fy="42.343147"
+       id="radialGradient14616"
+       xlink:href="#linearGradient6975"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.282209,0,30.39355)" />
+    <linearGradient
+       x1="13.236155"
+       y1="37.752247"
+       x2="7.7521091"
+       y2="42.282146"
+       id="linearGradient14614"
+       xlink:href="#linearGradient2446"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.852298,0,0,0.852298,-1.675107,3.753977)" />
+    <radialGradient
+       cx="26.78167"
+       cy="42.343147"
+       r="14.407301"
+       fx="26.78167"
+       fy="42.343147"
+       id="radialGradient14612"
+       xlink:href="#linearGradient6975"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.282209,0,30.39355)" />
+    <radialGradient
+       cx="15.415101"
+       cy="35.356506"
+       r="7.5791559"
+       fx="15.415101"
+       fy="35.356506"
+       id="radialGradient14610"
+       xlink:href="#linearGradient6963"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.994655,0,0,0.969322,-4.583017,0.165919)" />
+    <linearGradient
+       x1="28.058632"
+       y1="18.867767"
+       x2="33.436985"
+       y2="23.742767"
+       id="linearGradient14608"
+       xlink:href="#linearGradient6951"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3.90695,-1.802856)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="23.109331"
+       y2="33.438831"
+       id="linearGradient14606"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-3.90695,-1.802856)" />
+    <linearGradient
+       id="linearGradient14596">
+      <stop
+         style="stop-color:#bdbdbd;stop-opacity:1"
+         offset="0"
+         id="stop14598" />
+      <stop
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="0.33333334"
+         id="stop14600" />
+      <stop
+         style="stop-color:#a3a3a3;stop-opacity:1"
+         offset="0.66666669"
+         id="stop14602" />
+      <stop
+         style="stop-color:#dddddd;stop-opacity:1"
+         offset="1"
+         id="stop14604" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient14586">
+      <stop
+         style="stop-color:#6e3d09;stop-opacity:1"
+         offset="0"
+         id="stop14588" />
+      <stop
+         style="stop-color:#ea8113;stop-opacity:1"
+         offset="0.24242425"
+         id="stop14590" />
+      <stop
+         style="stop-color:#5c3307;stop-opacity:1"
+         offset="0.62121212"
+         id="stop14592" />
+      <stop
+         style="stop-color:#e07c12;stop-opacity:1"
+         offset="1"
+         id="stop14594" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient14580">
+      <stop
+         style="stop-color:#696969;stop-opacity:1"
+         offset="0"
+         id="stop14582" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1"
+         id="stop14584" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient14562">
+      <stop
+         style="stop-color:#aeaeae;stop-opacity:1"
+         offset="0"
+         id="stop14564" />
+      <stop
+         style="stop-color:#c4c4c4;stop-opacity:0"
+         offset="1"
+         id="stop14566" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient14556">
+      <stop
+         style="stop-color:#f2f2f2;stop-opacity:1"
+         offset="0"
+         id="stop14558" />
+      <stop
+         style="stop-color:#c3c3c3;stop-opacity:1"
+         offset="1"
+         id="stop14560" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient14550">
+      <stop
+         style="stop-color:#729fcf;stop-opacity:1"
+         offset="0"
+         id="stop14552" />
+      <stop
+         style="stop-color:#3c74b1;stop-opacity:1"
+         offset="1"
+         id="stop14554" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient14544">
+      <stop
+         style="stop-color:#729fcf;stop-opacity:1"
+         offset="0"
+         id="stop14546" />
+      <stop
+         style="stop-color:#2b5582;stop-opacity:1"
+         offset="1"
+         id="stop14548" />
+    </linearGradient>
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient14954"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4.1746,-9.271088)" />
+    <linearGradient
+       x1="2.1018243"
+       y1="43.936359"
+       x2="4.1351514"
+       y2="45.880901"
+       id="linearGradient3403"
+       xlink:href="#linearGradient11573"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="19.268993"
+       y1="25.539364"
+       x2="21.398565"
+       y2="27.616491"
+       id="linearGradient3405"
+       xlink:href="#linearGradient11573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.374275,-0.411242)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient3407"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-13.78039,10.12853)" />
+    <linearGradient
+       x1="27.847828"
+       y1="16.542765"
+       x2="29.623844"
+       y2="18.266338"
+       id="linearGradient3409"
+       xlink:href="#linearGradient11573"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1.117749,-1.179036)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient3411"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(7.629341,-13.05859)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient3413"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4.1746,-9.271088)" />
+    <linearGradient
+       x1="27.847828"
+       y1="16.542765"
+       x2="29.623844"
+       y2="18.266338"
+       id="linearGradient3415"
+       xlink:href="#linearGradient11599"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(11.0575,-11.78)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient3417"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.984808,0.173648,-0.173648,0.984808,-6.57769,0.52398)" />
+    <linearGradient
+       x1="19.394735"
+       y1="30.001331"
+       x2="22.225447"
+       y2="32.643337"
+       id="linearGradient3421"
+       xlink:href="#linearGradient6939"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.984808,0.173648,-0.173648,0.984808,-6.57769,0.52398)" />
+  </defs>
+  <path
+     d="M 1.7363208,32.76676 C 8.3248508,34.7511 17.971871,31.961 22.133911,29.7435 C 30.287021,25.39957 33.685501,31.30328 34.801441,32.05439 C 36.530681,33.53598 31.237641,37.58917 31.573111,40.88925 C 31.759321,42.72109 32.505111,43.61576 32.505111,43.61576 C 33.965331,39.48164 38.580621,41.17748 38.314881,36.8757 C 41.818991,38.85336 42.570681,35.7035 46.636481,36.33108 C 46.061891,35.45605 45.320271,34.15277 43.725911,33.46963 C 42.026491,32.83221 39.153851,32.92116 38.407801,30.75286 C 38.271601,28.30032 38.308721,15.21709 32.388811,11.21743 C 31.523921,9.4752702 32.457261,6.9929501 34.140491,5.2970101 C 35.662491,3.7635101 37.948761,2.3513201 38.731321,1.4507101 C 35.188721,1.4126301 31.659811,2.5223101 28.205141,4.3913401 C 26.403551,5.3660301 24.817171,6.7674501 23.692801,7.2919301 C 13.541991,5.2789001 2.3520908,13.65739 1.2225508,28.3597 C 1.1314008,29.5462 1.1494908,32.39912 1.7363208,32.76676 z "
+     style="fill:url(#linearGradient2552);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path2498" />
+  <path
+     d="M 5.2335808,32.81055 C 11.622781,33.50363 18.209491,30.83856 22.270961,28.96994 C 29.345491,25.669 32.552281,29.14676 34.135611,30.66586 C 34.308901,30.89994 34.307271,29.07354 32.433581,27.87203 C 24.899961,24.33752 34.461671,24.30594 33.953881,23.00814 C 33.369651,21.51499 26.991311,22.37165 25.878431,22.75436 C 21.878331,24.12997 20.471841,26.36926 18.438621,26.78615 C 14.693991,27.4985 11.800931,25.476 9.4333807,28.43233 C 5.2947208,33.60023 4.5869808,32.74041 5.2335808,32.81055 z "
+     style="opacity:1;fill:url(#linearGradient4158);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.95343304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path4148" />
+  <path
+     d="M 2.2770308,32.01551 C 4.8209308,24.64639 13.446641,25.07661 16.854831,21.56745 C 20.208301,18.11463 23.971781,7.3217801 36.560451,18.71166 C 36.606471,18.75329 34.575411,12.91689 31.738591,10.99031 C 30.909681,9.3119602 24.850741,7.3220301 23.773151,7.8273001 C 13.337511,5.8880001 2.9583508,14.66672 1.8758008,28.91892 C 1.7889808,30.062 1.7146108,31.66134 2.2770308,32.01551 z "
+     style="opacity:1;fill:url(#linearGradient4197);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.95343304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path4188" />
+  <path
+     d="M 8.1097416,25.842531 C 7.4359593,24.884336 10.739306,21.488867 11.911822,22.16946 C 12.628902,23.209751 9.601696,27.066888 8.1097416,25.842531 z "
+     style="fill:url(#linearGradient4185);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     id="path4168" />
+  <path
+     d="M 34.151781,40.87835 L 34.813841,40.38179 L 34.758671,37.34731 L 34.151781,40.87835 z "
+     style="opacity:0.25628142;fill:url(#linearGradient4273);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     id="path4206" />
+  <path
+     d="M 35.862121,39.83007 L 36.634531,39.44386 L 36.137981,35.52662 L 35.862121,39.83007 z "
+     style="opacity:0.25125631;fill:url(#linearGradient4265);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     id="path4217" />
+  <path
+     d="M 41.158671,36.9611 L 42.041431,36.63007 L 38.510401,34.80938 L 41.158671,36.9611 z "
+     style="opacity:0.23115575;fill:url(#linearGradient4256);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     id="path4219" />
+  <path
+     d="M 42.900461,36.32662 L 43.806951,36.07732 L 40.610401,34.70615 L 42.900461,36.32662 z "
+     style="opacity:0.22613065;fill:url(#linearGradient4248);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     id="path4221" />
+  <path
+     d="M 2.8895108,32.01551 C 8.8412607,33.57361 17.413831,30.88571 21.341101,28.74943 C 29.034351,24.56461 34.981181,30.34046 35.680621,32.03634 C 36.870381,33.64044 34.470411,35.76668 32.930801,38.8575 C 32.140061,40.44493 32.572791,41.39575 32.572791,41.39575 C 33.919401,39.44691 38.212791,40.2735 37.243291,35.16237 C 41.137221,38.06131 42.424171,35.30807 44.721431,35.32427 C 43.991751,34.38754 43.191931,34.35336 42.406261,34.16399 C 40.802691,33.54991 38.483161,33.60527 37.435441,31.04765 C 37.306931,28.68493 37.929421,17.05318 31.636311,11.87419 C 30.555041,10.54939 30.725551,7.9521601 32.405301,5.7286701 C 32.900791,5.0728001 34.849721,3.5095901 35.588151,2.6419701 C 32.510521,3.2240101 31.213591,3.7627101 27.953781,5.5632901 C 26.253811,6.5022701 25.110451,7.7639701 24.049501,8.2692401 C 14.206081,6.5067201 4.6196108,13.42929 2.4047308,27.23954 C 2.2232108,28.37135 2.0706208,31.66134 2.8895108,32.01551 z "
+     style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4146);stroke-width:0.95343304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path4134" />
+  <g
+     id="g3432">
+    <g
+       transform="matrix(0.984808,0.173648,-0.173648,0.984808,4.319821,-3.493951)"
+       id="g11820">
+      <g
+         transform="translate(3.782059,-4.305959)"
+         id="g3379">
+        <path
+           d="M 3.6678274,43.136096 L 5.3838174,44.716363 C 6.4337554,43.515919 11.191757,38.438712 11.191757,38.438712 L 9.4548369,36.923036 C 9.4548369,36.923036 4.9455924,41.774015 3.6678274,43.136096 z "
+           style="color:#000000;fill:url(#linearGradient3403);fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+           id="path2292" />
+        <path
+           d="M 9.3798921,36.977632 L 11.095882,38.557899 C 12.14582,37.357455 32.719517,15.450785 32.719517,15.450785 L 30.982597,13.935109 C 30.982597,13.935109 10.657657,35.615551 9.3798921,36.977632 z "
+           style="color:#000000;fill:url(#linearGradient3407);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+           id="path6935" />
+      </g>
+      <path
+         d="M 34.676553,9.7053399 L 36.455043,11.160607 C 37.504981,9.9601639 41.783263,5.5878763 42.1,5.110676 C 43.214868,4.1209793 41.493403,2.3741139 40.30058,3.72 C 39.73371,4.2605973 35.954318,8.3432589 34.676553,9.7053399 z "
+         style="color:#000000;fill:url(#linearGradient3415);fill-opacity:1;fill-rule:nonzero;stroke:#2e3436;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         id="path11595" />
+    </g>
+    <path
+       d="M 3.1259863,37.385763 C 1.7298033,38.631621 2.6856953,40.157401 4.5414953,39.24 C 4.8993219,39.067037 6.4911218,37.770435 6.4911218,37.770435 L 5.024554,35.956942 C 5.024554,35.956942 4.6208613,36.266256 3.1259863,37.385763 z "
+       style="color:#000000;fill:url(#linearGradient3421);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="path4782" />
+    <path
+       d="M 45.38,7.76 C 45.38,7.76 50.38,17.76 45.38,17.76 C 40.38,17.76 45.630004,12.759996 45.38,7.76 z "
+       style="fill:none;fill-rule:evenodd;stroke:#2e3436;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path4784" />
+    <path
+       d="M 8.8749989 37.75 A 1.2499999 1.2499999 0 1 1  6.3749992,37.75 A 1.2499999 1.2499999 0 1 1  8.8749989 37.75 z"
+       transform="matrix(0.237867,0,0,0.237867,1.543598,29.32319)"
+       style="opacity:0.53333285;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="path2454" />
+  </g>
+  <path
+     d="M 19.450291,23.22383 C 22.168421,25.03662 28.856191,30.5826 25.680471,31.40984 C 15.059251,31.02011 16.896751,26.26768 14.182961,25.53368 C 12.719161,24.04968 17.982161,22.53604 19.450291,23.22383 z "
+     style="fill:url(#linearGradient4277);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.96744114;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path4275" />
+  <path
+     d="M 19.146461,24.13864 C 21.378451,25.77465 26.563631,29.81803 25.199871,30.60107 C 21.104601,30.05266 19.021051,29.4458 17.949761,28.25613 C 16.602891,26.76044 16.164111,25.40127 15.160761,25.03427 C 14.934401,25.05287 17.678331,23.45085 19.146461,24.13864 z "
+     style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4301);stroke-width:0.96744114;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="path4279" />
+  <path
+     d="M 35.443728 33.636894 A 15.291184 3.9332814 0 1 1  4.8613596,33.636894 A 15.291184 3.9332814 0 1 1  35.443728 33.636894 z"
+     transform="matrix(1.475993,0,0,0.71076,-6.402967,20.77848)"
+     style="opacity:1;color:#000000;fill:url(#radialGradient4312);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+     id="path4310" />
+</svg>

Added: branches/phase2/logging.conf
==============================================================================
--- (empty file)
+++ branches/phase2/logging.conf	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,34 @@
+[formatters]
+keys: simple,detailed
+
+[handlers]
+keys: console,file
+
+[loggers]
+keys: script_manager,braille
+
+[formatter_simple]
+format: %(name)s:%(levelname)s:  %(message)s
+
+[formatter_detailed]
+format: %(name)s:%(levelname)s %(module)s:%(lineno)d:  %(message)s
+
+[handler_console]
+class: StreamHandler
+args: []
+formatter: simple
+
+[handler_file]
+class: FileHandler
+args: [('debug.out')]
+formatter: detailed
+
+[logger_script_manager]
+level: DEBUG
+qualname: orca.script_manager
+handlers: console
+
+[logger_braille]
+level: DEBUG
+qualname: orca.braille
+handlers: console

Added: branches/phase2/orca.desktop.in
==============================================================================
--- (empty file)
+++ branches/phase2/orca.desktop.in	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Encoding=UTF-8
+_Name=Orca Screen Reader and Magnifier
+_Comment=Present on-screen information as speech or braille, or magnify the screen
+Exec=orca
+Icon=orca
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=GNOME;GTK;Accessibility;
+X-GNOME-Bugzilla-Bugzilla=GNOME
+X-GNOME-Bugzilla-Product=orca
+X-GNOME-Bugzilla-Component=general
+

Added: branches/phase2/po/LINGUAS
==============================================================================
--- (empty file)
+++ branches/phase2/po/LINGUAS	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,61 @@
+# please keep this list sorted alphabetically
+#
+ar
+bg
+bn
+bn_IN
+ca
+cs
+cy
+da
+de
+dz
+el
+en_CA
+en_GB
+es
+et
+eu
+fi
+fr
+gl
+gu
+hi
+hu
+it
+ja
+kn
+ko
+lt
+lv
+mai
+mk
+ml
+mr
+nb
+ne
+nl
+nn
+oc
+or
+pa
+pl
+pt
+pt_BR
+ru
+rw
+si
+sl
+sq
+sr
+sr latin
+sv
+ta
+te
+th
+tr
+uk
+vi
+zh_CN
+zh_HK
+zh_TW

Added: branches/phase2/po/POTFILES.in
==============================================================================
--- (empty file)
+++ branches/phase2/po/POTFILES.in	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,3 @@
+# List of source files containing translatable strings.
+# Please keep this file sorted alphabetically.
+[encoding: UTF-8]

Added: branches/phase2/po/POTFILES.skip
==============================================================================
--- (empty file)
+++ branches/phase2/po/POTFILES.skip	Fri Sep 12 17:49:57 2008
@@ -0,0 +1 @@
+src/louis/constants.py

Added: branches/phase2/pylintrc
==============================================================================
--- (empty file)
+++ branches/phase2/pylintrc	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,340 @@
+# lint Python modules using external checkers.
+# 
+# This is the main checker controling the other ones and the reports
+# generation. It is itself both a raw checker and an astng checker in order
+# to:
+# * handle message activation / deactivation at the module level
+# * handle some basic but necessary stats'data (number of classes, methods...)
+# 
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+# [[[WDW - ensure Accessibility symbols are imported to avoid errors
+# such as E1101:  4: Module 'pyatspi' has no 'ROLE_TEXT' member.
+# I couldn't get this to work, but I did get the command line 
+# version to work: pylint --init-hook="import pyatspi" *.py.]]]
+#init-hook="import pyatspi"
+#init-hook=import pyatspi
+
+# Profiled execution.
+profile=no
+
+# Add <file or directory> to the black list. It should be a base name, not a
+# path. You may set this option multiple times.
+ignore=.svn
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Set the cache size for astng objects.
+cache-size=500
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+
+[MESSAGES CONTROL]
+
+# Enable only checker(s) with the given id(s). This option conflicts with the
+# disable-checker option
+#enable-checker=
+
+# Enable all checker(s) except those with the given id(s). This option
+# conflicts with the enable-checker option
+#disable-checker=
+
+# Enable all messages in the listed categories.
+#enable-msg-cat=
+
+# Disable all messages in the listed categories.
+#disable-msg-cat=
+
+# Enable the message(s) with the given id(s).
+#enable-msg=
+
+# Disable the message(s) with the given id(s).
+#
+# E0611: No name in module -- pylint gives too many false positives
+#        from orca/scripts/*.py files.
+#
+# W0102: Default argument is a mutable value (list or dictionary)
+# W0141: Used builtin function 'map'
+# W0333: Use of the `` operator
+# W0401: Wildcard import constants
+# W0403: Relative import
+# W0511: Warning note (FIXME or XXX) detected.
+# W0603: Using the global statement
+# W0612: Unused variable
+# W0613: Unused argument
+# W0702: No exception's type specified
+# W0704: Except doesn't do anything
+# C0111: Missing docstring
+# C0302: Module has too much lines
+# R0201: could be a function
+# R0401: Cyclic import between two or more modules detected
+# R0801: Similar lines detected among multiple files
+# R0902: Class has too many instance attributes
+# R0903: Class has too few public methods
+# R0904: Class has too many public methods
+# R0911: Function or method has too many return statements
+# R0912: Function or method has too many branches
+# R0913: Function or method takes too many arguments
+# R0914: Function or method has too many local variables
+# R0915: Function or method has too many statements
+#
+#disable-msg=E0611,C0111,R0201,W0102,W0141,W0333,W0401,W0403,W0603,W0612,W0613,W0702,W0704,W0511,R0801,R0912,R0915,R0914,R0904,R0903,R0401,R0911,R0913,C0302,R0902
+disable-msg=W0403,W0612,W0613,W0702,W0704,R0903
+
+[REPORTS]
+
+# set the output format. Available formats are text, parseable, colorized, msvs
+# (visual studio) and html
+output-format=text
+
+# Include message's id in output
+include-ids=yes
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]".
+files-output=no
+
+# Tells wether to display a full report or only the messages
+reports=yes
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note).You have access to the variables errors warning, statement which
+# respectivly contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (R0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Add a comment according to your evaluation note. This is used by the global
+# evaluation report (R0004).
+comment=yes
+
+# Enable the report(s) with the given id(s).
+#enable-report=
+
+# Disable the report(s) with the given id(s).
+#disable-report=
+
+
+# checks for :
+# * doc strings
+# * modules / classes / functions / methods / arguments / variables name
+# * number of arguments, local variables, branchs, returns and statements in
+# functions, methods
+# * required module attributes
+# * dangerous default values as arguments
+# * redefinition of function / method / class
+# * uses of the global statement
+# 
+[BASIC]
+
+# Required attributes for module, separated by a comma
+required-attributes=
+
+# Regular expression which should only match functions or classes name which do
+# not require a docstring
+no-docstring-rgx=__.*__
+
+# Regular expression which should only match correct module names
+module-rgx=(([a-z_][a-zA-Z0-9_-]*)|([A-Z][a-zA-Z0-9_-]+))$
+
+# Regular expression which should only match correct module level names
+const-rgx=(([a-zA-Z_][a-zA-Z1-9_]*)|(__.*__))$
+
+# Regular expression which should only match correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression which should only match correct function names
+function-rgx=[a-z_][a-zA-Z0-9_]*$
+
+# Regular expression which should only match correct method names
+method-rgx=[a-z_][a-zA-Z0-9_]*$
+
+# Regular expression which should only match correct instance attribute names
+attr-rgx=[a-z_][a-zA-Z0-9_]*$
+
+# Regular expression which should only match correct argument names
+argument-rgx=[a-z_][a-zA-Z0-9_]*$
+
+# Regular expression which should only match correct variable names
+variable-rgx=[a-z_][a-zA-Z0-9_]*$
+
+# Regular expression which should only match correct list comprehension /
+# generator expression variable names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_,Q_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# List of builtins function names that should not be used, separated by a comma
+# [[[richb - removed "filter" from this list as it's used in defauly.py.]]]
+bad-functions=map,apply,input
+
+
+# try to find bugs in the code using type inference
+# 
+[TYPECHECK]
+
+# Tells wether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# When zope mode is activated, consider the acquired-members option to ignore
+# access to some undefined attributes.
+zope=no
+
+# List of members which are usually get through zope's acquisition mecanism and
+# so shouldn't trigger E0201 when accessed (need zope=yes to be considered).
+acquired-members=REQUEST,acl_users,aq_parent
+
+
+# checks for
+# * unused variables / imports
+# * undefined variables
+# * redefinition of variable from builtins or from an outer scope
+# * use of variable before assigment
+# 
+[VARIABLES]
+
+# Tells wether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=_|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+
+# checks for :
+# * methods without self as first argument
+# * overridden methods signature
+# * access only to existant members via self
+# * attributes not defined in the __init__ method
+# * supported interfaces implementation
+# * unreachable code
+# 
+[CLASSES]
+
+# List of interface methods to ignore, separated by a comma. This is used for
+# instance to not check methods defines in Zope's Interface base class.
+ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+
+# checks for sign of poor/misdesign:
+# * number of methods, attributes, local variables...
+# * size, complexity of functions, methods
+# 
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of branch for function / method body
+max-branchs=12
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+
+# checks for
+# * external modules dependencies
+# * relative / wildcard imports
+# * cyclic imports
+# * uses of deprecated modules
+# 
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report R0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report R0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report R0402 must
+# not be disabled)
+int-import-graph=
+
+
+# checks for :
+# * unauthorized constructions
+# * strict indentation
+# * line length
+# * use of <> instead of !=
+# 
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=80
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string='    '
+
+
+# checks for:
+# * warning notes in the code like FIXME, XXX
+# * PEP 263: source code with non ascii character but no encoding declaration
+# 
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+# checks for similarities and duplicated code. This computation may be
+# memory / CPU intensive, so you should disable it if you experiments some
+# problems.
+# 
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes

Added: branches/phase2/run_pylint.sh.in
==============================================================================
--- (empty file)
+++ branches/phase2/run_pylint.sh.in	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# Script to run pylint on the Orca sources you've modified or added.
+# See http://live.gnome.org/Orca/Pylint for more info.
+#
+exec_prefix= prefix@
+INSTALL_DIR= pyexecdir@
+if [ "x$*" == "x" ]
+then
+    FILES=`svn stat src/orca | egrep "^M|^A" | grep "[.]py$" | awk '{ print $2 }'`
+else
+    FILES="$*"
+fi
+FILES=`echo $FILES | sed 's^src/orca/^^g'`
+echo Thank you for your attention to quality
+for foo in $FILES
+do
+    echo
+    OUTPUT_FILE=`dirname $foo`/`basename $foo .py`.pylint
+    OUTPUT_FILE=`echo $OUTPUT_FILE | sed 's~^./~~' | sed 's^/^.^g'`
+    echo Checking $foo, sending output to $OUTPUT_FILE
+    PYTHONPATH=$INSTALL_DIR:$PYTHONPATH pylint --init-hook="import pyatspi" $INSTALL_DIR/orca/$foo > $OUTPUT_FILE 2>&1
+    grep "code has been rated" $OUTPUT_FILE | cut -f1 -d\( \
+    | sed "s/.pylint:Your code has been rated at / /" \
+    | sed "s^/10^^" | sort -n -k 2,2
+done

Added: branches/phase2/src/Makefile.am
==============================================================================
--- (empty file)
+++ branches/phase2/src/Makefile.am	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,5 @@
+if WITH_LOUIS
+SUBDIRS = orca louis
+else
+SUBDIRS = orca
+endif

Added: branches/phase2/src/louis/Makefile.am
==============================================================================
--- (empty file)
+++ branches/phase2/src/louis/Makefile.am	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,24 @@
+louis_LTLIBRARIES = _louis.la
+
+louisdir = $(pyexecdir)/orca/louis
+
+_louis_la_CFLAGS = 		\
+	$(LOUIS_CFLAGS) 	\
+	$(PYTHON_INCLUDES)
+
+_louis_la_LDFLAGS = 	\
+	$(LOUIS_LIBS)	\
+	-module 			\
+	-avoid-version 		\
+	-llouis
+
+_louis_la_SOURCES = \
+	_louis.c
+
+louis_pythondir=$(louisdir)
+
+louis_python_PYTHON = \
+	__init__.py 
+
+nodist_louis_python_PYTHON = \
+	constants.py
\ No newline at end of file

Added: branches/phase2/src/louis/__init__.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/louis/__init__.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,198 @@
+# Liblouis Python bindings
+#
+# Copyright 2007-2008 Eitan Isaacson
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Liblouis Python bindings"""
+
+__copyright__ = "Copyright (c) 2007-2008 Eitan Isaacson"
+__license__   = "LGPL"
+
+from constants import *
+import os
+
+def listTables():
+   tables = {}
+   try:
+      for fname in os.listdir(TABLES_DIR):
+         if fname[-4:] in ('.utb', '.ctb'):
+            alias = fname[:-4]
+            tables[TABLE_NAMES.get(alias, alias)] = \
+                                          os.path.join(TABLES_DIR, fname)
+   except OSError:
+      pass
+
+   return tables
+
+def getDefaultTable():
+   try:
+      for fname in os.listdir(TABLES_DIR):
+         if fname[-4:] in ('.utb', '.ctb'):
+            if fname.startswith('en-us'):
+               return os.path.join(TABLES_DIR, fname)
+   except OSError:
+      pass
+
+   return ''
+
+#####################################################################
+#
+# The following code is here to compensate on a few current liblouis
+# bugs.
+#
+#####################################################################
+
+import _louis
+version = _louis.version
+translateString = _louis.translateString
+
+def translate(tran_tables, inbuf, typeform=[], cursorPos=0, mode=0):
+   if mode == MODE.compbrlAtCursor:
+      contracted, inPos, outPos, cursorPos,  = \
+                  _expandAtCursor(tran_tables, inbuf,
+                                  typeform, cursorPos, mode)
+   else:
+      contracted, inPos, outPos, cursorPos,  = \
+                  _louis.translate(tran_tables, inbuf,
+                                    typeform, cursorPos, mode)
+      
+   return contracted, inPos, outPos, cursorPos
+
+def _expandAtCursor(tran_tables, inbuf, typeform=[], cursorPos=0, mode=0):
+   """Contracts a inbuf, leaving the word under the cursor expanded.
+   This is a temporary method that should disappear once liblouis
+   get it right.
+   
+   Arguments:
+   - inbuf: Inbuf to contract.
+   - cursorPos: Offset of cursor.
+   """
+   prefix, uncontractedWord, suffix  = \
+           _divideLine(inbuf, cursorPos)
+
+   cursorInWord = cursorPos - len(prefix)
+
+   # Contract prefix
+   # 
+   prefixContracted, prefixInPos, prefixOutPos, cursorPos = \
+                     _louis.translate(tran_tables,
+                                     prefix.decode())
+
+   # Contract suffix
+   # 
+   suffixContracted, suffixInPos, suffixOutPos, cursorPos = \
+                     _louis.translate(tran_tables,
+                                     suffix.decode())
+
+   cursorPos = len(prefixContracted) + cursorInWord
+   
+   contracted = prefixContracted + \
+                uncontractedWord + \
+                suffixContracted
+
+   inPos = _mushPosArrays(prefixInPos,
+                          len(uncontractedWord),
+                          suffixInPos)
+
+   outPos = _mushPosArrays(prefixOutPos,
+                           len(uncontractedWord),
+                           suffixOutPos)
+
+   return contracted, inPos, outPos, cursorPos
+
+def _mushPosArrays(prefixPos, uncontractedLen, suffixPos):
+   try:
+      uncontractedPos = range(prefixPos[-1] + 1,
+                              uncontractedLen+prefixPos[-1] + 1)
+   except IndexError:
+      uncontractedPos = range(uncontractedLen)
+
+   pos = prefixPos + \
+         uncontractedPos
+
+   try:
+      suffixOffset = pos[-1] + 1
+   except IndexError:
+      suffixOffset = 0
+
+   pos += [offs + suffixOffset for offs in suffixPos]
+
+   return pos
+
+def _partition(myStr, mySep):
+   """Provides an implementation of partition for compatibility with
+   Python 2.4.
+
+   Arguments:
+   - myStr: the string
+   - mySep: the separator to look for, starting at the beginning of the string
+
+   Returns:
+   (stringBeforeSep, mySep, stringAfterSep)
+   """
+
+   try:
+     return myStr.partition(mySep)
+   except AttributeError:
+     index = myStr.find(mySep)
+     if index < 0:
+        return (myStr, u'', u'')
+     else:
+        return (myStr[0:index], 
+                myStr[index:index+len(mySep)], 
+                myStr[index+len(mySep):])
+
+def _rpartition(myStr, mySep):
+   """Provides an implementation of rpartition for compatibility with
+   Python 2.4.
+
+   Arguments:
+   - myStr: the string
+   - mySep: the separator to look for, starting at the end of the string
+
+   Returns:
+   (stringBeforeSep, mySep, stringAfterSep)
+   """
+
+   try:
+     return myStr.rpartition(mySep)
+   except AttributeError:
+     index = myStr.rfind(mySep)
+     if index < 0:
+        return (u'', u'', myStr)
+     else:
+        return (myStr[0:index], 
+                myStr[index:index+len(mySep)], 
+                myStr[index+len(mySep):])
+
+def _divideLine(line, offset):
+   """Isolates a word the cursor is on and returns the prefix,
+   the cursored word, and the suffix. This is a temporary method
+   that avoids a liblouis bug.
+   
+   Arguments:
+   - line: The line to process.
+   - offset: The offset of the cursor.
+   """
+   if len(line) <= offset:
+      return line, '', ''
+   
+   firstHalf = _rpartition(line[:offset], ' ')
+   secondHalf = _partition(line[offset:], ' ')
+   return firstHalf[0] + firstHalf[1], \
+          firstHalf[2] + secondHalf[0], \
+          secondHalf[1] + secondHalf[2]

Added: branches/phase2/src/louis/_louis.c
==============================================================================
--- (empty file)
+++ branches/phase2/src/louis/_louis.c	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,240 @@
+/* Liblouis Python bindings
+ *
+ * Copyright 2007-2008 Eitan Isaacson
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+ * Boston MA  02110-1301 USA.
+ *
+ */
+
+#include <string.h>
+#include <errno.h>
+#include <dlfcn.h>
+#include <Python.h>
+#include <liblouis.h>
+
+static PyObject *module;
+
+static PyObject *
+louis_version(PyObject *self)
+{
+		const char *version_string;
+		version_string = lou_version();
+		return Py_BuildValue("s", version_string);
+}
+
+
+char *
+pylist_to_string(PyObject *list)
+{
+		PyObject *list_joined, *sep;
+		char *rv;
+
+		sep = PyString_FromString(",");
+		list_joined = PyUnicode_Join(sep, list);
+		if (list_joined == NULL) 
+        {
+				/* Some list items were probably not strings */
+				Py_DECREF(sep);
+				return NULL;
+        }
+		rv = strdup(PyString_AsString(list_joined));
+
+		Py_DECREF(list_joined);
+		Py_DECREF(sep);
+
+		return rv;
+}
+
+char *
+pylist_to_typeform(PyObject *typeform_list, int len)
+{
+		char *typeform;
+		int i;
+		PyObject *l_item;
+		typeform = calloc(len, sizeof(char));
+		for (i=0; i < len; i++)
+		{
+				l_item = PySequence_Fast_GET_ITEM(typeform_list, i);
+				typeform[i] = (char)PyInt_AsLong(l_item);
+		}
+		return typeform;
+		
+}
+
+PyObject *
+intbuf_to_pylist(int *intbuf, int len)
+{
+		PyObject *pylist;
+		int i;
+
+		pylist = PyList_New(len);
+
+		for (i=0;i<len;i++)
+				PyList_SetItem(pylist, i, PyInt_FromLong((long)intbuf[i]));
+
+		return pylist;
+}
+
+static PyObject *
+louis_translateString(PyObject *self, PyObject *args, PyObject *kw)
+{
+        static char *kw_args[]={"tran_tables", "inbuf", 
+                                "typeform", "spacing", "mode", 0};
+		char *typeform = NULL, *trantab_joined, *spacing = NULL;
+		widechar *outbuf;
+		int inlen, outlen, mode = 0;
+		PyObject *trantab_list, *out, *typeform_list = NULL;
+		Py_UNICODE *u_inbuf;
+		int rv;
+
+		if (!PyArg_ParseTupleAndKeywords(args, kw,
+                                         "Ou#|OOi:translateString", kw_args,
+                                         &trantab_list, &u_inbuf, &inlen,
+                                         &typeform_list, &spacing, &mode))
+		{
+				return NULL;
+        }
+        
+		trantab_joined = pylist_to_string(trantab_list);
+
+        if (trantab_joined == NULL) 
+        {
+               PyErr_SetString(
+                       PyExc_TypeError,
+                       "translateString() argument 1 needs to be a list of strings"); 
+               return NULL;
+        }
+
+		if (PySequence_Size(typeform_list) > 0) 
+				typeform = pylist_to_typeform(typeform_list, 
+                                              PySequence_Size(typeform_list));
+
+        outlen = inlen*2;
+		outbuf = calloc(outlen, sizeof(widechar));
+
+		rv = lou_translateString(trantab_joined, (widechar *)u_inbuf, 
+                                 &inlen, outbuf, &outlen, typeform, 
+                                 spacing, mode);
+
+        out = PyUnicode_FromUnicode((Py_UNICODE *)outbuf, outlen);
+
+		if (typeform != NULL)
+				free(typeform);
+		free(trantab_joined);
+        free(outbuf);
+
+        PyErr_Clear();
+
+        return out;
+
+}
+
+static PyObject *
+louis_translate(PyObject *self, PyObject *args, PyObject *kw)
+{
+        static char *kw_args[]={"tran_tables", "inbuf", 
+                                "typeform", "cursorPos","mode", 0};
+		char *typeform = NULL, *trantab_joined, *spacing = NULL;
+		widechar *outbuf;
+		int inlen, outlen, mode = 0, cursorPos = 0, inlen_cp;
+		int rv, *outputPos = NULL, *inputPos = NULL, i;
+		PyObject *trantab_list, *out, *typeform_list = NULL, *outputPos_list,
+				*inputPos_list;
+		Py_UNICODE *u_inbuf;
+
+		if (!PyArg_ParseTupleAndKeywords(args, kw,
+                                         "Ou#|Oii:translate", kw_args,
+                                         &trantab_list, &u_inbuf, &inlen,
+                                         &typeform_list, &cursorPos,
+										 &mode))
+		{
+				return NULL;
+        }
+        
+		trantab_joined = pylist_to_string(trantab_list);
+
+        if (trantab_joined == NULL) 
+        {
+               PyErr_SetString(
+                       PyExc_TypeError,
+                       "translateString() argument 1 needs to be a list of strings"); 
+               return NULL;
+        }
+
+		if (PySequence_Size(typeform_list) > 0) 
+				typeform = pylist_to_typeform(typeform_list, 
+                                              PySequence_Size(typeform_list));
+
+
+        inlen_cp = inlen;
+
+		inputPos = calloc(inlen*2, sizeof(int));
+
+        outlen = inlen*2;
+		outbuf = calloc(outlen, sizeof(widechar));
+		outputPos = calloc(outlen, sizeof(int));
+
+		rv = lou_translate(trantab_joined, (widechar *)u_inbuf, 
+                           &inlen, outbuf, &outlen, typeform, spacing, 
+                           outputPos, inputPos, &cursorPos, mode);
+
+        out = PyUnicode_FromUnicode((Py_UNICODE *)outbuf, outlen);
+		inputPos_list = intbuf_to_pylist(inputPos, outlen);
+		outputPos_list = intbuf_to_pylist(outputPos, inlen_cp);
+
+		if (typeform != NULL) 
+                free(typeform);
+		free(trantab_joined);
+        free(outbuf);
+        free(outputPos);
+        free(inputPos);
+
+        PyErr_Clear();
+
+        return Py_BuildValue("(NNNi)", out, inputPos_list, 
+							 outputPos_list, cursorPos);
+
+}
+
+static PyMethodDef louis_methods[] = {
+		{"version", 
+         (PyCFunction) louis_version, METH_VARARGS},
+		{"translateString", 
+         (PyCFunction) louis_translateString, METH_KEYWORDS},
+		{"translate", 
+         (PyCFunction) louis_translate, METH_KEYWORDS},
+		{NULL, NULL}
+};
+
+static void
+cleanup_louis ()
+{
+        lou_free ();
+}
+
+PyMODINIT_FUNC 
+init_louis (void) {
+        static inited = 0;
+
+        module = Py_InitModule ("_louis", louis_methods);
+
+        if (!inited) {
+                inited = 1;
+                if (Py_AtExit(cleanup_louis) != 0)
+                        fprintf(stderr,
+                                "Louis: warning: cleanup procedure not registered\n");
+        }
+}

Added: branches/phase2/src/louis/constants.py.in
==============================================================================
--- (empty file)
+++ branches/phase2/src/louis/constants.py.in	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,72 @@
+# Liblouis Python bindings
+#
+# Copyright 2007-2008 Eitan Isaacson
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+
+from orca.orca_i18n import _           # for gettext support
+from orca.orca_i18n import Q_          # to provide qualified translatable strings
+
+# Translators: These are the braille translation table names for different
+# languages. You could read about braille tables at:
+# http://en.wikipedia.org/wiki/Braille
+#
+TABLE_NAMES = {'Cz-Cz-g1': _('Czech Grade 1'),
+               'Es-Es-g1': _('Spanish Grade 1'),
+               'Fr-Ca-g2': _('Canada French Grade 2'),
+               'Fr-Fr-g2': _('France French Grade 2'),
+               'Lv-Lv-g1': _('Latvian Grade 1'),
+               'Nl-Nl-g1': _('Netherlands Dutch Grade 1'),
+               'No-No-g0': _('Norwegian Grade 0'),
+               'No-No-g1': _('Norwegian Grade 1'),
+               'No-No-g2': _('Norwegian Grade 2'),
+               'No-No-g3': _('Norwegian Grade 3'),
+               'Pl-Pl-g1': _('Polish Grade 1'),
+               'Pt-Pt-g1': _('Portuguese Grade 1'),
+               'Se-Se-g1': _('Swedish Grade 1'),
+               'ar-ar-g1': _('Arabic Grade 1'),
+               'cy-cy-g1': _('Welsh Grade 1'),
+               'cy-cy-g2': _('Welsh Grade 2'),
+               'de-de-g0': _('German Grade 0'),
+               'de-de-g1': _('German Grade 1'),
+               'de-de-g2': _('German Grade 2'),
+               'en-GB-g2': _('U.K. English Grade 2'),
+               'en-gb-g1': _('U.K. English Grade 1'),
+               'en-us-g1': _('U.S. English Grade 1'),
+               'en-us-g2': _('U.S. English Grade 2'),
+               'fr-ca-g1': _('Canada French Grade 1'),
+               'fr-fr-g1': _('France French Grade 1'),
+               'gr-gr-g1': _('Greek Grade 1'),
+               'hi-in-g1': _('Hindi Grade 1'),
+               'it-it-g1': _('Italian Grade 1'),
+               'nl-be-g1': _('Belgium Dutch Grade 1')}
+
+TABLES_DIR = '@LOUIS_TABLE_DIR@'
+
+class TYPEFORM:
+   plain_text = 0
+   italic = 1
+   underline = 2
+   bold = 4
+   computer_braille = 8
+
+class MODE:
+   noContractions = 1
+   compbrlAtCursor = 2
+   dotsIO = 4
+   comp8Dots = 8
+   

Added: branches/phase2/src/orca/Makefile.am
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/Makefile.am	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,23 @@
+orca_SCRIPTS = \
+	orca
+
+orcadir=$(bindir)
+
+orca_pathdir=$(pyexecdir)
+
+orca_python_PYTHON = \
+	__init__.py \
+	braille_monitor.py \
+	braille.py \
+	default.py \
+	input_event.py \
+	key_bindings.py \
+	orca_i18n.py \
+	orca.py \
+	platform.py \
+	script_manager.py \
+	script.py \
+	settings.py \
+	utils.py
+
+orca_pythondir=$(pyexecdir)/orca

Added: branches/phase2/src/orca/__init__.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/__init__.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,6 @@
+"""Orca Screen Reader"""
+
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+

Added: branches/phase2/src/orca/braille.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/braille.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,311 @@
+# Orca
+#
+# Copyright 2005-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Used to get input events from the braille display and to paint raw
+strings to the braille display.
+"""
+
+__id__        = "$Id: braille.py 4171 2008-09-08 04:20:48Z joanied $"
+__version__   = "$Revision: 4171 $"
+__date__      = "$Date: 2008-09-08 00:20:48 -0400 (Mon, 08 Sep 2008) $"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+# If true, show the braille monitor on the display.
+#
+enableBrailleMonitor = False
+
+# The tty where BrlTTY will be used.
+#
+tty = 7
+
+import logging
+log = logging.getLogger('orca.braille')
+info_log = logging.getLogger('braille')
+
+import brlapi
+import gobject
+
+from orca_i18n import _ # for gettext support
+
+_brlAPI = None
+_brlAPIRunning = False
+_brlAPISourceId = 0
+
+# If True, this module has been initialized.
+#
+_initialized = False
+
+# The braille monitor
+#
+monitor = None
+
+# Common names for most used BrlTTY commands, to be shown in the GUI.
+#
+command_name = {}
+
+# Translators: this is a command for a button on a refreshable braille
+# display (an external hardware device used by people who are blind).
+# When pressing the button, the display scrolls to the left.
+#
+command_name[brlapi.KEY_CMD_FWINLT]   = _("Line Left")
+
+# Translators: this is a command for a button on a refreshable braille
+# display (an external hardware device used by people who are blind).
+# When pressing the button, the display scrolls to the right.
+#
+command_name[brlapi.KEY_CMD_FWINRT]   = _("Line Right")
+
+# Translators: this is a command for a button on a refreshable braille
+# display (an external hardware device used by people who are blind).
+# When pressing the button, the display scrolls up.
+#
+command_name[brlapi.KEY_CMD_LNUP]     = _("Line Up")
+
+# Translators: this is a command for a button on a refreshable braille
+# display (an external hardware device used by people who are blind).
+# When pressing the button, the display scrolls down.
+#
+command_name[brlapi.KEY_CMD_LNDN]     = _("Line Down")
+
+# Translators: this is a command for a button on a refreshable braille
+# display (an external hardware device used by people who are blind).
+# When pressing the button, the display scrolls to the top left of the
+# window.
+#
+command_name[brlapi.KEY_CMD_TOP_LEFT] = _("Top Left")
+
+# Translators: this is a command for a button on a refreshable braille
+# display (an external hardware device used by people who are blind).
+# When pressing the button, the display scrolls to the bottom right of
+# the window.
+#
+command_name[brlapi.KEY_CMD_BOT_LEFT] = _("Bottom Right")
+
+# Translators: this is a command for a button on a refreshable braille
+# display (an external hardware device used by people who are blind).
+# When pressing the button, the display scrolls to position containing
+# the cursor.
+#
+command_name[brlapi.KEY_CMD_HOME]     = _("Cursor Position")
+
+# The size of the physical display (width, height).  The coordinate system of
+# the display is set such that the upper left is (0,0), x values increase from
+# left to right, and y values increase from top to bottom.
+#
+# For the purposes of testing w/o a braille display, we'll set the display
+# size to width=32 and height=1.
+#
+# [[[TODO: WDW - Only a height of 1 is support at this time.]]]
+#
+_displaySize = [32, 1]
+
+# The callback to call on a BrlTTY input event.  This is passed to
+# the init method.
+#
+_callback = None
+
+def writeText(text, attributeMask, cursorCell):
+    """Writes the given text with the given attribute mask.  Also
+    puts the cursor at the given 1-based cursorCell (0 means no cursor).
+    """
+    global monitor
+
+    logLine = "     VISIBLE:  '%s', cursor=%d" % (text, cursorCell)
+    log.info(logLine.encode("UTF-8"))
+    info_log.info(logLine.encode("UTF-8"))
+
+    if _brlAPIRunning:
+        writeStruct = brlapi.WriteStruct()
+        writeStruct.regionBegin = 1
+        writeStruct.regionSize = len(text)
+        while writeStruct.regionSize < _displaySize[0]:
+            text += " "
+            if attributeMask:
+                attributeMask += '\x00'
+            writeStruct.regionSize += 1
+        writeStruct.text = text
+        writeStruct.cursor = cursorCell
+        if attributeMask:
+            writeStruct.attrOr = attributeMask[startPos:endPos]
+        _brlAPI.write(writeStruct)
+
+    if enableBrailleMonitor:
+        if not monitor:
+            monitor = braille_monitor.BrailleMonitor(_displaySize[0])
+            monitor.show_all()
+        monitor.writeText(text, attributeMask, cursorCell)
+    elif monitor:
+        monitor.destroy()
+        monitor = None
+
+def _processBrailleEvent(event):
+    """Handles BrlTTY events.  This passes commands on to the callback
+    for processing.
+
+    Arguments:
+    - event: the BrlAPI input event (expanded keycode)
+    """
+    log.debug("input event: %s" % event)
+    consumed = False
+    if _callback:
+        try:
+            # Like key event handlers, a return value of True means
+            # the command was consumed.
+            #
+            consumed = _callback(event)
+        except:
+            log.exception('exception from braille callback')
+            consumed = False
+    return consumed
+
+def _brlAPIKeyReader(source, condition):
+    """Method to read a key from the BrlAPI bindings.  This is a
+    gobject IO watch handler.
+    """
+    key = _brlAPI.readKey(False)
+    if key:
+        _processBrailleEvent(_brlAPI.expandKeyCode(key))
+    return _brlAPIRunning
+
+def setupKeyRanges(keys):
+    """Hacky method to tell BrlTTY what to send and not send us via
+    the readKey method.  This only works with BrlTTY v3.8 and better.
+
+    Arguments:
+    -keys: a list of BrlAPI commands.
+    """
+    if not _brlAPIRunning:
+        return
+
+    try:
+        # First, start by ignoring everything.
+        #
+        _brlAPI.ignoreKeys(brlapi.rangeType_all, [0])
+
+        # Next, enable cursor routing keys.
+        #
+        keySet = [brlapi.KEY_TYPE_CMD | brlapi.KEY_CMD_ROUTE]
+
+        # Finally, enable the commands we care about.
+        #
+        for key in keys:
+            keySet.append(brlapi.KEY_TYPE_CMD | key)
+        _brlAPI.acceptKeys(brlapi.rangeType_command, keySet)
+    except:
+        log.exception('exception while setting up braille key ranges:')
+
+def init(callback=None):
+    """Initializes the braille module, connecting to the BrlTTY driver.
+
+    Arguments:
+    - callback: the method to call with a BrlTTY input event.
+    Returns True if the initialization procedure was run or False if this
+    module has already been initialized.
+    """
+
+    global _initialized
+    global _displaySize
+    global _callback
+
+    global _brlAPI
+    global _brlAPIRunning
+    global _brlAPISourceId
+
+    if _initialized:
+        return False
+
+    _callback = callback
+
+    try:
+        gobject.threads_init()
+        _brlAPI = brlapi.Connection()
+
+        try:
+            import os
+            windowPath = os.environ["WINDOWPATH"]
+            _brlAPI.enterTtyModeWithPath()
+            _brlAPIRunning = True
+            log.info("braille module been initialized using WINDOWPATH=%s"
+                     % windowPath)
+        except:
+            _brlAPI.enterTtyMode(tty)
+            _brlAPIRunning = True
+            log.info("braille module initialized using tty=%d" % tty)
+
+        _brlAPISourceId = gobject.io_add_watch(_brlAPI.fileDescriptor,
+                                               gobject.IO_IN,
+                                               _brlAPIKeyReader)
+    except:
+        log.exception("exception while initializing brltty:")
+        return False
+
+    _displaySize = _brlAPI.displaySize
+
+    _initialized = True
+
+    return True
+
+def shutdown():
+    """Shuts down the braille module.   Returns True if the shutdown procedure
+    was run or False if this module has not been initialized.
+    """
+    global _initialized
+    if not _initialized:
+        return False
+
+    global brlAPIRunning
+    global brlAPISourceId
+    if brlAPIRunning:
+        brlAPIRunning = False
+        gobject.source_remove(brlAPISourceId)
+        brlAPISourceId = 0
+        brlAPI.leaveTtyMode()
+
+    _initialized = False
+    return True
+
+def _myCallback(event):
+    if event["type"] == brlapi.KEY_TYPE_CMD:
+        print "This is a command"
+    else:
+        print "This is not a command", event["type"]
+
+    if event["command"] == brlapi.KEY_CMD_ROUTE:
+        cursor = int(event["argument"]) + 1
+        text = "Cursor routing key %d" % cursor
+    elif event["command"] == brlapi.KEY_CMD_FWINLT:
+        cursor = 0
+        text = "Pan left"
+    elif event["command"] == brlapi.KEY_CMD_FWINRT:
+        cursor = 0
+        text = "Pan right"
+
+    print text
+    writeText(text, None, cursor)
+
+if __name__ == "__main__":
+    logging.basicConfig(format="%(name)s %(message)s")
+    log.setLevel(logging.DEBUG)
+
+    import gtk
+    init(_myCallback)
+    setupKeyRanges([brlapi.KEY_CMD_FWINLT, brlapi.KEY_CMD_FWINRT])
+    print "Press keys on the braille display.  Press Ctrl+C to quit."
+    gtk.main()

Added: branches/phase2/src/orca/braille_monitor.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/braille_monitor.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,210 @@
+# Orca
+#
+# Copyright 2006-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Provides a graphical braille display at the top of the screen.
+This is mainly for debugging and for demonstrations."""
+
+__id__        = "$Id: brlmon.py 3882 2008-05-07 18:22:10Z richb $"
+__version__   = "$Revision: 3882 $"
+__date__      = "$Date: 2008-05-07 14:22:10 -0400 (Wed, 07 May 2008) $"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import logging
+log = logging.getLogger("orca.braille_monitor")
+
+import gtk
+
+# Attribute/Selection mask strings:
+#
+DOT_7 =   '\x40' # 01000000
+DOT_8 =   '\x80' # 10000000
+DOTS_78 = '\xc0' # 11000000
+    
+# Markup strings:
+#
+NORMAL = " size='xx-large'"
+
+CURSOR_CELL_EMPTY =   " background='black'" \
+                    + " weight='ultrabold'" \
+                    + " style='italic'"
+
+CURSOR_CELL =   " background='white'" \
+              + " weight='ultrabold'" \
+              + " style='italic'" \
+
+ATTRIBUTE_7 = " underline='low'"
+
+ATTRIBUTE_8 = " underline='error'"
+
+ATTRIBUTE_78 = " underline='double'"
+
+# We subclass gtk.Window, which has a lot of public methods.  We'll
+# disable the pylint message for that.
+#
+# pylint: disable-msg=R0904
+
+class BrailleMonitor(gtk.Window):
+    """Displays a GUI braille monitor that mirrors what is being
+    shown on the braille display.
+    """
+    def __init__(self, numCells=32, cellWidth=25, cellHeight=50):
+        """Create a new BrlMon.
+
+        Arguments:
+        - numCells: how many braille cells to make
+        - cellWidth: width of each cell in pixels
+        - cellHeight: height of each cell in pixels
+        """
+        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
+        self.set_title("Braille Monitor")
+        self.set_default_size(cellWidth * numCells, cellHeight)
+        hbox = gtk.HBox(True)
+        self.add(hbox)
+        self.cellFrames = []
+        self.cellLabels = []
+        i = 0
+        while (i < numCells):
+            frame = gtk.Frame()
+            frame.set_shadow_type(gtk.SHADOW_OUT)
+            label = gtk.Label(" ")
+            label.set_use_markup(True)
+            frame.add(label)
+            hbox.add(frame)
+            self.cellFrames.append(frame)
+            self.cellLabels.append(label)
+            i += 1
+
+        # This prevents it from getting focus.
+        #
+        self.set_property("accept-focus", False)
+        self.connect_after("check-resize", self.onResize)
+
+    def onResize(self, obj):
+        """Tell the window to be a dock and set its struts, which I
+        think means to attempt to glue it somewhere on the display.
+        """
+        # We know what we are doing here, so tell pylint not to flag
+        # the self.window method calls as errors (e.g., Class 'window' 
+        # has no 'get_size' member).  The disable-msg is localized to
+        # just this method.
+        #
+        # pylint: disable-msg=E1101
+        #
+        screen_width = gtk.gdk.screen_width()
+        [window_width, window_height] = self.window.get_size()
+        if window_width < screen_width:
+            x = (screen_width - window_width) / 2
+        else:
+            x = 0
+
+        self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK)
+        self.window.property_change(
+                gtk.gdk.atom_intern("_NET_WM_STRUT_PARTIAL", False),
+                gtk.gdk.atom_intern("CARDINAL", False), 32,
+                gtk.gdk.PROP_MODE_REPLACE,
+                [0,                     # LEFT
+                 0,                     # RIGHT
+                 window_height,         # TOP
+                 0,                     # BOTTOM
+                 0,                     # LEFT_START
+                 0,                     # LEFT_END
+                 0,                     # RIGHT_START
+                 0,                     # RIGHT_END
+                 0,                     # TOP_START
+                 screen_width - 1,      # TOP_END
+                 0,                     # BOTTOM_START
+                 0])                    # BOTTOM_END
+
+        self.move(x, 0)
+
+    # There are a lot of decision branches happening below, but
+    # it's OK for this method.  We'll disable the pylint message.
+    #
+    # pylint: disable-msg=R0912
+
+    def writeText(self, text, attributeMask, cursorCell):
+        """Display the given text and highlight the given
+        cursor cell.  A cursorCell of 0 means no cell has
+        the cursor.
+
+        Arguments:
+        - cursorCell: 1-based index of cell with cursor
+        - attributeMask: attributes to apply to the text
+        - text: len must be <= num cells.
+        """
+        # Fill out the cells from the string.
+        #
+        try:
+            text = text.decode("UTF-8")
+        except:
+            text = ""
+
+        for i in range(0, len(text)):
+
+            # Handle special chars so they are not interpreted by pango.
+            #
+            if text[i] == "<":
+                char = "&lt;"
+            elif text[i] == "&":
+                char = "&amp;"
+            elif text[i] == "\t":
+                char = "$t"
+            else:
+                char = text[i]
+
+            markup = NORMAL
+            if i == (cursorCell - 1):
+                if text[i] == " ":
+                    markup += CURSOR_CELL_EMPTY
+                else:
+                    markup += CURSOR_CELL
+                self.cellFrames[i].set_shadow_type(
+                    gtk.SHADOW_IN)
+            else:
+                self.cellFrames[i].set_shadow_type(
+                    gtk.SHADOW_OUT)
+
+            if attributeMask:
+                if (attributeMask[i] == DOTS_78):
+                    markup += ATTRIBUTE_78
+                elif (attributeMask[i] == DOT_7):
+                    markup += ATTRIBUTE_7
+                elif (attributeMask[i] == DOT_8):
+                    markup += ATTRIBUTE_8
+
+            self.cellLabels[i].set_markup(
+                "<span" + markup + ">%s</span>" % char)
+
+        # Pad the rest
+        #
+        for i in range(len(text), len(self.cellFrames)):
+            self.cellLabels[i].set_text(" ")
+            self.cellFrames[i].set_shadow_type(
+                gtk.SHADOW_OUT)
+
+if __name__ == "__main__":
+    # [[[TODO: WDW - this doesn't work.]]]
+    logging.basicConfig(format="%(name)s %(message)s")
+    log.setLevel(logging.DEBUG)
+
+    monitor = BrailleMonitor()
+    monitor.realize()
+    monitor.show_all()
+    gtk.main()

Added: branches/phase2/src/orca/default.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/default.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,47 @@
+# Orca
+#
+# Copyright 2004-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""The default Script for presenting information to the user using
+both speech and Braille.  This is based primarily on the de-facto
+standard implementation of the AT-SPI, which is the GAIL support
+for GTK."""
+
+__id__        = "$Id: default.py 4190 2008-09-11 15:28:56Z wwalker $"
+__version__   = "$Revision: 4190 $"
+__date__      = "$Date: 2008-09-11 11:28:56 -0400 (Thu, 11 Sep 2008) $"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import logging
+log = logging.getLogger('orca.default')
+
+import script
+
+class Script(script.Script):
+    """The default Script from which all other scripts should be 
+    derived.
+    """
+
+    def __init__(self, application):
+        """Creates a new script for the given application.
+
+        Arguments:
+        - application: the application to create a script for.
+        """
+        script.Script.__init__(self, application)

Added: branches/phase2/src/orca/input_event.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/input_event.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,185 @@
+# Orca
+#
+# Copyright 2005-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Provides support for handling input events.  This provides several
+classes to define input events (InputEvent, KeyboardEvent,
+BrailleEvent, MouseButtonEvent), and also provides a InputEventHandler
+class.  It is intended that instances of InputEventHandler will be
+used which should be used to handle all input events."""
+
+__id__        = "$Id: input_event.py 3971 2008-06-11 00:54:46Z joanied $"
+__version__   = "$Revision: 3971 $"
+__date__      = "$Date: 2008-06-10 20:54:46 -0400 (Tue, 10 Jun 2008) $"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import logging
+log = logging.getLogger('orca.input_event')
+
+import key_bindings
+import pyatspi
+import time
+
+class InputEvent:
+    """Super class for all input events."""
+    def __init__(self):
+        """Creates a new input event of the given type.
+        """
+        pass
+
+class KeyboardEvent(InputEvent):
+    """An InputEvent that comes from the keyboard."""
+    def __init__(self, event):
+        """Creates a new InputEvent of type KEYBOARD_EVENT.
+
+        Arguments:
+        - event: the AT-SPI keyboard event
+        """
+        InputEvent.__init__(self)
+
+        # Control characters come through as control characters, so we
+        # just turn them into their ASCII equivalent.  NOTE that the
+        # upper case ASCII characters will be used (e.g., ctrl+a will
+        # be turned into the string "A").  All these checks here are
+        # to just do some sanity checking before doing the
+        # conversion. [[[WDW - this is making assumptions about
+        # mapping ASCII control characters to UTF-8.]]]
+        #
+        event_string = event.event_string
+        if (event.modifiers & key_bindings.CTRL_MODIFIER_MASK) \
+            and (not event.is_text) and (len(event_string) == 1):
+            value = ord(event.event_string[0])
+            if value < 32:
+                event_string = chr(value + 0x40)
+
+        # Filter out the NUMLOCK modifier -- it always causes problems.
+        #
+        event.modifiers = event.modifiers \
+                          & key_bindings.ALL_BUT_NUMLOCK_MODIFIER_MASK
+
+        self.type = event.type
+        self.hw_code = event.hw_code
+        self.modifiers = event.modifiers
+        self.event_string = event_string
+        self.is_text = event.is_text
+        self.time = time.time()
+
+    def __str__(self):
+        if self.type == pyatspi.KEY_PRESSED_EVENT:
+            s = "key '%s' pressed (mods=0x%x)" \
+                % (self.event_string, self.modifiers)
+        else:
+            s = "key '%s' released (mods=0x%x)" \
+                % (self.event_string, self.modifiers)
+        return s
+
+class BrailleEvent(InputEvent):
+    """An InputEvent that comes from the braille display."""
+    def __init__(self, event):
+        """Creates a new InputEvent of type BRAILLE_EVENT.
+
+        Arguments:
+        - event: the integer BrlTTY command for this event.
+        """
+        InputEvent.__init__(self)
+        self.event = event
+
+    def __str__(self):
+        return "braille event %s" % self.event
+
+class MouseButtonEvent(InputEvent):
+    """An InputEvent that comes from pressing a mouse button."""
+    def __init__(self, event):
+        """Creates a new InputEvent of type MOUSE_BUTTON_EVENT.
+        """
+        InputEvent.__init__(self)
+        self.x = event.detail1
+        self.y = event.detail2
+        self.pressed = event.type.endswith('p')
+        self.button = event.type[len("mouse:button:"):-1]
+        self.time = time.time()
+
+    def __str__(self):
+        if self.pressed:
+            s = "mouse button '%s' pressed at (%d,%y)" \
+                % (self.button, self.x, self.y)
+        else:
+            s = "mouse button '%s' released at (%d,%y)" \
+                % (self.button, self.x, self.y)
+        return s
+
+class InputEventHandler:
+    """Binds a function to a description."""
+    def __init__(self, function, description, learnModeEnabled=True):
+        """Creates a new InputEventHandler instance.  All bindings
+        (e.g., key bindings and braille bindings) will be handled
+        by an instance of an InputEventHandler.
+
+        Arguments:
+        - function: the function to call with an InputEvent instance as its
+                    sole argument.  The function is expected to return True
+                    if it consumes the event; otherwise it should return
+                    False
+        - description: a localized string describing what this InputEvent
+                       does
+        - learnModeEnabled: if True, the description will be spoken and
+                            brailled if learn mode is enabled.  If False,
+                            the function will be called no matter what.
+        """
+        self.function = function
+        self.description = description
+        self.learnModeEnabled = learnModeEnabled
+
+    def __str__(self):
+        return "%s (learnModeEnabled=%s)" \
+               % (self.description, self.learnModeEnabled)
+
+    def __eq__(self, other):
+        """Compares one input handler to another."""
+        return (self.function == other.function)
+
+    def processInputEvent(self, script, inputEvent):
+        """Processes an input event.  If settings.learnModeEnabled is True,
+        this will merely report the description of the input event to braille
+        and speech.  If settings.learnModeEnabled is False, this will call the
+        function bound to this InputEventHandler instance, passing the
+        inputEvent as the sole argument to the function.
+
+        This function is expected to return True if it consumes the
+        event; otherwise it is expected to return False.
+
+        Arguments:
+        - script:     the script (if any) associated with this event
+        - inputEvent: the input event to pass to the function bound
+                      to this InputEventHandler instance.
+        """
+        log.debug("process %s for %s" % (inputEvent, script))
+        try:
+            consumed = self.function(script, inputEvent)
+        except:
+            log.exception("while attempting to process input event")
+            consumed = False
+        return consumed
+
+if __name__ == "__main__":
+    logging.basicConfig(format="%(name)s %(message)s")
+    log.setLevel(logging.DEBUG)
+
+    handler = InputEventHandler(None, "Does something")
+    print handler

Added: branches/phase2/src/orca/key_bindings.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/key_bindings.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,446 @@
+# Orca
+#
+# Copyright 2005-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Provides support for defining keybindings and matching them to input
+events."""
+
+__id__        = "$Id: keybindings.py 3971 2008-06-11 00:54:46Z joanied $"
+__version__   = "$Revision: 3971 $"
+__date__      = "$Date: 2008-06-10 20:54:46 -0400 (Tue, 10 Jun 2008) $"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import logging
+log = logging.getLogger('orca.key_bindings')
+
+try:
+    # This can fail due to gtk not being available.  We want to
+    # be able to recover from that if possible.  The main driver
+    # for this is to allow "orca --text-setup" to work even if
+    # the desktop is not running.
+    #
+    import gtk
+except ImportError:
+    pass
+
+import pyatspi
+
+from orca_i18n import _ # for gettext support
+
+# A new modifier to use (set by the press of any key in the
+# orcaModifierKeys list) to represent the Orca modifier.
+#
+MODIFIER_ORCA = 8
+
+# The different modifiers/modifier masks associated with key bindings
+#
+NO_MODIFIER_MASK              =  0
+ALT_MODIFIER_MASK             =  1 << pyatspi.MODIFIER_ALT
+CTRL_MODIFIER_MASK            =  1 << pyatspi.MODIFIER_CONTROL
+ORCA_MODIFIER_MASK            =  1 << MODIFIER_ORCA
+ORCA_ALT_MODIFIER_MASK        = (1 << MODIFIER_ORCA |
+                                 1 << pyatspi.MODIFIER_ALT)
+ORCA_CTRL_MODIFIER_MASK       = (1 << MODIFIER_ORCA |
+                                 1 << pyatspi.MODIFIER_CONTROL)
+ORCA_CTRL_ALT_MODIFIER_MASK   = (1 << MODIFIER_ORCA |
+                                 1 << pyatspi.MODIFIER_CONTROL |
+                                 1 << pyatspi.MODIFIER_ALT)
+ORCA_SHIFT_MODIFIER_MASK      = (1 << MODIFIER_ORCA |
+                                 1 << pyatspi.MODIFIER_SHIFT)
+SHIFT_MODIFIER_MASK           =  1 << pyatspi.MODIFIER_SHIFT
+SHIFT_ALT_MODIFIER_MASK       = (1 << pyatspi.MODIFIER_SHIFT |
+                                 1 << pyatspi.MODIFIER_ALT)
+COMMAND_MODIFIER_MASK         = (1 << pyatspi.MODIFIER_ALT |
+                                 1 << pyatspi.MODIFIER_CONTROL |
+                                 1 << pyatspi.MODIFIER_META2 |
+                                 1 << pyatspi.MODIFIER_META3)
+NON_LOCKING_MODIFIER_MASK     = (1 << pyatspi.MODIFIER_SHIFT |
+                                 1 << pyatspi.MODIFIER_ALT |
+                                 1 << pyatspi.MODIFIER_CONTROL |
+                                 1 << pyatspi.MODIFIER_META2 |
+                                 1 << pyatspi.MODIFIER_META3 |
+                                 1 << MODIFIER_ORCA)
+ALL_BUT_NUMLOCK_MODIFIER_MASK = (1 << MODIFIER_ORCA |
+                                 1 << pyatspi.MODIFIER_SHIFT |
+                                 1 << pyatspi.MODIFIER_SHIFTLOCK |
+                                 1 << pyatspi.MODIFIER_CONTROL |
+                                 1 << pyatspi.MODIFIER_ALT |
+                                 1 << pyatspi.MODIFIER_META2 |
+                                 1 << pyatspi.MODIFIER_META3)
+
+# The 2nd parameter used when creating a key binding refers to the
+# modifiers "we care about."  We typically care about all of the
+# modifiers which are not locking keys because we want to avoid
+# conflicts with other commands, such as Orca's command for moving
+# among headings (H) and the Help menu (Alt+H).
+#
+DEFAULT_MODIFIER_MASK = NON_LOCKING_MODIFIER_MASK
+
+_keysymsCache = {}
+_keycodeCache = {}
+
+def getAllKeysyms(keysym):
+    """Given a keysym, find all other keysyms associated with the key
+    that is mapped to the given keysym.  This allows us, for example,
+    to determine that the key bound to KP_Insert is also bound to KP_0.
+    """
+    if keysym not in _keysymsCache:
+        # The keysym itself is always part of the list.
+        #
+        _keysymsCache[keysym] = [keysym]
+
+        # Find the numerical value of the keysym
+        #
+        keyval = gtk.gdk.keyval_from_name(keysym)
+
+        if keyval != 0:
+            # Find the keycodes for the keysym.  Since a keysym
+            # can be associated with more than one key, we'll shoot
+            # for the keysym that's in group 0, regardless of shift
+            # level (each entry is of the form [keycode, group,
+            # level]).
+            #
+            keymap = gtk.gdk.keymap_get_default()
+            entries = keymap.get_entries_for_keyval(keyval)
+            keycode = 0
+            if entries:
+                for entry in entries:
+                    if entry[1] == 0:  # group = 0
+                        keycode = entry[0]
+                        break
+
+            # Find the keysyms bound to the keycode.  These are what
+            # we are looking for.
+            #
+            if keycode != 0:
+                entries = keymap.get_entries_for_keycode(keycode)
+                if entries:
+                    for entry in entries:
+                        keyval = entry[0]
+                        name = gtk.gdk.keyval_name(keyval)
+                        if name and (name != keysym):
+                            _keysymsCache[keysym].append(name)
+
+    return _keysymsCache[keysym]
+
+def getKeycode(keysym):
+    """Converts an XKeysym string (e.g., 'KP_Enter') to a keycode that
+    should match the event.hw_code for key events.
+
+    This whole situation is caused by the fact that Solaris chooses
+    to give us different keycodes for the same key, and the keypad
+    is the primary place where this happens: if NumLock is not on,
+    there is no telling the difference between keypad keys and the
+    other navigation keys (e.g., arrows, page up/down, etc.).  One,
+    for example, would expect to get KP_End for the '1' key on the
+    keypad if NumLock were not on.  Instead, we get 'End' and the
+    keycode for it matches the keycode for the other 'End' key.  Odd.
+    If NumLock is on, we at least get KP_* keys.
+
+    So...when setting up keybindings, we say we're interested in
+    KeySyms, but those keysyms are carefully chosen so as to result
+    in a keycode that matches the actual key on the keyboard.  This
+    is why we use KP_1 instead of KP_End and so on in our keybindings.
+
+    Arguments:
+    - keysym: a string that is a valid representation of an XKeysym.
+
+    Returns an integer representing a key code that should match the
+    event.hw_code for key events.
+    """
+    if not keysym:
+        return 0
+
+    if keysym not in _keycodeCache:
+        keymap = gtk.gdk.keymap_get_default()
+
+        # Find the numerical value of the keysym
+        #
+        keyval = gtk.gdk.keyval_from_name(keysym)
+        if keyval == 0:
+            return 0
+
+        # Now find the keycodes for the keysym.   Since a keysym can
+        # be associated with more than one key, we'll shoot for the
+        # keysym that's in group 0, regardless of shift level (each
+        # entry is of the form [keycode, group, level]).
+        #
+        _keycodeCache[keysym] = 0
+        entries = keymap.get_entries_for_keyval(keyval)
+        if entries:
+            for entry in entries:
+                if entry[1] == 0:  # group = 0
+                    _keycodeCache[keysym] = entry[0]
+                    break
+                if _keycodeCache[keysym] == 0:
+                    _keycodeCache[keysym] = entries[0][0]
+
+    return _keycodeCache[keysym]
+
+def getModifierNames(mods):
+    """Gets the modifier names of a numeric modifier mask as a human
+    consumable string.
+    """
+    text = ""
+    if mods & ORCA_MODIFIER_MASK:
+        text += _("Orca") + "+"
+    #if mods & (1 << pyatspi.MODIFIER_NUMLOCK):
+    #    text += _("Num_Lock") + "+"
+    if mods & 128:
+        # Translators: this is presented in a GUI to represent the
+        # "right alt" modifier.
+        #
+        text += _("Alt_R") + "+"
+    if mods & (1 << pyatspi.MODIFIER_META3):
+        # Translators: this is presented in a GUI to represent the
+        # "super" modifier.
+        #
+        text += _("Super") + "+"
+    if mods & (1 << pyatspi.MODIFIER_META2):
+        # Translators: this is presented in a GUI to represent the
+        # "meta 2" modifier.
+        #
+        text += _("Meta2") + "+"
+    #if mods & (1 << pyatspi.MODIFIER_META):
+    #    text += _("Meta") + "+"
+    if mods & ALT_MODIFIER_MASK:
+        # Translators: this is presented in a GUI to represent the
+        # "left alt" modifier.
+        #
+        text += _("Alt_L") + "+"
+    if mods & CTRL_MODIFIER_MASK:
+        # Translators: this is presented in a GUI to represent the
+        # "control" modifier.
+        #
+        text += _("Ctrl") + "+"
+    if mods & (1 << pyatspi.MODIFIER_SHIFTLOCK):
+        # Translators: this is presented in a GUI to represent the
+        # "caps lock" modifier.
+        #
+        text += _("Caps_Lock") + "+"
+    if mods & SHIFT_MODIFIER_MASK:
+        # Translators: this is presented in a GUI to represent the
+        # "shift " modifier.
+        #
+        text += _("Shift") + "+"
+    return text
+
+class KeyBinding:
+    """A single key binding, consisting of a keycode, a modifier mask,
+    and the InputEventHandler.
+    """
+
+    # We really do want this many arguments.
+    #
+    # pylint: disable-msg=R0913
+
+    def __init__(self, keysymString, modifierMask, modifiers, handler,
+                 clickCount = 1):
+        """Creates a new key binding.
+
+        Arguments:
+        - keysymString: the keysymString - this is typically a string
+          from /usr/include/X11/keysymdef.h with the preceding 'XK_'
+          removed (e.g., XK_KP_Enter becomes the string 'KP_Enter').
+        - modifierMask: bit mask where a set bit tells us what modifiers
+          we care about (see pyatspi.MODIFIER_*)
+        - modifiers: the state the modifiers we care about must be in for
+          this key binding to match an input event (see also
+          pyatspi.MODIFIER_*)
+        - handler: the InputEventHandler for this key binding
+        - clickCount: how many times the key should be pressed in a row
+        """
+        self.keysymString = keysymString
+        self.modifierMask = modifierMask
+        self.modifiers = modifiers
+        self.handler = handler
+        self.clickCount = clickCount
+        self.keycode = None
+
+    def __str__(self):
+        return "[%x %x %s %d %s]" % \
+            (self.modifierMask,
+             self.modifiers,
+             self.keysymString,
+             self.clickCount,
+             self.handler.description)
+
+    def matches(self, keycode, modifiers):
+        """Returns true if this key binding matches the given keycode and
+        modifier state.
+        """
+        # We lazily bind the keycode.  The primary reason for doing this
+        # is so that atspi does not have to be initialized before setting
+        # keybindings in the user's preferences file.
+        #
+        if not self.keycode:
+            self.keycode = getKeycode(self.keysymString)
+
+        if self.keycode == keycode:
+            result = modifiers & self.modifierMask
+            return result == self.modifiers
+        else:
+            return False
+
+class KeyBindings(list):
+    """Structure that maintains a set of KeyBinding instances.
+    """
+    def __init__(self):
+        list.__init__(self)
+
+    def __str__(self):
+        result = "[\n"
+        for keyBinding in self:
+            result += "  %s\n" % keyBinding
+        result += "]"
+        return result
+    
+    def removeByHandler(self, handler):
+        """Removes the given KeyBinding instance from this set of keybindings.
+        """
+        i = len(self)
+        while i > 0:
+            if self[i - 1].handler == handler:
+                del self[i - 1]
+            i = i - 1
+
+    def hasKeyBinding (self, newKeyBinding, typeOfSearch="strict"):
+        """Return True if keyBinding is already in self.keyBindings.
+
+           The typeOfSearch can be:
+              "strict":      matches description, modifiers, key, and
+                             click count
+              "description": matches only description.
+              "keys":        matches the modifiers, key, and modifier mask,
+                             and click count
+              "keysNoMask":  matches the modifiers, key, and click count
+        """
+        hasIt = False
+
+        for keyBinding in self:
+            if typeOfSearch == "strict":
+                if (keyBinding.handler.description \
+                    == newKeyBinding.handler.description) \
+                    and (keyBinding.keysymString \
+                         == newKeyBinding.keysymString) \
+                    and (keyBinding.modifierMask \
+                         == newKeyBinding.modifierMask) \
+                    and (keyBinding.modifiers \
+                         == newKeyBinding.modifiers) \
+                    and (keyBinding.clickCount \
+                         == newKeyBinding.clickCount):
+                    hasIt = True
+            elif typeOfSearch == "description":
+                if keyBinding.handler.description \
+                    == newKeyBinding.handler.description:
+                    hasIt = True
+            elif typeOfSearch == "keys":
+                if (keyBinding.keysymString \
+                    == newKeyBinding.keysymString) \
+                    and (keyBinding.modifierMask \
+                         == newKeyBinding.modifierMask) \
+                    and (keyBinding.modifiers \
+                         == newKeyBinding.modifiers) \
+                    and (keyBinding.clickCount \
+                         == newKeyBinding.clickCount):
+                    hasIt = True
+            elif typeOfSearch == "keysNoMask":
+                if (keyBinding.keysymString \
+                    == newKeyBinding.keysymString) \
+                    and (keyBinding.modifiers \
+                         == newKeyBinding.modifiers) \
+                    and (keyBinding.clickCount \
+                         == newKeyBinding.clickCount):
+                    hasIt = True
+
+        return hasIt
+
+    def getInputHandler(self, keyboardEvent, clickCount):
+        """Returns the input handler of the key binding that matches the
+        given keyboardEvent and clickCount, or None if no match exists.
+        """
+        candidates = []
+        for keyBinding in self:
+            if keyBinding.matches(keyboardEvent.hw_code, \
+                                  keyboardEvent.modifiers):
+                if keyBinding.modifierMask == keyboardEvent.modifiers and \
+                   keyBinding.clickCount == clickCount:
+                    return keyBinding.handler
+                candidates.append(keyBinding)
+
+        # If we're still here, we don't have an exact match. Prefer
+        # the one whose click count is closest to, but does not exceed,
+        # the actual click count.
+        #
+        candidates.sort(cmp=lambda x, y: x.clickCount - y.clickCount,
+                        reverse=True)
+        for candidate in candidates:
+            if candidate.clickCount <= clickCount:
+                return candidate.handler
+
+        return None
+
+    def consumeKeyboardEvent(self, script, keyboardEvent):
+        """Attempts to consume the given keyboard event.  If these
+        keybindings have a handler for the given keyboardEvent, it is
+        assumed the event will always be consumed.
+        """
+        consumed = False
+        handler = self.getInputHandler(keyboardEvent, script.getClickCount())
+        if handler:
+            consumed = True
+            if keyboardEvent.type == pyatspi.KEY_PRESSED_EVENT:
+                try:
+                    handler.processInputEvent(script, keyboardEvent)
+                except:
+                    log.exception("while processing input event")
+
+        return consumed
+
+if __name__ == "__main__":
+    logging.basicConfig(format="%(name)s %(message)s")
+    log.setLevel(logging.DEBUG)
+
+    print getAllKeysyms("Insert")
+    print getKeycode("Insert")
+    print getModifierNames(0x1ff)
+
+    import input_event
+    bindings = KeyBindings()
+    handler1 = input_event.InputEventHandler(None, "Does something")
+    binding1 = KeyBinding("Insert", 0x1ff, 0, handler1, 2)
+    bindings.append(binding1)
+    handler2 = input_event.InputEventHandler(None, "Does something else")
+    binding2 = KeyBinding("Return", 0x1ff, 0, handler2, 2)
+    bindings.append(binding2)
+    print "All bindings:"
+    print bindings
+
+    print "Bindings has %s: %s" \
+          % (binding2, bindings.hasKeyBinding(binding2))
+
+    bindings.remove(binding2)
+    print "All bindings after remove:"
+    print bindings
+    print "Bindings has %s: %s" \
+          % (binding2, bindings.hasKeyBinding(binding2))
+
+    bindings.removeByHandler(handler1)
+    print "All bindings after removeByHandler:"
+    print bindings

Added: branches/phase2/src/orca/orca.in
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/orca.in	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,179 @@
+#!/bin/bash
+#
+# Orca
+#
+# Copyright 2006-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+# This script performs some clean up and will run Orca.  It will also
+# rerun Orca if it detects that Orca died an unnatural death.
+
+# __id__        = "$Id: orca.in,v 1.22 2006/12/08 16:21:25 wwalker Exp $"
+# __version__   = "$Revision: 1.22 $"
+# __date__      = "$Date: 2006/12/08 16:21:25 $"
+# __copyright__ = "Copyright (c) 2006-2008 Sun Microsystems Inc."
+# __license__   = "LGPL"
+
+# Set the user's $PATH for this script.
+#
+export PATH="${PATH}:/usr/ccs/bin:/usr/bin:/usr/sbin:/bin:/usr/sfw/bin:/usr/openwin/bin:/usr/X11R6/bin"
+
+# Save the arguments away.
+#
+ARGS="$*"
+
+# Cleans up any orca-related processes that might be running,
+# restricting it to those processes owned by the user. These include
+# orca itself, any gnome-speech synthesis drivers, and festival
+# processes running in server mode.
+#
+cleanup()
+{
+    USERID=`id | cut -f2 -d= | cut -f1 -d\(`
+    PIDS=`ps -eo pid,ruid,args | grep $USERID | egrep "orca[.]orca|synthesis-driver|festival [-][-]server" | grep -v grep | awk '{ print $1 }'`
+
+    IFS='
+    '
+    PIDS=`echo $PIDS`
+
+    if [ "x$PIDS" != "x" ]
+    then
+        kill -9 $PIDS > /dev/null 2>&1
+    fi
+}
+
+# Runs orca.
+#
+runOrca()
+{
+    if [ -z "$1" ]
+    then
+        cleanup
+    fi
+    exec_prefix= prefix@
+    PYTHONPATH=${PYTHONPATH}:@pyexecdir@
+    export PYTHONPATH
+
+    # We'll save and restore the Caps_Lock as a modifier just in case
+    # the user is using the Caps_Lock as the Orca modifier key.  We
+    # will also do so with the KP_Insert key since we want to make
+    # sure it only produces the keysyms we expect (it produces
+    # KP_Insert and KP_0 by default).  See the use of xmodmap in
+    # orca.py:loadUserSettings for the other part of what's going on.
+    # 
+    # [[[WDW: we probably should save/restore the autorepeat value of
+    # the Orca modifier key and turn the autorepeat off when Orca is
+    # running.  That can be done using the 'xset' utility, though
+    # turning it on/off is easy, but getting the current state is not
+    # straightforward.]]]
+    #
+    if [ "x$DISPLAY" != "x" ]
+    then
+        CAPSLOCKSETTING=`xmodmap | grep Caps_Lock | cut -f1`
+        KPINSERTSETTING=`xmodmap -pke | grep KP_Insert`
+        INSERTSETTING=`xmodmap -pke | grep Insert | grep -v KP_`
+    fi
+    @PYTHON@ -c "import orca.orca; orca.orca.main()" "$ARGS"
+    if [ "x$CAPSLOCKSETTING" != "x" ]
+    then
+        xmodmap -e "add $CAPSLOCKSETTING = Caps_Lock" > /dev/null 2>&1
+    fi
+    if [ "x$KPINSERTSETTING" != "x" ]
+    then
+        xmodmap -e "$KPINSERTSETTING" > /dev/null 2>&1
+    fi
+    if [ "x$INSERTSETTING" != "x" ]
+    then
+        xmodmap -e "$INSERTSETTING" > /dev/null 2>&1
+    fi
+}
+
+kill_orca()
+{
+    cleanup
+    exit
+}
+
+hup_orca()
+{
+    cleanup
+}
+
+main()
+{
+    RUN=1
+    while [ "$RUN" -gt 0 ]
+    do
+        runOrca &
+        orca_pid=$!
+        wait $orca_pid
+
+        RUN=$?  # quit on a normal exit status from Orca
+
+        # We will stop re-running Orca on SEGV's (139 = SEGV + 128).
+        # The reason for this is that there are cases where Python
+        # will SEGV when Orca attempts to exit normally.  This happens
+        # because of something going on in pyorbit.  This should be
+        # fixed in pyorbit 2.14.1, but not everyone has that.
+        # So...we'll check for it.
+        #
+        if [ "$RUN" -eq 139 ]
+        then
+            RUN=0
+        fi
+
+        # We will also stop re-running Orca on KILL's (137 = KILL + 128).
+        # The reason for this is that if someone has done a "kill -KILL"
+        # on the Python process, it was probably on purpose and they want
+        # everything to die.
+        #
+        if [ "$RUN" -eq 137 ]
+        then
+            RUN=0
+        fi
+    done
+}
+
+trap kill_orca QUIT TERM INT ABRT
+trap hup_orca HUP
+
+if [ `grep -c "\-q" <<< $ARGS` -gt 0 ]
+then
+    cleanup
+else
+    # If the user passed in a flag that results in orca only
+    # outputting data to the console, don't kill any other orca
+    # process.  We do this by looking for flags that *should*
+    # result in a cleanup (i.e., every legal command except
+    # -?, --help, -v, and --version).  This way, if the user
+    # erroneously types an illegal command line argument, the
+    # help text is emitted and the other orca is not killed.
+    #
+    if [ `egrep -c "\-s|\-g|\-n|\-u|\-e|\-d" <<< $ARGS` -eq 0 ]
+    then
+        if [ `egrep -c "\-t" <<< $ARGS` -eq 0 ]
+        then
+            runOrca "NO_CLEANUP"
+        else
+            runOrca
+        fi
+    else
+        runOrca &
+        orca_pid=$!
+        wait $orca_pid
+    fi
+fi

Added: branches/phase2/src/orca/orca.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/orca.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,301 @@
+# Orca
+#
+# Copyright 2004-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""The main module for the Orca screen reader."""
+
+__id__        = "$Id: orca.py 4148 2008-09-03 14:31:54Z wwalker $"
+__version__   = "$Revision: 4148 $"
+__date__      = "$Date: 2008-09-03 10:31:54 -0400 (Wed, 03 Sep 2008) $"
+__copyright__ = "Copyright (c) 2004-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import logging
+log = logging.getLogger('orca.orca')
+
+try:
+    import logging.config
+    logging.config.fileConfig('logging.conf')
+except:
+    logging.basicConfig(format="%(name)s %(message)s")
+
+import getopt
+import os
+import signal
+
+# We're going to force the name of the app to "orca" so pygtk
+# will end up showing us as "orca" to the AT-SPI.  If we don't
+# do this, the name can end up being "-c".  See bug 364452 at
+# http://bugzilla.gnome.org/show_bug.cgi?id=364452 for more
+# information.
+#
+import sys
+sys.argv[0] = "orca"
+
+# Tell Orca to find/use the right version of pygtk.
+#
+import pygtk
+pygtk.require('2.0')
+
+try:
+    # This can fail due to gtk not being available.  We want to
+    # be able to recover from that if possible.  The main driver
+    # for this is to allow "orca --text-setup" to work even if
+    # the desktop is not running.
+    #
+    import gtk
+except:
+    pass
+
+import platform
+import pyatspi
+import script_manager
+import settings
+import utils
+
+from orca_i18n import _ # for gettext support
+
+# Command line options that override any other settings.
+#
+_commandLineSettings = settings.Settings(settings.globalSettings)
+
+def abort(exitCode=1):
+    """Aborts orca because something went horribly wrong.
+    
+    Arguments:
+    - exitCode: the exit code to send to the calling process.
+    """
+
+    # We know what we are doing here, so tell pylint not to flag
+    # the _exit method call as a warning.  The disable-msg is
+    # localized to just this method.
+    #
+    # pylint: disable-msg=W0212
+    #
+    log.debug("aborting with exit code %d" % exitCode)
+    os._exit(exitCode)
+
+def timeout(signum=None, frame=None):
+    """Aborts when we get a timeout, indicating an operation has
+    taken way too long.
+    """
+
+    log.debug("timeout with signum %d" % signum)
+    abort(50)
+
+exitCount = 0
+def shutdownOnSignal(signum, frame):
+    """Shuts down (gracefully if possible) when we get a given signal.
+    """
+    # We don't like globals, but we'll use it for this case.
+    #
+    # pylint: disable-msg=W0603
+    #
+    global exitCount
+
+    log.debug("Shutting down and exiting due to signal = %d" % signum)
+
+    # Well...we'll try to exit nicely, but if we keep getting called,
+    # something bad is happening, so just quit.
+    #
+    if exitCount:
+        abort(signum)
+    else:
+        exitCount += 1
+
+    try:
+        shutdown()
+        cleanExit = True
+    except:
+        cleanExit = False
+
+    if not cleanExit:
+        abort(signum)
+
+def abortOnSignal(signum, frame):
+    """Aborts quickly when we get a given signal.
+    """
+    log.debug("aborting due to signal = %d" % signum)
+    abort(signum)
+
+def usage():
+    """Prints out usage information.
+    """
+    print _("Usage: orca [OPTION...]")
+
+def start():
+    """Starts Orca.
+    """
+    script_manager.ScriptManager() # The thing that does all the work
+    log.debug("pyatspi.Registry.start()")
+    pyatspi.Registry.start()
+
+def shutdown():
+    """Exits Orca.  Unregisters any event listeners and cleans up.  Also
+    quits the bonobo main loop and resets the initialized state to False.
+
+    Returns True if the shutdown procedure ran or False if this module
+    was never initialized.
+    """
+    log.debug("pyatspi.Registry.stop()")
+    pyatspi.Registry.stop()
+
+# There are a lot of decision branches and statements happening below,
+# but it's OK for this method.  We'll disable the pylint messages.
+#
+# pylint: disable-msg=R0912
+# pylint: disable-msg=R0915
+
+def processArgv(desktopRunning):
+    """Process the argument list passed in on the command line.
+    """
+
+    # We hack a little here because the shell script to start orca can
+    # conflate all of command line arguments into one string, which is
+    # not what we want.  We detect this by seeing if the length of the
+    # argument list is 1.
+    #
+    arglist = sys.argv[1:]
+    if len(arglist) == 1:
+        arglist = arglist[0].split()
+
+    try:
+        # ? is for help
+        # e is for enabling a feature
+        # d is for disabling a feature
+        # h is for help
+        # u is for alternate user preferences location
+        # s is for setup
+        # n is for no setup
+        # t is for text setup
+        # v is for version
+        #
+        opts, args = getopt.getopt(
+            arglist,
+            "?stnvld:e:u:",
+            ["help",
+             "user-prefs-dir=",
+             "enable=",
+             "disable=",
+             "setup",
+             "gui-setup",
+             "text-setup",
+             "no-setup",
+             "list-apps",
+             "version"])
+        for opt, val in opts:
+            if opt in ("-u", "--user-prefs-dir"):
+                userPrefsDir = val.strip()
+                try:
+                    os.chdir(userPrefsDir)
+                    _commandLineSettings["userPrefsDir"] = userPrefsDir
+                except:
+                    log.exception("exception processing user-prefs-dir:")
+
+            if opt in ("-e", "--enable"):
+                feature = val.strip()
+
+                if feature == "speech":
+                    _commandLineSettings["enableSpeech"] = True
+                elif feature == "braille":
+                    _commandLineSettings["enableBraille"] = True
+                elif feature == "braille-monitor":
+                    _commandLineSettings["enableBrailleMonitor"] = True
+                elif feature == "magnifier":
+                    _commandLineSettings["enableMagnifier"] = True
+                elif feature == "main-window":
+                    _commandLineSettings["showMainWindow"] = True
+                else:
+                    usage()
+                    abort(2)
+
+            if opt in ("-d", "--disable"):
+                feature = val.strip()
+                if feature == "speech":
+                    _commandLineSettings["enableSpeech"] = False
+                elif feature == "braille":
+                    _commandLineSettings["enableBraille"] = False
+                elif feature == "braille-monitor":
+                    _commandLineSettings["enableBrailleMonitor"] = False
+                elif feature == "magnifier":
+                    _commandLineSettings["enableMagnifier"] = False
+                elif feature == "main-window":
+                    _commandLineSettings["showMainWindow"] = False
+                else:
+                    usage()
+                    abort(2)
+
+            if opt in ("-s", "--gui-setup", "--setup"):
+                _commandLineSettings["setupRequested"] = True
+                _commandLineSettings["showGUI"] = desktopRunning
+            if opt in ("-t", "--text-setup"):
+                _commandLineSettings["setupRequested"] = True
+                _commandLineSettings["showGUI"] = False
+            if opt in ("-n", "--no-setup"):
+                _commandLineSettings["bypassSetup"] = True
+            if opt in ("-?", "--help"):
+                usage()
+                abort(0)
+            if opt in ("-v", "--version"):
+                print "Orca %s" % platform.version
+                abort(0)
+            if opt in ("-l", "--list-apps"):
+                apps = utils.getKnownApplications()
+                for app in apps:
+                    print app.name
+                abort(0)
+    except:
+        log.exception("exception processing command line arguments:")
+        usage()
+        abort(2)
+
+def main():
+    """The main entry point for Orca.  The exit codes for Orca will
+    loosely be based on signals, where the exit code will be the
+    signal used to terminate Orca (if a signal was used).  Otherwise,
+    an exit code of 0 means normal completion and an exit code of 50
+    means Orca exited because of a hang.
+    """
+    # Various signal handlers we want to listen for.
+    #
+    signal.signal(signal.SIGHUP, shutdownOnSignal)
+    signal.signal(signal.SIGINT, shutdownOnSignal)
+    signal.signal(signal.SIGTERM, shutdownOnSignal)
+    signal.signal(signal.SIGQUIT, shutdownOnSignal)
+    signal.signal(signal.SIGSEGV, abortOnSignal)
+
+    # See if the desktop is running.  If it is, the import of gtk will
+    # succeed.  If it isn't, the import will fail.
+    #
+    desktopRunning = False
+    try:
+        if gtk.gdk.display_get_default():
+            desktopRunning = True
+    except:
+        pass
+
+    # Parse the command line options.
+    #
+    processArgv(desktopRunning)
+
+    start() # waits until we stop the registry
+
+    return 0
+
+if __name__ == "__main__":
+    sys.exit(main())

Added: branches/phase2/src/orca/orca_i18n.py.in
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/orca_i18n.py.in	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,77 @@
+# Orca
+#
+# Copyright 2004-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Provides i18n support for orca using the gettext module.
+"""
+
+import logging
+log = logging.getLogger('orca.orca_i18n')
+
+import os       # to get localdir path
+import gettext  # to get gettext (i18n) support
+
+# Alias gettext.gettext to _ and gettext.ngettext to ngettext
+#
+_ = gettext.gettext
+ngettext = gettext.ngettext
+
+# Tell gettext where to find localized strings.
+#
+localedir = os.path.join ("@prefix@", "@DATADIRNAME@", "locale")
+gettext.bindtextdomain ("@GETTEXT_PACKAGE@", localedir)
+gettext.textdomain("orca")
+
+try:
+    import gtk.glade
+    gtk.glade.bindtextdomain ("@GETTEXT_PACKAGE@", localedir)
+    gtk.glade.textdomain("orca")
+except:
+    log.exception("exception while setting up glade locale:")
+
+########################################################################
+#                                                                      #
+# Utility methods to facilitate easier translation                     #
+#                                                                      #
+########################################################################
+
+def Q_(s):
+    """Provide qualified translatable strings.  Some strings translate to
+    more than one string in another locale.  We provide a convention to
+    provide contextual information for the string so that translators can
+    do the right thing: we embed a '|' character in the string to be
+    translated.  The string before the '|' provides the context, and the
+    string after the '|' provides the string to translate.  For example:
+    'radiobutton|selected' and 'text|selected' are used to provide context
+    for the word 'selected'.
+
+    We need to handle the case where the string has not been translated,
+    however, and we do so by stripping off the contextual information."""
+
+    s = _(s)
+    s = s[s.find('|')+1:]
+    return s
+
+if __name__ == "__main__":
+    logging.basicConfig(format="%(name)s %(message)s")
+    log.setLevel(logging.DEBUG)
+
+    print _("orca")
+    print "1 is %s" % ngettext("singular", "plural", 1)
+    print "2 is %s" % ngettext("singular", "plural", 2)
+    print Q_("foo|orca")

Added: branches/phase2/src/orca/platform.py.in
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/platform.py.in	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,49 @@
+# Orca
+#
+# Copyright 2006-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Holds platform-specific settings.
+"""
+
+__id__        = "$Id: platform.py.in,v 1.2 2006/06/10 00:54:47 wwalker Exp $"
+__version__   = "$Revision: 1.2 $"
+__date__      = "$Date: 2006/06/10 00:54:47 $"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+# $ORCA_MAJOR_VERSION.$ORCA_MINOR_VERSION.$ORCA_MICRO_VERSION
+#
+version     = "@ORCA_VERSION@"
+
+# "--prefix" parameter used when configuring the build.
+#
+prefix      = "@prefix@"
+
+# The package name (should be "orca").
+#
+package     = "@PACKAGE@"
+
+# The name of the data directory (usually "share").
+#
+datadirname = "@DATADIRNAME@"
+
+if __name__ == "__main__":
+    print "version:     %s" % version
+    print "prefix:      %s" % prefix
+    print "package:     %s" % package
+    print "datadirname: %s" %datadirname

Added: branches/phase2/src/orca/script.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/script.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,155 @@
+# Orca
+#
+# Copyright 2004-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Each script maintains a set of key bindings, braille bindings, and
+AT-SPI event listeners.  The key bindings are an instance of
+KeyBindings.  The braille bindings are also a dictionary where the
+keys are BrlTTY command integers and the values are instances of
+InputEventHandler.  The listeners field is a dictionary where the keys
+are AT-SPI event names and the values are function pointers.
+
+Instances of scripts are intended to be created solely by the
+script_manager.
+
+This Script class is not intended to be instantiated directly.
+Instead, it is expected that subclasses of the Script class will be
+created in their own module.  See default.py for an example."""
+
+__id__        = "$Id: script.py 4103 2008-08-15 11:07:31Z wwalker $"
+__version__   = "$Revision: 4103 $"
+__date__      = "$Date: 2008-08-15 07:07:31 -0400 (Fri, 15 Aug 2008) $"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import logging
+log = logging.getLogger('orca.script')
+
+import key_bindings
+
+# We want several methods here to be abstract methods so subclasses
+# can refer to self.
+#
+# pylint: disable-msg=R0201
+
+class Script:
+    """The specific focus tracking scripts for applications.
+    """
+    def __init__(self, app):
+        """Creates a script for the given application, if necessary.
+        This method should not be called by anyone except the
+        focus_tracking_presenter.
+
+        Arguments:
+        - app: the Python Accessible application to create a script for
+        """
+        self.app = app
+
+        if app:
+            self.name = self.app.name
+        else:
+            self.name = "default"
+
+        self.name += " (module=" + self.__module__ + ")"
+        
+        self.listeners = self._getListeners()
+
+        # By default, handle events for non-active applications.
+        #
+        self.presentIfInactive = True
+        self.locusOfFocus = {}
+
+        log.debug("NEW SCRIPT: %s" % self)
+
+    def __str__(self):
+        """Returns a human readable representation of the script.
+        """
+        return self.name
+
+    def _getListeners(self):
+        """Sets up the AT-SPI event listeners for this script.
+
+        Returns a dictionary where the keys are AT-SPI event names
+        and the values are script methods.
+        """
+        return {}
+
+    def _getKeyBindings(self):
+        """Defines the key bindings for this script.
+
+        Returns an instance of keybindings.KeyBindings.
+        """
+        return key_bindings.KeyBindings()
+
+    def _getBrailleBindings(self):
+        """Defines the braille bindings for this script.
+
+        Returns a dictionary where the keys are BrlTTY commands and the
+        values are InputEventHandler instances.
+        """
+        return {}
+
+    def _getPronunciations(self):
+        """Defines the application specific pronunciations for this script.
+
+        Returns a dictionary where the keys are the actual text strings and
+        the values are the replacement strings that are spoken instead.
+        """
+
+        return {}
+
+    def processObjectEvent(self, event):
+        """Processes all AT-SPI object events of interest to this
+        script.  The interest in events is specified via the
+        'listeners' field that was defined during the construction of
+        this script.
+
+        In general, the primary purpose of handling object events is to
+        keep track of changes to the locus of focus.
+
+        Note that this script may be passed events it doesn't care
+        about, so it needs to react accordingly.
+
+        Arguments:
+        - event: the AT-SPI event
+        """
+        # Check to see if we really want to process this event.
+        #
+        if not self.presentIfInactive:
+            return
+
+        # This calls the first listener it finds whose key *begins with* or is
+        # the same as the event.type.  The reason we do this is that the event
+        # type in the listeners dictionary may not be as specific as the event
+        # type we received (e.g., the listeners dictionary might contain the
+        # key "object:state-changed:" and the event.type might be
+        # "object:state-changed:focused".  The order of the
+        # keys is *not* deterministic, and is not guaranteed to be related
+        # to the order in which they were added.
+        #
+        for key in self.listeners.keys():
+            if event.type.startswith(key):
+                self.listeners[key](event)
+
+    def activate(self):
+        """Called when this script is activated."""
+        pass
+
+    def deactivate(self):
+        """Called when this script is deactivated."""
+        pass

Added: branches/phase2/src/orca/script_manager.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/script_manager.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,547 @@
+# Orca
+#
+# Copyright 2004-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Provides the script manager for Orca."""
+
+__id__  = "$Id: focus_tracking_presenter.py 4088 2008-08-06 20:42:48Z wwalker $"
+__version__   = "$Revision: 4088 $"
+__date__      = "$Date: 2008-08-06 16:42:48 -0400 (Wed, 06 Aug 2008) $"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+# A list of toolkits whose events we need to process synchronously.
+# The only one right now is the Java toolkit (see bug #531869), but
+# we put this here to allow more toolkits to be more easily added
+# and for Java to be removed if issues with asynchronous processing
+# of its events are ever resolved.
+#
+synchronousToolkits = ["J2SE-access-bridge"]
+
+# Which packages to search, and the order in which to search,
+# for custom scripts.  These packages are expected to be on
+# the PYTHONPATH and/or subpackages of the "orca" package.
+# REMEMBER: to make something a package, the directory has to
+# have a __init__.py file in it.
+#
+scriptPackages = ["orca-scripts", "scripts", "scripts.apps", "scripts.toolkits"]
+enableCustomScripts = True
+
+# A list that helps us map application names to script module
+# names.  Each element in the list is a list itself -- the first
+# element is a regular expression to match the name of the
+# application to and the second element is the name of the script
+# module to use.
+#
+scriptMappings = []
+
+# If True, process events synchronously.
+#
+synchronousMode = False
+
+# This is a list of events that Orca should immidiately drop and never look at.
+#
+ignoredEventsList = ['object:bounds-changed']
+
+import logging
+log = logging.getLogger('orca.script_manager')
+
+import Queue
+
+import braille
+import default
+import input_event
+import pyatspi
+import utils
+
+class ScriptManager():
+    """Maintain a set of scripts for all running applications, and
+    also keeps the notion of an activeScript.  All object events are
+    passed to the associated script for that application, regardless if
+    the application has keyboard focus or not.  All keyboard events are
+    passed to the active script only if it has indicated interest in the
+    event."""
+
+    def __init__(self):
+        self._knownScripts   = {}
+        self._activeScript   = None
+        self._defaultScript  = None
+        self._eventQueue     = Queue.Queue(0)
+        self._listenerCounts = {}
+
+        self._registerEventListener("window:activate")
+        self._registerEventListener("window:deactivate")
+        self._registerEventListener("object:children-changed:remove")
+
+        # Cover all masks in 8 bits.
+        #
+        masks = []
+        mask = 0
+        while mask <= 255:
+            masks.append(mask)
+            mask += 1
+        pyatspi.Registry.registerKeystrokeListener(
+            self._processKeyboardEvent,
+            mask=masks,
+            kind=(pyatspi.KEY_PRESSED_EVENT, pyatspi.KEY_RELEASED_EVENT))
+
+        braille.init(self._processBrailleEvent)
+
+        window = utils.findActiveWindow()
+        if window:
+            # Generate a fake window activation event so the application
+            # can tell the user about itself.
+            #
+            class _FakeEvent:
+                """Silly fake input event."""
+
+                # We really do want this many arguments.
+                #
+                # pylint: disable-msg=R0913
+
+                def __init__(self, source, eventType,
+                             detail1, detail2, any_data):
+                    """Creates a fake input input."""
+                    self.source = source
+                    self.type = eventType
+                    self.detail1 = detail1
+                    self.detail2 = detail2
+                    self.any_data = any_data
+
+            class _FakeData:
+                """Silly fake data."""
+                def __init__(self, anyValue):
+                    """Creates fake any_data."""
+                    self.anyValue = anyValue
+                def value(self):
+                    """Get the value."""
+                    return self.anyValue
+
+            fe = _FakeEvent(window, "window:activate", 0, 0, _FakeData(None))
+            e = pyatspi.event.Event(fe)
+            self._enqueueEvent(e)
+
+    ########################################################################
+    #                                                                      #
+    # METHODS FOR KEEPING TRACK OF LISTENERS REGISTERED WITH ATSPI         #
+    #                                                                      #
+    ########################################################################
+
+    def _registerEventListener(self, eventType):
+        """Tells this module to listen for the given event type.
+
+        Arguments:
+        - eventType: the event type.
+        """
+        if eventType in self._listenerCounts:
+            self._listenerCounts[eventType] += 1
+        else:
+            pyatspi.Registry.registerEventListener(self._enqueueEvent,
+                                                   eventType)
+            self._listenerCounts[eventType] = 1
+
+    def _deregisterEventListener(self, eventType):
+        """Tells this module to stop listening for the given event type.
+
+        Arguments:
+        - eventType: the event type.
+        """
+        self._listenerCounts[eventType] -= 1
+        if self._listenerCounts[eventType] == 0:
+            pyatspi.Registry.deregisterEventListener(self._enqueueEvent,
+                                                     eventType)
+            del self._listenerCounts[eventType]
+
+    def _registerAllEvents(self):
+        """Register all top-level event types except for "mouse".
+        """
+        topLevelEvents = filter(lambda et: ':' not in et and 'mouse' not in et,
+                                pyatspi.EVENT_TREE)
+        for event_type in topLevelEvents:
+            pyatspi.Registry.registerEventListener(
+                self._enqueueEvent, event_type)
+
+    def _deregisterAllEvents(self):
+        """Unregister for all the event types except for "mouse".
+        """
+        topLevelEvents = filter(lambda et: ':' not in et and 'mouse' not in et,
+                                pyatspi.EVENT_TREE)
+        for event_type in topLevelEvents:
+            pyatspi.Registry.deregisterEventListener(
+                self._enqueueEvent, event_type)
+
+    def _registerEventListeners(self, script):
+        """Tells the ScriptManager to listen for all
+        the event types of interest to the script.
+
+        Arguments:
+        - script: the script.
+        """
+        for eventType in script.listeners.keys():
+            self._registerEventListener(eventType)
+
+    def _deregisterEventListeners(self, script):
+        """Tells the FocusTrackingPresenter to stop listening for all the
+        event types of interest to the script.
+
+        Arguments:
+        - script: the script.
+        """
+        for eventType in script.listeners.keys():
+            self._deregisterEventListener(eventType)
+
+    ########################################################################
+    #                                                                      #
+    # METHODS FOR KEEPING TRACK OF KNOWN SCRIPTS.                          #
+    #                                                                      #
+    ########################################################################
+
+    def _getScriptModuleName(app):
+        """Returns the module name of the script to use for a given
+        application.  Any script mapping set via the setScriptMapping
+        method is searched first, with the ultimate fallback being the
+        name of the application itself.
+
+        Arguments:
+        - app: the application to find a script module name for
+        """
+        if not app.name:
+            return None
+
+        name = app.name
+        for mapping in scriptMappings:
+            regExpression = mapping[0]
+            moduleName = mapping[1]
+            if regExpression.match(app.name):
+                log.debug("script mapping for %s is %s"
+                          % (app.name, moduleName))
+                name = moduleName
+                break
+
+        return name
+
+    _getScriptModuleName = staticmethod(_getScriptModuleName)
+
+    def _createScript(self, app):
+        """For the given application name, create a new script instance.
+        We'll first see if a mapping from appName to module name exists.
+        If it does, we use that.  If it doesn't, we try the app name.
+        If all else fails, we fall back to the default script.
+        """
+        script = None
+
+        if enableCustomScripts:
+            # Look for custom scripts first.
+            #
+            # It really isn't an error if the script cannot be found.
+            # But, sometimes a script cannot be "found" because it has
+            # a syntax error in it, so we want to give script writers
+            # a vehicle for debugging these types of things.
+            #
+            moduleName = self._getScriptModuleName(app)
+            module = None
+
+            if moduleName and len(moduleName):
+                for package in scriptPackages:
+                    if len(package):
+                        name = package + "." + moduleName
+                    else:
+                        name = moduleName
+                    try:
+                        log.debug("looking for script %s.py..." % name)
+                        module = __import__(name,
+                                            globals(),
+                                            locals(),
+                                            [''])
+                        log.debug("...found %s.py" % name)
+                        break
+                    except ImportError:
+                        log.debug("...could not find %s.py" % name)
+                    except:
+                        log.exception("while attempting to import %s" % name)
+            if module:
+                try:
+                    script = module.Script(app)
+                except:
+                    # We do not want the getScript method to fail.  If it does,
+                    # we want to let the script developer know what went wrong,
+                    # but we also want to move along without crashing Orca.
+                    #
+                    log.exception("while attempting to create script")
+
+        # If there is no custom script for an application, try seeing if
+        # there is a script for the toolkit of the application.  If there
+        # is, then try to use it.  If there isn't, then fall back to the
+        # default script. Note that this search is restricted to the "orca"
+        # package for now.
+        #
+        if (not script) and app and getattr(app, "toolkitName", None):
+            for package in scriptPackages:
+                if package:
+                    name = '.'.join((package, app.toolkitName))
+                else:
+                    name = app.toolkitName
+                try:
+                    log.debug("looking for toolkit script %s.py..."
+                              % app.toolkitName)
+                    module = __import__(name,
+                                        globals(),
+                                        locals(),
+                                        [''])
+                    script = module.Script(app)
+                    log.debug("...found %s.py" % name)
+                except ImportError:
+                    log.debug("...could not find %s.py" % name)
+                except:
+                    log.exception("while attempting to import %s" % name)
+
+        if not script:
+            script = default.Script(app)
+
+        return script
+
+    def _reclaimScripts(self):
+        """Compares the list of known scripts to the list of known apps,
+        deleting any scripts as necessary.
+        """
+        # Sometimes the desktop can become unavailable.  This happens
+        # often when synaptic is used to load new modules (see the bug
+        # report http://bugzilla.gnome.org/show_bug.cgi?id=342022).
+        # So...if this happens, we'll just move along.  The next
+        # successful call to _reclaimScripts will reclaim anything we
+        # didn't reclaim this time.
+        #
+        try:
+            desktop = pyatspi.Registry.getDesktop(0)
+
+            for app in self._knownScripts.keys():
+                if app not in desktop:
+                    script = self._knownScripts[app]
+                    self._deregisterEventListeners(script)
+
+                    # Provide a bunch of hints to the garbage collector
+                    # that we just don't care about this stuff any longer.
+                    # Note the "app.app = None" - that helps remove a
+                    # cycle of the application referring to itself.
+                    #
+                    del self._knownScripts[app]
+                    del app
+                    del script
+        except:
+            log.exception("while reclaiming scripts")
+
+    def getScript(self, app):
+        """Get a script for an app (and make it if necessary).  This is used
+        instead of a simple call to Script's constructor.
+
+        Arguments:
+        - app: the Python app
+
+        Returns an instance of a Script.
+        """
+        # We might not know what the app is.  In this case, just defer
+        # to the default script for support.
+        #
+        if not app:
+            if not self._defaultScript:
+                self._defaultScript = default.Script(None)
+                self._registerEventListeners(self._defaultScript)
+            script = self._defaultScript
+        elif app in self._knownScripts:
+            script = self._knownScripts[app]
+        else:
+            script = self._createScript(app)
+            self._knownScripts[app] = script
+            self._registerEventListeners(script)
+
+        return script
+
+    def _setActiveScript(self, newScript, reason=None):
+        """Set the new active script.
+
+        Arguments:
+        - newScript: the new script to be made active.
+        """
+        self._activeScript = newScript
+        log.debug("ACTIVE SCRIPT: %s (reason=%s)"
+                  % (self._activeScript, reason))
+
+    ########################################################################
+    #                                                                      #
+    # METHODS PROCESSING AND DISPATCHING EVENTS                            #
+    #                                                                      #
+    ########################################################################
+
+    def _dispatchKeyboardEvent(self, keyboardEvent):
+        """Processes the given keyboard event based on the keybinding from the
+        currently active script.
+
+        Arguments:
+        - keyboardEvent: an instance of input_event.KeyboardEvent
+        """
+        if self._activeScript:
+            try:
+                self._activeScript.processKeyboardEvent(keyboardEvent)
+            except:
+                log.exception("while processing keyboard event")
+
+    def _dispatchBrailleEvent(self, brailleEvent):
+        """Called whenever we get a braille input event.
+
+        Arguments:
+        - brailleEvent: an instance of input_event.BrailleEvent
+        """
+        if self._activeScript:
+            try:
+                self._activeScript.processBrailleEvent(brailleEvent)
+            except:
+                log.exception("while processing braille event")
+
+    def _dispatchObjectEvent(self, event):
+        """Handles all events destined for scripts.
+
+        Arguments:
+        - event: an AT-SPI event.
+        """
+        log.debug(event)
+
+    def _processKeyboardEvent(self, event):
+        """Processes the given keyboard event based on the keybinding from the
+        currently active script. This method is called synchronously from the
+        at-spi registry and should be performant.  In addition, it must return
+        True if it has consumed the event (and False if not).
+
+        Arguments:
+        - event: an instance of pyatspi.Event
+
+        Returns True if the event should be consumed.
+        """
+        keyboardEvent = input_event.KeyboardEvent(event)
+        consume = self._activeScript \
+                  and self._activeScript.consumesKeyboardEvent(keyboardEvent)
+        if consume:
+            self._enqueueEvent(keyboardEvent)
+        return consume
+
+    def _processBrailleEvent(self, event):
+        """Called whenever a cursor key is pressed on the Braille display.
+
+        Arguments:
+        - event: an expanded BrlTTY event (see braille.py)
+
+        Returns True if the command was consumed; otherwise False
+        """
+        brailleEvent = input_event.BrailleEvent(event)
+        consume = self._activeScript \
+                  and self._activeScript.consumesBrailleEvent(brailleEvent)
+        if consume:
+            self._enqueueEvent(brailleEvent)
+        return consume
+
+    def _enqueueEvent(self, e):
+        """Handles all events destined for scripts.
+
+        Arguments:
+        - e: an at-spi event.
+        """
+        processSynchronously = synchronousMode
+
+        event = None
+        if isinstance(e, input_event.KeyboardEvent):
+            event = e
+        elif isinstance(e, input_event.BrailleEvent):
+            event = e
+        else:
+            if e.type in ignoredEventsList:
+                return
+
+            # We ignore defunct objects.
+            #
+            if e.type.startswith("object:state-changed:defunct"):
+                return
+
+            # We also generally do not like
+            # object:property-change:accessible-parent events because
+            # they indicate something is now whacked with the
+            # hierarchy.
+            #
+            if e.type.startswith("object:property-change:accessible-parent"):
+                return
+
+            # At this point in time, we only care when objects are
+            # removed from the desktop.
+            #
+            if e.type.startswith("object:children-changed:remove") \
+                and (e.source != pyatspi.Registry.getDesktop(0)):
+                return
+
+            # If the event doesn't have a source or that source is not marked
+            # valid, then we don't care about this event. Just return.
+            #            
+            event = e
+            if not event.source:
+                log.debug("---------> IGNORING INVALID EVENT %s" % e.type)
+
+            # Some toolkits (e.g., Java - see bug #531869) need to
+            # have their events processed immediately.
+            #
+            try:
+                if event.host_application.toolkitName \
+                    in synchronousToolkits:
+                    processSynchronously = True
+            except:
+                pass
+
+        if event:
+            log.debug("----------> QUEUEING %s" % str(event).replace("\n"," "))
+            self._eventQueue.put(event)
+            if processSynchronously:
+                self._dequeueEvent()
+
+    def _dequeueEvent(self):
+        """Handles all events destined for scripts.  Called by the GTK
+        idle thread.
+        """
+        rerun = True
+
+        try:
+            event = self._eventQueue.get_nowait()
+            log.debug("DEQUEUED %s <----------" % str(event).replace("\n"," "))
+            log.debug("\nvvvvv PROCESS %s vvvvv" % event)
+            if isinstance(event, input_event.KeyboardEvent):
+                self._dispatchKeyboardEvent(event)
+            elif isinstance(event, input_event.BrailleEvent):
+                self._dispatchBrailleEvent(event)
+            else:
+                self._dispatchObjectEvent(event)
+            log.debug("\n^^^^^ PROCESS %s ^^^^^" % str(event).replace("\n"," "))
+        except Queue.Empty:
+            log.exception("event queue is empty!")
+            rerun = False # destroy and don't call again
+        except:
+            log.exception("while processing event")
+
+        return rerun
+
+if __name__ == "__main__":
+    logging.basicConfig(format="%(name)s %(message)s")
+    log.setLevel(logging.DEBUG)
+
+    import utils
+    manager = ScriptManager()
+    print manager.getScript(utils.getKnownApplications()[0])

Added: branches/phase2/src/orca/scripts/Makefile.am
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/scripts/Makefile.am	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,8 @@
+SUBDIRS = apps toolkits
+
+orca_pathdir=$(pyexecdir)
+
+orca_python_PYTHON = \
+	__init__.py
+
+orca_pythondir=$(pyexecdir)/orca/scripts

Added: branches/phase2/src/orca/scripts/__init__.py
==============================================================================

Added: branches/phase2/src/orca/scripts/apps/Makefile.am
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/scripts/apps/Makefile.am	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,6 @@
+orca_pathdir=$(pyexecdir)
+
+orca_python_PYTHON = \
+	__init__.py
+
+orca_pythondir=$(pyexecdir)/orca/scripts/apps

Added: branches/phase2/src/orca/scripts/apps/__init__.py
==============================================================================

Added: branches/phase2/src/orca/scripts/toolkits/Makefile.am
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/scripts/toolkits/Makefile.am	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,6 @@
+orca_pathdir=$(pyexecdir)
+
+orca_python_PYTHON = \
+	__init__.py
+
+orca_pythondir=$(pyexecdir)/orca/scripts/toolkits

Added: branches/phase2/src/orca/scripts/toolkits/__init__.py
==============================================================================

Added: branches/phase2/src/orca/settings.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/settings.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,71 @@
+# Orca
+#
+# Copyright 2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Mechanism to support settings that are inherited."""
+
+__id__        = "$Id: default.py 4190 2008-09-11 15:28:56Z wwalker $"
+__version__   = "$Revision: 4190 $"
+__date__      = "$Date: 2008-09-11 11:28:56 -0400 (Thu, 11 Sep 2008) $"
+__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import logging
+log = logging.getLogger('orca.settings')
+
+class Settings(dict):
+    """The class to hold settings that also delegate to other settings.
+    derived.
+    """
+
+    def __init__(self, delegate=None):
+        """Creates a new Settings instance backed by a delegate.
+
+        Arguments:
+        - delegate: a Settings instance to use if settings cannot be found here.
+        """
+        self.delegate = delegate
+
+    def __getitem__(self, key):
+        """Returns the settings value for the given key."""
+        try:
+            return dict.__getitem__(self, key)
+        except KeyError:
+            try:
+                return self.delegate[key]
+            except TypeError:
+                raise KeyError(key)
+
+globalSettings = Settings()
+
+if __name__ == "__main__":
+    logging.basicConfig(format="%(name)s %(message)s")
+    log.setLevel(logging.DEBUG)
+
+    globalSettings["foo"] = 2
+    print globalSettings["foo"]
+    blah = Settings(globalSettings)
+    blah["blah"] = 3
+    print blah["blah"]
+    print blah["foo"]
+    globalSettings["foo"] = 7
+    print blah["foo"]
+    try:
+        print blah["o"]
+    except KeyError:
+        log.exception("This exception is expected:")

Added: branches/phase2/src/orca/utils.py
==============================================================================
--- (empty file)
+++ branches/phase2/src/orca/utils.py	Fri Sep 12 17:49:57 2008
@@ -0,0 +1,78 @@
+# Orca
+#
+# Copyright 2004-2008 Sun Microsystems Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+"""Common utilities for the Orca screen reader."""
+
+__id__        = "$Id: orca.py 4148 2008-09-03 14:31:54Z wwalker $"
+__version__   = "$Revision: 4148 $"
+__date__      = "$Date: 2008-09-03 10:31:54 -0400 (Wed, 03 Sep 2008) $"
+__copyright__ = "Copyright (c) 2004-2008 Sun Microsystems Inc."
+__license__   = "LGPL"
+
+import logging
+log = logging.getLogger('orca.utils')
+
+import pyatspi
+
+def getKnownApplications():
+    """Retrieves the list of currently running apps for the desktop
+    as a list of Accessible objects.
+    """
+    log.debug("getKnownApplications...")
+
+    apps = filter(lambda x: x is not None,
+                  pyatspi.Registry.getDesktop(0))
+
+    log.debug("...getKnownApplications")
+
+    return apps
+
+def findActiveWindow():
+    """Traverses the list of known apps looking for one who has an
+    immediate child (i.e., a window) whose state includes the active state.
+
+    Returns the Python Accessible of the window that's active or None if
+    no windows are active.
+    """
+    log.debug("findActiveWindow...")
+
+    window = None
+    apps = getKnownApplications()
+    for app in apps:
+        for child in app:
+            try:
+                state = child.getState()
+                if state.contains(pyatspi.STATE_ACTIVE):
+                    window = child
+                    break
+            except:
+                log.exception("exception looking at accessible's state")
+
+    log.debug("...findActiveWindow: %s" % window)
+
+    return window
+
+if __name__ == "__main__":
+    logging.basicConfig(format="%(name)s %(message)s")
+    log.setLevel(logging.DEBUG)
+
+    print "Known applications:"
+    for application in getKnownApplications():
+        print "  ", application
+    print "Active window: %s" % findActiveWindow()    



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]