ToDos in Priority order:

- Known Bugs  
  Fenrir is not suspending on suspended TTYs
  sometimes text is presented twice (easiest to reproduce, type something while in irssi)
  mutt is not always announcing current message when you arrow to it. usually if there are more than 18 messages
  gstreamer sounddriver doesnt work (i think it needs a Glib 
  next word wrapping sometimes skips a word on beginn of line

- parse punctuation setting file in conf/substitution
- announce capslock
- anounce numlock
- anounce scroll
- add perApplicationTrigger trigger
  per application commands
  per application onScreenChange
  per application onInput
- per application shortcuts
- implement commands
  attributes_curr_char
  toggle_highlighted_mode
  generic list command (convert clipboard management)
    next item
    pref item
    curr item
    first item
    last item
- improve performance  

- implement onScreenUpdate commands
  read highlighted text mode
- add the debugging to core  
- autostart systemd
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html

- implement autodetection of plugged and removed input devices (python-pyudev)
http://askubuntu.com/questions/508236/how-can-i-run-code-whenever-a-usb-device-is-unplugged-without-requiring-root

- implement braille
httstormp://mielke.cc/brltty/doc/Manual-BrlAPI/English/BrlAPI.html
https://git.gnome.org/browse/orca/tree/src/orca/braille.py
https://wiki.gnome.org/Attic/LSR/ScratchPad/Braille/BrlAPI

- configuration should be overwriteable with parameter and alternative paths
- write settings
- menue for settings configuration #storm
- translateable

- implement speechdriver generic
-------------DONE--------------------------------
- move from VCS to VCSA and parese the Attributes
http://linux.die.net/man/4/vcsa
http://man.cx/vcsa(4)/de
http://manpages.org/display-vcsa/7
https://en.wikipedia.org/wiki/Virtual_console
every second byte is a attribute others are text. fast way: c[::2],c[1::2]
http://manpages.ubuntu.com/manpages/precise/de/man4/vcs.4.html
https://docs.python.org/3/library/fcntl.html
http://rodrigorivas.serveblog.net/en/imagenes-desde-vt-con-vcsa/
good doku:
http://angband.oook.cz/d/eyangband-052/src/main-vcs.c
http://manpages.ubuntu.com/manpages/trusty/man1/screader.1.html

- implement speechdriver espeak
https://github.com/relsi/python-espeak

- detect collumns in TTYs automaticaly. 
it seems we have this info in vcsa

- get current cursor
- shortcut handling
https://docs.python.org/2/library/termios.html
http://stackoverflow.com/questions/287757/pythons-configparser-unique-keys-per-section
0=down, 1=press, 2=hold
2KEY_SHIFT, 1KEY_A = say_current_line_cursor
- implement command structure
- implement speechdriver speechd
https://git.gnome.org/browse/orca/tree/src/orca/speech.py
https://git.gnome.org/browse/orca/tree/src/orca/speechdispatcherfactory.py
http://devel.freebsoft.org/doc/speechd/speech-dispatcher.html#Client-Programming

- autodetect current TTY maybe with (PAM or a sys folder)
cat /sys/devices/virtual/tty/tty0/active 
http://serverfault.com/questions/306854/how-to-find-out-the-currently-active-linux-virtual-terminal-while-connected-via

- Input 
http://python-evdev.readthedocs.io/en/latest/tutorial.html
http://stackoverflow.com/questions/12384772/how-can-i-capture-mouseevents-and-keyevents-using-python-in-background-on-linux
maybe TTY in RAW MODE

- Settings (make it configureable)
- improve differ speed
- lock mechanism for threads
- restructure loops to listen for events
  inputloop -> does block with an select
  commands -> a new thread should spawned from inputloop
  updatescreen -> maybe we could watch it with inotify vsca should support polling COMMENT: sadly not possible, poll events not fired as expected
  https://github.com/seb-m/pyinotify/wiki/Tutorial
<Example Code>
import pyinotify
import glob
class Identity(pyinotify.ProcessEvent):
    def process_default(self, event):
        p = event.pathname
        print(p)

wm = pyinotify.WatchManager()

notifier = pyinotify.Notifier(wm, default_proc_fun=Identity(), timeout=5)
wm.add_watch('/sys/devices/virtual/tty/tty0/active', pyinotify.IN_CLOSE_WRITE)
for file in list(glob.glob('/dev/vcsa[0-64]')):
    wm.add_watch(file, pyinotify.IN_CLOSE_WRITE)
    print(file)

try:
    while 1:
        notifier.process_events()
        if notifier.check_events( timeout=1000):
            notifier.read_events()
            print('events')
        else:
            print('timeout')
except KeyboardInterrupt:
    notifier.stop()
    print('fin')
</Example Code>

  https://www.infoq.com/articles/inotify-linux-file-system-event-monitoring
  https://github.com/seb-m/pyinotify/wiki/Tutorial
  http://www.saltycrane.com/blog/2010/04/monitoring-filesystem-python-and-pyinotify/
  
- add setting for ignore screens ( dont grab shortcuts from X or orca)    
- soundIcons
- performance tuning
- add sound volume
- convert volume to percent in config
- convert pitch to percent in config
- convert rate to percent in config
- make screenUpdate rate configurable
- default soundIcon theme (soundfiles)  
- debugging
- threading ReadContent, ReadShortcuts, executeCommands, listenNewTTYsForListen, controllThread (main)
- autoload plugins while starting
- implement sounddriver generic (use current sox and make it configurable)
- add setting for autodetect X
ps a -o tty,comm  | grep -e Xorg | grep -v "grep -e Xorg"
- respect window mode in differ (getwindow code is already in place)  

- implement commands
  curr_word
  curr_char
  next_word
  next_char
  prev_word
  prev_char
  enable_disable_speech #enable, disable speech
  enable_disable_braile #enable, disable braile
  enable_disable_sound #enable, disable sound 
  enable_disable_output #enable, disable speech, braile and sound
  next_clipboard
  prev_clipboard
  first_clipboard
  last_clipboard
  curr_clipboard
  paste_clipboard
  define_window
  remove_window  
  reset_review_on_screen_change
  remove_clipboard_marks
  copy_marked
  set_mark (this could also used for area?)
  read_clipboard_mark_text
  curr_screen
  curr_screen_before_cursor
  curr_screen_after_cursor
  cursor_position
  indention
  add_bookmark (per application)
  remove_bookmark
  present_bookmark  
  say_char_phonetic
  spell_word_phonetic
  "alpha", "bravo", "charlie", "delta", "echo",
  "foxtrot", "golf", "hotel", "india", "juliet",
  "kilo", "lima", "mike", "november", "oscar",
  "papa", "quebec", "romeo", "sierra", "tango",
  "uniform", "victor", "whisky", "x ray",
  "yankee", "zulu"

- implement onInput commands 
  read_line_if_cursor_change_vertical (needed if you arrow up and down, we want to announce the line)
  read_char_if_cursur_change_horizontal (needed if you arrow left and right, we want to announce the char under the cursor)
  echo_char (echos the last char on pressing space or return)     
  echo_word (echos the last word)
  echo_deleted_char (echos deleted char on screen
  
- implement onScreenChange commands
  promoted text
  clear_marks_on_screen_change
  leve_review_mode_on_screen_change
  window mode (define a area and just read that changes)  
  
- add screenManager
  abstract screen driver
- pass environment instance in init and remove it from function calls

- New Triggers
  onAppChange
  onAppProfileChange
  onScreenChange
  rename current onScreenChange to onScreenUpdate  
  
- rework inputManager
  try to consume shortcuts
  grab keyboard exclusive 
  release keyboard on error or quit
  grab shortcuts with fenrir key
  grab "singel key shortcuts" like numpad navigation for review 
  forwart nonshortcuts to system
  make grabbing configuarble
  possiblity to forewart shortcut [proxyshortcut]
  possiblity to forewart shortcut (or use them as shortcut) [pressing twice while timeout]
  cleanup inputManager
  split input driver out of the handler

- dictonary for special chars and string replacements
- punctuation