ToDos in Priority order:

- Known Bugs  
  gstreamer sounddriver doesnt work (i think it needs a Glib 
  next word wrapping sometimes skips a word on beginn of line
  input handling does not work propperly
  
- 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

- add perApplicationTrigger trigger
  per application commands
  per application onScreenChange
  per application onInput
- per application shortcuts
- implement commands
  define_window
  remove_window
  add_bookmark (per application)
  remove_bookmark
  present_bookmark
  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 onScreenChange (new onScreenUpdate) commands
  read highlighted text mode
  window mode (define a area and just read that changes)
- 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"

- 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
  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
  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
  
- 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  
