orca r4197 - in branches/phase2: . icons po src src/louis src/orca src/orca/scripts src/orca/scripts/apps src/orca/scripts/toolkits
- From: wwalker svn gnome org
- To: svn-commits-list gnome org
- Subject: orca r4197 - in branches/phase2: . icons po src src/louis src/orca src/orca/scripts src/orca/scripts/apps src/orca/scripts/toolkits
- Date: Fri, 12 Sep 2008 17:49:57 +0000 (UTC)
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 = "<"
+ elif text[i] == "&":
+ char = "&"
+ 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]