# Version 1.5
- Doku: Write a user wiki 
  https://wiki.linux-a11y.org/doku.php?id=fenrir_user_manual&s[]=fenrir
  
- initial working setup.py

- available via pip (python packet manager)
sudo pip3 install fenrir-screenreader 
https://pypi.python.org/pypi/fenrir-screenreader/1.5.post5

- leave review on typing 

- add dependency check (check-dependencys.py)

- Add nice dummy drivers as template or for debugging

- reimplement detection code for X11

- initial translate structure (manuelcortez Thanks!)  

- add a configurable place where you can place own commands or overwrite existing commands without need to change default code

- implement autodetection of plugged and unplugged input devices 

- implement speechdriver generic

- try to autodetect encoding (Easy for contribution) (Prototype "charmapTTY" in play zone)

Braille Support (WIP):
  - initial BrlTTY driver
  - detect device size via driver
  - output to braille device  
  - make flushMode configurable
  - make flushTimeout configurable
  - flush message after X seconds and show current line (review over text)
  - tweak current commands and output
  - command flush_braille
  - command for scroll left
  - command for scroll right  
  - create offset for scrolling
  - respect scrolling
  make cursor following configurable (brailleCursorTrackingMode)
    - cell
    - page  
  follow cursor while typing  
  brailleFocusMode:
    - review = priority to review

- move to an event based system

- add initial multithreading/ multiprocessing support

- support cli parameters
  - add cli parameter for debugging "-d"
  - add cli parameter to overwrite options "-o"
  - add cli parameter to specify an settings.conf "-s"

- list of bound commands in Tutorial Mode. speak name, binding and description.

# Version: 1.00

- 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)  
- parse punctuation setting file in conf/substitution

- 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"
  next_char_phonetic
  prev_char_phonetic
  next_word_phonetic
  prev_word_phonetic
  toggle_highlighted_mode

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

- 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  
- beep on cursor to capital letters in cursor and review
- add pause handling
  create pause
  make it configurable when the pause the pause happens
- external scripting
  load scripts from a folder as subprocess
  create thread
  load key definition of keybindings like SOPS did

- add an daemonize mode
https://github.com/thesharp/daemonize
https://web.archive.org/web/20131017130434/http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

- announce capslock
- anounce numlock
- anounce scroll
- 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
