Started project cleanup.
This commit is contained in:
parent
bd975df912
commit
e123c8ebfa
9
CREDITS
9
CREDITS
@ -3,11 +3,16 @@
|
|||||||
|
|
||||||
## Developers
|
## Developers
|
||||||
|
|
||||||
* Chrys: Main coder.
|
* Storm Dragon: Project leader
|
||||||
* Storm Dragon Sounds and keyboard layout, tiny bits of code.
|
|
||||||
* Jeremiah: Coder.
|
* Jeremiah: Coder.
|
||||||
|
|
||||||
|
|
||||||
|
## Previous Developers
|
||||||
|
|
||||||
|
* Chrys: coder.
|
||||||
|
|
||||||
|
|
||||||
## Special thanks to:
|
## Special thanks to:
|
||||||
|
|
||||||
* F123 Consulting for suggestions, some funding, and endless testing.
|
* F123 Consulting for suggestions, some funding, and endless testing.
|
||||||
|
* Stormux for continuation of the project.
|
||||||
|
87
TODO v2.0
87
TODO v2.0
@ -1,87 +0,0 @@
|
|||||||
ToDo list for Fenrir Version 2.0
|
|
||||||
Things needing little knowledge are marked with "(Easy for contribution)". so just start with those :).
|
|
||||||
[] = ToDo
|
|
||||||
[W] = WIP
|
|
||||||
[X] = Done
|
|
||||||
[S] = Stopped
|
|
||||||
|
|
||||||
Cleanups:
|
|
||||||
[] Migrate *Data.py to classes and use getter/setter (Easy for contribution)
|
|
||||||
[] commandsData.py
|
|
||||||
[] eventData.py
|
|
||||||
[] generalData.py
|
|
||||||
[] inputData.py
|
|
||||||
[] outputData.py
|
|
||||||
[] punctuationData.py
|
|
||||||
[] runtimeData.py
|
|
||||||
[w] screenData.py
|
|
||||||
[] settingsData -> defaultSettings.py
|
|
||||||
[] Unify Key Forewarding and Sticky mode for keyboard and bytecode inputDrivers.
|
|
||||||
[] replace lines by a list insteed of and \n seperated string. (currently we need to split to often) (Easy for contribution)
|
|
||||||
General (Easy for contribution)
|
|
||||||
[w] make fenrir runnable without root permissions
|
|
||||||
[] check pythran for performance
|
|
||||||
https://github.com/serge-sans-paille/pythran
|
|
||||||
[] make fenrir runable without settingsfile. fallback to defaults
|
|
||||||
[] Detect progressbars and just present percent
|
|
||||||
|=============== |100%
|
|
||||||
[=================> ] 100%
|
|
||||||
######################## 100%
|
|
||||||
Imporove attribute handling
|
|
||||||
[] beep on review by word (once for multiple, capital wins) (Easy for contribution)
|
|
||||||
[] configurable (by char, by word, none) (Easy for contribution)
|
|
||||||
https://github.com/jwilk/vcsapeek/blob/master/linuxvt.py
|
|
||||||
|
|
||||||
Improved Say all
|
|
||||||
[] speech callbacks
|
|
||||||
[] speech process by word
|
|
||||||
[] all the text of all pages
|
|
||||||
[] command to stop and place review cursor at this position
|
|
||||||
[] command to slow down speech on keypress
|
|
||||||
[] place say all at clipboard buffer
|
|
||||||
|
|
||||||
Table review mode
|
|
||||||
[] toggle table mode/ select headline
|
|
||||||
[] next line
|
|
||||||
[] prev line
|
|
||||||
[] current line
|
|
||||||
[] next cell
|
|
||||||
[] prev cell
|
|
||||||
[] current cell
|
|
||||||
[] select field separator
|
|
||||||
|
|
||||||
Braille Support:
|
|
||||||
[] brailleFocusMode:
|
|
||||||
[] manual = no automatic toggle command used
|
|
||||||
[] last = follow last used cursor
|
|
||||||
[] print cursor in review
|
|
||||||
[] print cursor in textmode
|
|
||||||
[] word wrapping (if word does not fit print it at next page)
|
|
||||||
https://docs.python.org/2/library/textwrap.html#textwrap.TextWrapper
|
|
||||||
drop_whitespace = False
|
|
||||||
replace_whitespace = False
|
|
||||||
w.fill(i).split('\n')
|
|
||||||
[] command toggle used cursor (in manual brailleFocusMode)
|
|
||||||
[] capture input from braile
|
|
||||||
[] make routing keys assignable by keyboard
|
|
||||||
[] make brailleTable configurable
|
|
||||||
[] pkg-config --variable=tablesdir liblouis
|
|
||||||
returns on Arch:/usr/share/liblouis/tables
|
|
||||||
http://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
|
|
||||||
https://github.com/google/brailleback/blob/master/third_party/brltty/Bindings/Python/brlapi.pyx
|
|
||||||
|
|
||||||
[] ATK input driver (don't grab on graphical interface)
|
|
||||||
https://git.linux-a11y.org/AIT/pyatspi2/src/master/examples/keypress.py
|
|
||||||
|
|
||||||
Driver (speech):
|
|
||||||
[S] talkey driver ( verry unresponsive for espeak in linux)
|
|
||||||
https://pypi.python.org/pypi/ptyprocess#downloads
|
|
||||||
https://github.com/tbsaunde/yasr/blob/master/yasr/tts.c
|
|
||||||
[] Dectalk SpeechDriver (Easy for contribution, device needed - i dont own one)
|
|
||||||
https://github.com/tvraman/emacspeak/blob/master/servers/obsolete/python/dectalk.py
|
|
||||||
https://github.com/tbsaunde/yasr/blob/master/yasr/tts.c
|
|
||||||
[] MacOS speech Driver
|
|
||||||
Settings:
|
|
||||||
[] menue for settings configuration (Easy for contribution)
|
|
22
TODOv3.0
22
TODOv3.0
@ -1,22 +0,0 @@
|
|||||||
ToDo list for Fenrir Version 3.0
|
|
||||||
Things needing little knowledge are marked with "(Easy for contribution)". so just start with those :).
|
|
||||||
[] = ToDo
|
|
||||||
[W] = WIP
|
|
||||||
[X] = Done
|
|
||||||
[S] = Stopped
|
|
||||||
|
|
||||||
__TODO___
|
|
||||||
Application Profiles (low priority):
|
|
||||||
- reimplement process detection without subprocessing
|
|
||||||
- fenrir is not able to detect the current application inside of screen.
|
|
||||||
ps -e -H -o pid,pgrp,ppid,tty,cmd
|
|
||||||
http://stackoverflow.com/questions/24861351/how-to-detect-if-python-script-is-being-run-as-a-background-process/24862213
|
|
||||||
fd = os.open("/dev/tty5", os.O_RDONLY )
|
|
||||||
os.tcgetpgrp(fd)
|
|
||||||
- add perApplicationTrigger trigger
|
|
||||||
per application commands
|
|
||||||
per application onScreenChange
|
|
||||||
per application onInput
|
|
||||||
- per application shortcuts
|
|
||||||
|
|
||||||
___DONE___
|
|
@ -1 +0,0 @@
|
|||||||
Subproject commit fcefe65ecd6812b7a39d8f6a4bf44805c2a9717a
|
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 0537ad1a8b9f73e6d58775ffc08f7625bc601fa3
|
|
@ -1 +0,0 @@
|
|||||||
https://stackoverflow.com/questions/880227/what-is-the-minimum-i-have-to-do-to-create-an-rpm-file
|
|
@ -1,12 +0,0 @@
|
|||||||
install it.
|
|
||||||
1. build it
|
|
||||||
make -f /usr/share/selinux/strict/include/Makefile fenrir.pp
|
|
||||||
2. install it
|
|
||||||
semodule -i /path/to/fenrir.pp
|
|
||||||
|
|
||||||
|
|
||||||
# created with that
|
|
||||||
# systemctl start fenrir
|
|
||||||
# ausearch -c '(r-daemon)' --raw | audit2allow -M fenrir
|
|
||||||
# semodule -X 300 -i fenrir.pp
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
module fenrir 1.0;
|
|
||||||
|
|
||||||
require {
|
|
||||||
type user_home_t;
|
|
||||||
type init_t;
|
|
||||||
class file { execute execute_no_trans open read };
|
|
||||||
}
|
|
||||||
|
|
||||||
#============= init_t ==============
|
|
||||||
allow init_t user_home_t:file { execute execute_no_trans open read };
|
|
@ -1,12 +0,0 @@
|
|||||||
#!/bin/python3
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description="Fenrir Help")
|
|
||||||
|
|
||||||
parser.add_argument('-s', '--setting', metavar='SETTING-FILE', default='/etc/fenrir/settings/settings.conf', help='Use a specified settingsfile')
|
|
||||||
parser.add_argument('-o', '--options', metavar='SECTION:SETTING=VALUE,..', default='', help='Overwrite options in given settings file')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
parser.print_help()
|
|
||||||
|
|
||||||
print(args.setting)
|
|
@ -1,88 +0,0 @@
|
|||||||
import time
|
|
||||||
from fcntl import ioctl
|
|
||||||
from array import array
|
|
||||||
from struct import unpack_from
|
|
||||||
from struct import unpack
|
|
||||||
from struct import pack
|
|
||||||
import errno
|
|
||||||
import sys
|
|
||||||
charmap = {}
|
|
||||||
hichar = None
|
|
||||||
def updateCharMap(screen):
|
|
||||||
global hichar
|
|
||||||
ttyno = '4'
|
|
||||||
tty = open('/dev/tty' + screen, 'rb')
|
|
||||||
GIO_UNIMAP = 0x4B66
|
|
||||||
VT_GETHIFONTMASK = 0x560D
|
|
||||||
himask = array("H", (0,))
|
|
||||||
ioctl(tty, VT_GETHIFONTMASK, himask)
|
|
||||||
hichar, = unpack_from("@H", himask)
|
|
||||||
sz = 512
|
|
||||||
line = ''
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
unipairs = array("H", [0]*(2*sz))
|
|
||||||
unimapdesc = array("B", pack("@HP", sz, unipairs.buffer_info()[0]))
|
|
||||||
ioctl(tty.fileno(), GIO_UNIMAP, unimapdesc)
|
|
||||||
break
|
|
||||||
except IOError as e:
|
|
||||||
if e.errno != errno.ENOMEM:
|
|
||||||
raise
|
|
||||||
sz *= 2
|
|
||||||
tty.close()
|
|
||||||
ncodes, = unpack_from("@H", unimapdesc)
|
|
||||||
utable = unpack_from("@%dH" % (2*ncodes), unipairs)
|
|
||||||
for u, b in zip(utable[::2], utable[1::2]):
|
|
||||||
if charmap.get(b) is None:
|
|
||||||
charmap[b] = chr(u)
|
|
||||||
|
|
||||||
|
|
||||||
def autoDecodeVCSA(allData, rows, cols):
|
|
||||||
allText = []
|
|
||||||
allAttrib = []
|
|
||||||
for y in range(rows):
|
|
||||||
lineText = ''
|
|
||||||
lineAttrib = []
|
|
||||||
i = 0
|
|
||||||
for x in range(cols):
|
|
||||||
data = allData[i: i + 2]
|
|
||||||
i += 2
|
|
||||||
if data == b' \x07':
|
|
||||||
#attr = 7
|
|
||||||
#ink = 7
|
|
||||||
#paper = 0
|
|
||||||
#ch = ' '
|
|
||||||
lineAttrib.append(7)
|
|
||||||
lineText += ' '
|
|
||||||
continue
|
|
||||||
(sh,) = unpack("=H", data)
|
|
||||||
attr = (sh >> 8) & 0xFF
|
|
||||||
ch = sh & 0xFF
|
|
||||||
if hichar == 0x100:
|
|
||||||
attr >>= 1
|
|
||||||
lineAttrib.append(attr)
|
|
||||||
ink = attr & 0x0F
|
|
||||||
paper = (attr>>4) & 0x0F
|
|
||||||
#if (ink != 7) or (paper != 0):
|
|
||||||
# print(ink,paper)
|
|
||||||
if sh & hichar:
|
|
||||||
ch |= 0x100
|
|
||||||
try:
|
|
||||||
lineText += charmap[ch]
|
|
||||||
except:
|
|
||||||
lineText += chr('?')
|
|
||||||
allText.append(lineText)
|
|
||||||
allAttrib.append(lineAttrib)
|
|
||||||
return allText, allAttrib
|
|
||||||
|
|
||||||
def m(screen):
|
|
||||||
s = time.time()
|
|
||||||
updateCharMap(str(screen))
|
|
||||||
print(time.time() -s )
|
|
||||||
vcsa = open('/dev/vcsa' + str(screen), 'rb')
|
|
||||||
head = vcsa.read(4)
|
|
||||||
rows = int(head[0])
|
|
||||||
cols = int(head[1])
|
|
||||||
text, attrib = autoDecodeVCSA(vcsa.read(), rows, cols)
|
|
||||||
print(time.time() -s )
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# clilauncher.sh
|
|
||||||
# Description: Launches xterm with give application and fenrir.
|
|
||||||
#
|
|
||||||
# Copyright 2019, F123 Consulting, <information@f123.org>
|
|
||||||
# Copyright 2019, Storm Dragon, <storm_dragon@linux-a11y.org>
|
|
||||||
#
|
|
||||||
# This is free software; you can redistribute it and/or modify it under the
|
|
||||||
# terms of the GNU General Public License as published by the Free
|
|
||||||
# Software Foundation; either version 3, or (at your option) any later
|
|
||||||
# version.
|
|
||||||
#
|
|
||||||
# This software 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
|
|
||||||
# General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this package; see the file COPYING. If not, write to the Free
|
|
||||||
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
||||||
# 02110-1301, USA.
|
|
||||||
#
|
|
||||||
#--code--
|
|
||||||
|
|
||||||
if [[ $# -lt 1 ]]; then
|
|
||||||
echo "Usage: $0 program to launch args."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Make sure the program being launched exists
|
|
||||||
command -v "${1%% *}" &> /dev/null || exit 1
|
|
||||||
|
|
||||||
for i in /tmp/fenrirscreenreader-*.sock ; do
|
|
||||||
if [[ "$i" != "/tmp/fenrirscreenreader-deamon.sock" ]]; then
|
|
||||||
echo -n "setting set screen#suspendingScreen=pty" | socat - UNIX-CLIENT:$i
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
#/usr/bin/urxvt -name "${1%% *}" -e fenrir -d -s /etc/fenrirscreenreader/settings/xterm.conf -o "general.shell=/usr/bin/${1%% *};remote#socketFile=/tmp/fenrirscreenreader-${1%% *}.sock"
|
|
||||||
/usr/bin/urxvt -name "${1%% *}" -e ../src/fenrir -d -s ./xterm.conf -o "general.shell=/usr/bin/${1%% *};remote#socketFile=/tmp/fenrirscreenreader-${1%% *}.sock"
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo "foreground colors"
|
|
||||||
echo -e "\e[39mDefault"
|
|
||||||
echo -e "\e[30mBlack"
|
|
||||||
echo -e "\e[31mRed"
|
|
||||||
echo -e "\e[32mGreen"
|
|
||||||
echo -e "\e[33mYellow"
|
|
||||||
echo -e "\e[34mBlue"
|
|
||||||
echo -e "\e[35mMagenta"
|
|
||||||
echo -e "\e[36mCyan"
|
|
||||||
echo -e "\e[37mLight gray"
|
|
||||||
echo -e "\e[90mDark gray"
|
|
||||||
echo -e "\e[91mLight red"
|
|
||||||
echo -e "\e[92mLight green"
|
|
||||||
echo -e "\e[93mLight yellow"
|
|
||||||
echo -e "\e[94mLight blue"
|
|
||||||
echo -e "\e[95mLight magenta"
|
|
||||||
echo -e "\e[96mLight cyan"
|
|
||||||
echo -e "\e[97mWhite"
|
|
||||||
|
|
||||||
echo "background colors"
|
|
||||||
echo -e "\e[49mDefault"
|
|
||||||
echo -e "\e[40mBlack"
|
|
||||||
echo -e "\e[41mRed"
|
|
||||||
echo -e "\e[42mGreen"
|
|
||||||
echo -e "\e[43mYellow"
|
|
||||||
echo -e "\e[44mBlue"
|
|
||||||
echo -e "\e[45mMagenta"
|
|
||||||
echo -e "\e[46mCyan"
|
|
||||||
echo -e "\e[47mLight gray"
|
|
||||||
echo -e "\e[100mDark gray"
|
|
||||||
echo -e "\e[101mLight red"
|
|
||||||
echo -e "\e[102mLight green"
|
|
||||||
echo -e "\e[103mLight yellow"
|
|
||||||
echo -e "\e[104mLight blue"
|
|
||||||
echo -e "\e[105mLight magenta"
|
|
||||||
echo -e "\e[106mLight cyan"
|
|
||||||
echo -e "\e[107mWhite"
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
import evdev
|
|
||||||
from evdev import InputDevice, UInput
|
|
||||||
from select import select
|
|
||||||
import time
|
|
||||||
|
|
||||||
iDevices = map(evdev.InputDevice, (evdev.list_devices()))
|
|
||||||
iDevices = {dev.fd: dev for dev in iDevices if evdev.events.EV_KEY in dev.capabilities()}
|
|
||||||
|
|
||||||
uDevices = {}
|
|
||||||
for fd in iDevices:
|
|
||||||
dev = iDevices[fd]
|
|
||||||
cap = dev.capabilities()
|
|
||||||
del cap[0]
|
|
||||||
uDevices[fd] = UInput(
|
|
||||||
cap,
|
|
||||||
dev.name,
|
|
||||||
dev.info.vendor,
|
|
||||||
# dev.info.product,
|
|
||||||
# dev.version,
|
|
||||||
# dev.info.bustype,
|
|
||||||
# '/dev/uinput'
|
|
||||||
)
|
|
||||||
dev.grab()
|
|
||||||
|
|
||||||
|
|
||||||
i = 0
|
|
||||||
while i < 100:
|
|
||||||
r, w, x = select(iDevices, [], [])
|
|
||||||
if r != []:
|
|
||||||
i += 1
|
|
||||||
for fd in r:
|
|
||||||
for event in iDevices[fd].read():
|
|
||||||
if event.code != 30: # a
|
|
||||||
print(event)
|
|
||||||
uDevices[fd].write_event(event)
|
|
||||||
uDevices[fd].syn()
|
|
||||||
#print('Devicename:'+ devices[fd].name + ' Devicepath:' + devices[fd].fn + ' Events:' + str(devices[fd].active_keys(verbose=True)) + ' Value:' + str(event.value))
|
|
||||||
else:
|
|
||||||
print('this key is consumed')
|
|
||||||
|
|
||||||
for fd in iDevices:
|
|
||||||
iDevices[fd].ungrab()
|
|
||||||
iDevices[fd].close()
|
|
||||||
uDevices[fd].close()
|
|
||||||
|
|
||||||
|
|
||||||
iDevices.clear()
|
|
||||||
uDevices.clear()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
from time import sleep
|
|
||||||
from daemonize import Daemonize
|
|
||||||
|
|
||||||
pid = "/tmp/test.pid"
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
while True:
|
|
||||||
sleep(5)
|
|
||||||
|
|
||||||
daemon = Daemonize(app="test_app", pid=pid, action=main)
|
|
||||||
daemon.start()
|
|
@ -1,50 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
import evdev
|
|
||||||
iDevices = {}
|
|
||||||
iDeviceNo = 0
|
|
||||||
def updateInputDevices(force = False, init = False):
|
|
||||||
global iDeviceNo
|
|
||||||
if init:
|
|
||||||
iDevices = {}
|
|
||||||
iDeviceNo = 0
|
|
||||||
deviceFileList = evdev.list_devices()
|
|
||||||
if not force:
|
|
||||||
if len(deviceFileList) == iDeviceNo:
|
|
||||||
return
|
|
||||||
iDeviceNo = len(deviceFileList)
|
|
||||||
mode = 'ALL'
|
|
||||||
iDevicesFiles = []
|
|
||||||
for device in iDevices:
|
|
||||||
iDevicesFiles.append(iDevices[device].fn)
|
|
||||||
print(len(iDevicesFiles),len(deviceFileList))
|
|
||||||
if len(iDevicesFiles) == len(deviceFileList):
|
|
||||||
return
|
|
||||||
for deviceFile in deviceFileList:
|
|
||||||
try:
|
|
||||||
if deviceFile in iDevicesFiles:
|
|
||||||
print('skip')
|
|
||||||
continue
|
|
||||||
open(deviceFile)
|
|
||||||
# 3 pos absolute
|
|
||||||
# 2 pos relative
|
|
||||||
# 1 Keys
|
|
||||||
currDevice = evdev.InputDevice(deviceFile)
|
|
||||||
cap = currDevice.capabilities()
|
|
||||||
if mode in ['ALL','NOMICE']:
|
|
||||||
if 1 in cap:
|
|
||||||
if 116 in cap[1] and len(cap[1]) < 5:
|
|
||||||
print('power')
|
|
||||||
continue
|
|
||||||
if mode == 'ALL':
|
|
||||||
iDevices[currDevice.fd] = currDevice
|
|
||||||
print('Device added:' + iDevices[currDevice.fd].name)
|
|
||||||
elif mode == 'NOMICE':
|
|
||||||
if not ((2 in cap) or (3 in cap)):
|
|
||||||
iDevices[currDevice.fd] = currDevice
|
|
||||||
print('Device added:' + iDevices[currDevice.fd].name)
|
|
||||||
elif currDevice.name.upper() in mode.split(','):
|
|
||||||
iDevices[currDevice.fd] = currDevice
|
|
||||||
print('Device added:' + iDevices[currDevice.fd].name)
|
|
||||||
except Exception as e:
|
|
||||||
print("Skip Inputdevice : " + deviceFile +' ' + str(e))
|
|
||||||
updateInputDevices()
|
|
@ -1,37 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
|
|
||||||
import select
|
|
||||||
import time
|
|
||||||
|
|
||||||
currScreen = '2'
|
|
||||||
vcsa = {}
|
|
||||||
for i in range(1,7):
|
|
||||||
vcsa[str(i)] = open('/dev/vcs'+str(i),'rb')
|
|
||||||
|
|
||||||
tty = open('/sys/devices/virtual/tty/tty0/active','r')
|
|
||||||
currScreen = str(tty.read()[3:-1])
|
|
||||||
oldScreen = currScreen
|
|
||||||
watchdog = select.epoll()
|
|
||||||
watchdog.register(vcsa[currScreen], select.EPOLLPRI)
|
|
||||||
watchdog.register(tty, select.EPOLLPRI)
|
|
||||||
|
|
||||||
while True:
|
|
||||||
changes = watchdog.poll()
|
|
||||||
print('-----------------------------')
|
|
||||||
print(changes)
|
|
||||||
for change in changes:
|
|
||||||
fileno = change[0]
|
|
||||||
event = change[1]
|
|
||||||
print(change,fileno, tty.fileno())
|
|
||||||
if fileno == tty.fileno():
|
|
||||||
tty.seek(0)
|
|
||||||
currScreen = str(tty.read()[3:-1])
|
|
||||||
if currScreen != oldScreen:
|
|
||||||
watchdog.unregister(vcsa[ oldScreen ])
|
|
||||||
watchdog.register(vcsa[ currScreen ], select.EPOLLPRI)
|
|
||||||
oldScreen = currScreen
|
|
||||||
print('new screen '+ currScreen)
|
|
||||||
else:
|
|
||||||
vcsa[currScreen].seek(0)
|
|
||||||
content = vcsa[currScreen].read()
|
|
||||||
print('update '+ str(time.time()))
|
|
@ -1,5 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
|
|
||||||
# in case that event13 is still the broken device
|
|
||||||
f = open('/dev/input/event13')
|
|
||||||
print('OK /dev/input/event13')
|
|
@ -1,48 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo "foreground colors"
|
|
||||||
echo -e "\e[39mDefault"
|
|
||||||
echo -e "\e[30mBlack"
|
|
||||||
echo -e "\e[31mRed"
|
|
||||||
echo -e "\e[32mGreen"
|
|
||||||
echo -e "\e[33mYellow"
|
|
||||||
echo -e "\e[34mBlue"
|
|
||||||
echo -e "\e[35mMagenta"
|
|
||||||
echo -e "\e[36mCyan"
|
|
||||||
echo -e "\e[37mLight gray"
|
|
||||||
echo -e "\e[90mDark gray"
|
|
||||||
echo -e "\e[91mLight red"
|
|
||||||
echo -e "\e[92mLight green"
|
|
||||||
echo -e "\e[93mLight yellow"
|
|
||||||
echo -e "\e[94mLight blue"
|
|
||||||
echo -e "\e[95mLight magenta"
|
|
||||||
echo -e "\e[96mLight cyan"
|
|
||||||
echo -e "\e[97mWhite"
|
|
||||||
#7: _('Default'), 0: _('Black'), 4: _('Red'), 2: _('Green'), 6: _('Yellow'), 1: _('Blue'), 5: _('Magenta'), 3: _('Cyan'), 7: _('Light gray'), 8: _('Dark gray'), 12: _('Light red'), 10: , ('Light green'), 14: _('Light yellow'), 9: _('Light blue'), 13: _('Light magenta'), 11: _('Light cyan'), 15: _('White')
|
|
||||||
|
|
||||||
echo "background colors"
|
|
||||||
echo -e "\e[49mDefault"
|
|
||||||
echo -e "\e[40mBlack"
|
|
||||||
echo -e "\e[41mRed"
|
|
||||||
echo -e "\e[42mGreen"
|
|
||||||
echo -e "\e[43mYellow"
|
|
||||||
echo -e "\e[44mBlue"
|
|
||||||
echo -e "\e[45mMagenta"
|
|
||||||
echo -e "\e[46mCyan"
|
|
||||||
echo -e "\e[47mLight gray"
|
|
||||||
echo -e "\e[100mDark gray"
|
|
||||||
echo -e "\e[101mLight red"
|
|
||||||
echo -e "\e[102mLight green"
|
|
||||||
echo -e "\e[103mLight yellow"
|
|
||||||
echo -e "\e[104mLight blue"
|
|
||||||
echo -e "\e[105mLight magenta"
|
|
||||||
echo -e "\e[106mLight cyan"
|
|
||||||
echo -e "\e[107mWhite"
|
|
||||||
|
|
||||||
echo "format"
|
|
||||||
echo -e "\e[1mBold"
|
|
||||||
echo -e "\e[2mDim"
|
|
||||||
echo -e "\e[4mUnderlined"
|
|
||||||
echo -e "\e[5mBlink"
|
|
||||||
echo -e "\e[7minverted"
|
|
||||||
echo -e "\e[8mHidden"
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
import gi
|
|
||||||
from gi.repository import GLib
|
|
||||||
gi.require_version('Gst', '1.0')
|
|
||||||
from gi.repository import Gst
|
|
||||||
import time, threading
|
|
||||||
gi.require_version('Atspi', '2.0')
|
|
||||||
import pyatspi
|
|
||||||
|
|
||||||
# Callback to print the active window on key press amd filter out the key release
|
|
||||||
def on_key_input(event):
|
|
||||||
print(event)
|
|
||||||
|
|
||||||
mainloop = GLib.MainLoop()
|
|
||||||
thread = threading.Thread(target=mainloop.run)
|
|
||||||
thread.start()
|
|
||||||
#pyatspi.Registry.registerKeystrokeListener(on_key_input, kind=(pyatspi.KEY_PRESSED_EVENT, pyatspi.KEY_RELEASED_EVENT))
|
|
||||||
pyatspi.Registry.registerKeystrokeListener(on_key_input,mask=pyatspi.allModifiers(), kind=(pyatspi.KEY_PRESS,pyatspi.KEY_RELEASE,pyatspi.KEY_PRESSRELEASE), synchronous=True, preemptive=True)
|
|
||||||
pyatspi.Registry.start()
|
|
@ -1,23 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
import evdev
|
|
||||||
from evdev import InputDevice, UInput
|
|
||||||
from select import select
|
|
||||||
import time
|
|
||||||
|
|
||||||
iDevices = map(evdev.InputDevice, (evdev.list_devices()))
|
|
||||||
iDevices = {dev.fd: dev for dev in iDevices}
|
|
||||||
print('----------------------')
|
|
||||||
for fd in iDevices:
|
|
||||||
dev = iDevices[fd]
|
|
||||||
cap = dev.capabilities()
|
|
||||||
print('Name: ' + str(dev.name))
|
|
||||||
print('LEDs: ' + str(dev.leds()))
|
|
||||||
print('Has Keys: '+ str(evdev.events.EV_KEY in cap))
|
|
||||||
if evdev.events.EV_KEY in cap:
|
|
||||||
print('No. of keys: ' + str(len(cap[evdev.events.EV_KEY])))
|
|
||||||
print('has Key 116: ' + str(116 in cap[evdev.events.EV_KEY]))
|
|
||||||
print('Is Mouse: ' + str(((evdev.events.EV_REL in cap) or (evdev.events.EV_ABS in cap))))
|
|
||||||
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
|
|
||||||
print(dev.capabilities(verbose=True))
|
|
||||||
print('----------------------')
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
import dbus
|
|
||||||
try:
|
|
||||||
bus = dbus.SystemBus()
|
|
||||||
obj = bus.get_object('org.freedesktop.login1', '/org/freedesktop/login1')
|
|
||||||
inf = dbus.Interface(obj, 'org.freedesktop.login1.Manager')
|
|
||||||
ListSessions = inf.get_dbus_method('ListSessions')
|
|
||||||
sessions = ListSessions()
|
|
||||||
for session in sessions:
|
|
||||||
obj = bus.get_object('org.freedesktop.login1', session[4])
|
|
||||||
inf = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
|
|
||||||
sessionType = inf.Get('org.freedesktop.login1.Session', 'Type')
|
|
||||||
screen = str(inf.Get('org.freedesktop.login1.Session', 'VTNr'))
|
|
||||||
if screen == '':
|
|
||||||
screen = str(inf.Get('org.freedesktop.login1.Session', 'TTY'))
|
|
||||||
print('Session:', screen, 'Type:', sessionType.upper(), 'Details:', session)
|
|
||||||
else:
|
|
||||||
print('Session:', screen, 'Type:', sessionType.upper(), 'Details:', session)
|
|
||||||
except:
|
|
||||||
print('no access')
|
|
@ -1,52 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# HTTP + URL packages
|
|
||||||
import httplib2
|
|
||||||
from urllib.parse import urlencode, quote # For URL creation
|
|
||||||
import time
|
|
||||||
# To play wave files
|
|
||||||
import pygame
|
|
||||||
import math # For ceiling
|
|
||||||
|
|
||||||
|
|
||||||
# Mary server informations
|
|
||||||
mary_host = "127.0.0.1"
|
|
||||||
mary_port = "59125"
|
|
||||||
|
|
||||||
# Input text
|
|
||||||
input_text = "das ist ein test das ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testdas ist ein testd"
|
|
||||||
# Build the query
|
|
||||||
query_hash = {"INPUT_TEXT":input_text,
|
|
||||||
"INPUT_TYPE":"TEXT", # Input text
|
|
||||||
"LOCALE":"de",
|
|
||||||
"VOICE":"bits3", # Voice informations (need to be compatible)
|
|
||||||
"OUTPUT_TYPE":"AUDIO",
|
|
||||||
"AUDIO":"WAVE", # Audio informations (need both)
|
|
||||||
}
|
|
||||||
starttime = time.time()
|
|
||||||
query = urlencode(query_hash)
|
|
||||||
#print("query = \"http://%s:%s/process?%s\"" % (mary_host, mary_port, query))
|
|
||||||
|
|
||||||
# Run the query to mary http server
|
|
||||||
h_mary = httplib2.Http()
|
|
||||||
#print("http://%s:%s/process?" % (mary_host, mary_port), "POST", query)
|
|
||||||
resp, content = h_mary.request("http://%s:%s/process?" % (mary_host, mary_port), "POST", query)
|
|
||||||
|
|
||||||
# Decode the wav file or raise an exception if no wav files
|
|
||||||
if (resp["content-type"] == "audio/x-wav"):
|
|
||||||
# Write the wav file
|
|
||||||
f = open("/tmp/output_wav.wav", "wb")
|
|
||||||
f.write(content)
|
|
||||||
f.close()
|
|
||||||
# Play the wav file
|
|
||||||
pygame.mixer.init(frequency=16000) # Initialise the mixer
|
|
||||||
#s = pygame.mixer.Sound(content)
|
|
||||||
s = pygame.mixer.Sound("/tmp/output_wav.wav")
|
|
||||||
print(str(time.time() -starttime))
|
|
||||||
s.play()
|
|
||||||
print(str(time.time() -starttime))
|
|
||||||
pygame.time.wait(int(math.ceil(s.get_length() * 1000)))
|
|
||||||
|
|
||||||
else:
|
|
||||||
raise Exception(content)
|
|
@ -1,53 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
import os
|
|
||||||
import time
|
|
||||||
start = time.time()
|
|
||||||
pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
|
|
||||||
#pids = ['5960']
|
|
||||||
|
|
||||||
tty = os.open('/dev/tty2', os.O_RDWR)
|
|
||||||
fg = str(os.tcgetpgrp(tty))
|
|
||||||
tty.close()
|
|
||||||
print(fg)
|
|
||||||
for pid in pids:
|
|
||||||
try:
|
|
||||||
currStat = str(open('/proc/' + pid + '/stat', 'rb').read())
|
|
||||||
currStat = currStat.split(' ')
|
|
||||||
if int(currStat[4]) == 0:
|
|
||||||
continue
|
|
||||||
#print(currStat)
|
|
||||||
#print(fg,int(currStat[4]))
|
|
||||||
if fg == currStat[4]:
|
|
||||||
print(currStat[1])
|
|
||||||
#print( currStat )
|
|
||||||
#print(currStat[0])
|
|
||||||
major = os.major(int(currStat[6]))
|
|
||||||
minor = os.minor(int(currStat[6]))
|
|
||||||
ueventContent = open('/sys/dev/char/' + str(major) + ':' + str(minor) + '/uevent','r').read().split()
|
|
||||||
#print(ueventContent)
|
|
||||||
#print(int(currStat[4]),currStat[1])
|
|
||||||
except IOError: # proc has already terminated
|
|
||||||
continue
|
|
||||||
|
|
||||||
print(time.time()-start)
|
|
||||||
|
|
||||||
|
|
||||||
'''
|
|
||||||
Table 1-4: Contents of the stat files (as of 2.6.30-rc7)
|
|
||||||
..............................................................................
|
|
||||||
Field Content
|
|
||||||
pid process id
|
|
||||||
tcomm filename of the executable
|
|
||||||
state state (R is running, S is sleeping, D is sleeping in an
|
|
||||||
uninterruptible wait, Z is zombie, T is traced or stopped)
|
|
||||||
ppid process id of the parent process
|
|
||||||
pgrp pgrp of the process
|
|
||||||
sid session id
|
|
||||||
tty_nr tty the process uses
|
|
||||||
tty_pgrp pgrp of the tty
|
|
||||||
flags task flags
|
|
||||||
min_flt number of minor faults
|
|
||||||
cmin_flt number of minor faults with child's
|
|
||||||
maj_flt number of major faults
|
|
||||||
cmaj_flt number of major faults with child's
|
|
||||||
'''
|
|
@ -1,28 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
import evdev
|
|
||||||
from evdev import InputDevice
|
|
||||||
from select import select
|
|
||||||
import time
|
|
||||||
|
|
||||||
deviceList = evdev.list_devices()
|
|
||||||
readableDevices = []
|
|
||||||
for dev in deviceList:
|
|
||||||
try:
|
|
||||||
open(dev)
|
|
||||||
readableDevices.append(dev)
|
|
||||||
print('OK '+dev)
|
|
||||||
except Exception as e:
|
|
||||||
print('skip ' + dev + ' Error ' + str(e))
|
|
||||||
|
|
||||||
|
|
||||||
devices = map(evdev.InputDevice, (readableDevices))
|
|
||||||
devices = {dev.fd: dev for dev in devices}
|
|
||||||
|
|
||||||
while True:
|
|
||||||
r, w, x = select(devices, [], [])
|
|
||||||
if r != []:
|
|
||||||
for fd in r:
|
|
||||||
for event in devices[fd].read():
|
|
||||||
print('Devicename:'+ devices[fd].name + ' Devicepath:' + devices[fd].fn + ' Events:' + str(devices[fd].active_keys(verbose=True)) + ' Value:' + str(event.value))
|
|
||||||
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
#!/bin/python3
|
|
||||||
import termios
|
|
||||||
import fcntl
|
|
||||||
|
|
||||||
def injectTextToScreen(text):
|
|
||||||
useScreen = "/dev/tty5"
|
|
||||||
with open(useScreen, 'w') as fd:
|
|
||||||
for c in text:
|
|
||||||
fcntl.ioctl(fd, termios.TIOCSTI, c)
|
|
||||||
|
|
||||||
injectTextToScreen('this is a test that works')
|
|
@ -1,154 +0,0 @@
|
|||||||
#!/usr/bin/pdmenu
|
|
||||||
#
|
|
||||||
# Note that the above bang-path isn't required, but it lets you run this
|
|
||||||
# file directly as a sort of pdmenu script.
|
|
||||||
|
|
||||||
# F123 menu
|
|
||||||
|
|
||||||
title:Welcome to F123
|
|
||||||
|
|
||||||
# Define the main menu.
|
|
||||||
menu:main:F123 Main Menu:Please make a selection
|
|
||||||
show:_Games Menu..::games
|
|
||||||
show:_Internet menu..::internet
|
|
||||||
show:_Media menu..::media
|
|
||||||
show:_Office menu..::office
|
|
||||||
show:_System Configuration Menu..::configuration
|
|
||||||
show:_Tools Menu..::tools
|
|
||||||
nop
|
|
||||||
show:_Power Options..::power
|
|
||||||
nop
|
|
||||||
exit:_Exit
|
|
||||||
|
|
||||||
|
|
||||||
# Submenu for games.
|
|
||||||
menu:games:Games:Command line games
|
|
||||||
exec:_Adventure::clear;adventure
|
|
||||||
exec:_Arithmetic::clear;arithmetic
|
|
||||||
exec:_Air Traffic Controler (Not screen reader friendly)::clear;atc
|
|
||||||
exec:_Backgammon (Not screen reader friendly)::clear;backgammon
|
|
||||||
exec:_Battlestar::clear;battlestar
|
|
||||||
exec:_Boggle (Not screen reader friendly)::clear;boggle
|
|
||||||
exec:_Canfield (Not screen reader friendly)::clear;canfield
|
|
||||||
exec:_Cribbage (Not screen reader friendly)::clear;cribbage
|
|
||||||
exec:_Go Fish:pause:clear;go-fish
|
|
||||||
exec:_Gomoku::clear;gomoku
|
|
||||||
exec:_Hangman::clear;hangman
|
|
||||||
exec:_Hunt (Not screen reader friendly)::clear;hunt
|
|
||||||
exec:_Mille Bornes::clear;mille
|
|
||||||
exec:_Number::clear;number
|
|
||||||
exec:_Phantasia::clear;phantasia
|
|
||||||
exec:_Phase of the Moon:pause:clear;pom
|
|
||||||
exec:_Primes::clear;primes
|
|
||||||
exec:_Robots (Not screen reader friendly)::clear;robots
|
|
||||||
exec:_Sail::clear;sail
|
|
||||||
exec:_Snake (Not screen reader friendly)::clear;snake
|
|
||||||
exec:_Tetris (Not screen reader friendly)::clear;tetris-bsd
|
|
||||||
exec:_Trek::clear;trek
|
|
||||||
exec:_Worm (Not screen reader friendly)::clear;worm
|
|
||||||
exec:_Wumpus::clear;wump
|
|
||||||
|
|
||||||
nop
|
|
||||||
exit:_Main menu..
|
|
||||||
|
|
||||||
# submenu for internet applications.
|
|
||||||
menu:internet:Internet:Internet programs
|
|
||||||
exec:_E-Mail::clear;mutt
|
|
||||||
exec:_Basic Web Browser (W3M)::clear;w3m -v
|
|
||||||
group:Full _Web browser (Firefox)
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher firefox
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
group:_Mumble Voice Chat
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher mumble
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
nop
|
|
||||||
exit:_Main menu..
|
|
||||||
|
|
||||||
menu:media:Media:Multi-media applications
|
|
||||||
exec:_CD Audio Ripper (ripit)::ripit
|
|
||||||
exec:_Music Player (cmus)::cmus
|
|
||||||
exec:_Youtube (audio only)::youtube-viewer -novideo
|
|
||||||
group:Youtube (full _video)
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher lxterminal -e youtube-viewer
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
nop
|
|
||||||
exit:_Main menu..
|
|
||||||
|
|
||||||
menu:office:Office:Word processing, calendar, etc
|
|
||||||
exec:_Month Calendar:pause:clear;ncal
|
|
||||||
exec:_Year Calendar:pause:clear;ncal -y
|
|
||||||
exec:Text Editor::clear;${EDITOR:-nano}
|
|
||||||
nop:Office Suite
|
|
||||||
group:Database
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher lobase
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
group:Diagrams
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher lodraw
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
group:Formula Editor
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher lomath
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
group:Presentation
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher loimpress
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
group:Spreadsheet
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher localc
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
group:Word Processor
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher lowriter
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
nop
|
|
||||||
exit:_Main menu..
|
|
||||||
|
|
||||||
# submenu for configuring the computer.
|
|
||||||
menu:configuration:Configuration:System Configuration
|
|
||||||
exec:_Change Passwords::clear;/usr/lib/F123-wrappers/configure-passwords
|
|
||||||
exec:_Email Configuration::clear;fleacollar
|
|
||||||
exec:_Security Configuration::clear;/usr/lib/F123-wrappers/configure-security
|
|
||||||
exec:_Wireless Internet Connection::clear;sudo configure-wifi
|
|
||||||
nop
|
|
||||||
exit:_Main menu..
|
|
||||||
|
|
||||||
menu:tools:Tools:System Tools
|
|
||||||
group:Bluetooth manager
|
|
||||||
exec:::clear
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-ignore-screen
|
|
||||||
exec:::startx /usr/lib/F123-wrappers/xlauncher blueman-assistant
|
|
||||||
exec:::python /usr/share/fenrirscreenreader/tools/fenrir-unignore-screen
|
|
||||||
endgroup
|
|
||||||
exec:_Search:edit,pause:recoll -t ~Search for what? :~
|
|
||||||
nop
|
|
||||||
exit:_Main menu..
|
|
||||||
|
|
||||||
menu:power:Shutdown or Restart Your Computer:Shutdown or restart your computer
|
|
||||||
exec:_Power Off::poweroff
|
|
||||||
exec:_Restart::reboot
|
|
||||||
nop
|
|
||||||
exit:_Main menu..
|
|
@ -1,41 +0,0 @@
|
|||||||
#!/bin/python3
|
|
||||||
import sys, os
|
|
||||||
import pty
|
|
||||||
import pyte
|
|
||||||
|
|
||||||
class FenrirTermStream(pyte.Stream):
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
def attach(self, screen):
|
|
||||||
super().attach(screen)
|
|
||||||
def feed(self, text):
|
|
||||||
super().feed(text)
|
|
||||||
|
|
||||||
class FenrirTermEmu():
|
|
||||||
def __init__(self):
|
|
||||||
self.shell = '/bin/bash'
|
|
||||||
if 'SHELL' in os.environ:
|
|
||||||
self.shell = os.environ['SHELL']
|
|
||||||
self.screen = pyte.Screen(80,24)
|
|
||||||
self.stream = FenrirTermStream()
|
|
||||||
self.stream.attach(self.screen)
|
|
||||||
def outputCallback(self, fd):
|
|
||||||
data = os.read(fd, 1024)
|
|
||||||
self.stream.feed(data.decode('UTF8'))
|
|
||||||
# alles
|
|
||||||
#print(self.screen.display)
|
|
||||||
# input
|
|
||||||
#print(data.decode('UTF8'))
|
|
||||||
return data
|
|
||||||
def inputCallback(self, fd):
|
|
||||||
data = os.read(fd, 1024)
|
|
||||||
print('|'+str(data)+'|')
|
|
||||||
if data == b'q':
|
|
||||||
print('quit')
|
|
||||||
return b'exit\r'
|
|
||||||
return data
|
|
||||||
def startEmulator(self):
|
|
||||||
pty.spawn(self.shell, self.outputCallback, self.inputCallback)
|
|
||||||
|
|
||||||
t = FenrirTermEmu()
|
|
||||||
t.startEmulator()
|
|
@ -1,34 +0,0 @@
|
|||||||
#!/bin/python3
|
|
||||||
import sys, os
|
|
||||||
import pty
|
|
||||||
import pyte
|
|
||||||
|
|
||||||
class FenrirTermStream(pyte.Stream):
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
def attach(self, screen):
|
|
||||||
super().attach(screen)
|
|
||||||
def feed(self, text):
|
|
||||||
super().feed(text)
|
|
||||||
|
|
||||||
class FenrirTermEmu():
|
|
||||||
def __init__(self):
|
|
||||||
self.shell = '/bin/bash'
|
|
||||||
if 'SHELL' in os.environ:
|
|
||||||
self.shell = os.environ['SHELL']
|
|
||||||
self.screen = pyte.Screen(80,24)
|
|
||||||
self.stream = FenrirTermStream()
|
|
||||||
self.stream.attach(self.screen)
|
|
||||||
def outputCallback(self, fd):
|
|
||||||
data = os.read(fd, 1024)
|
|
||||||
self.stream.feed(data.decode('UTF8'))
|
|
||||||
# alles
|
|
||||||
print(self.screen.display)
|
|
||||||
# input
|
|
||||||
print(data.decode('UTF8'))
|
|
||||||
return data
|
|
||||||
def inputCallback(self, fd):
|
|
||||||
data = os.read(fd, 1024)
|
|
||||||
return data
|
|
||||||
def startEmulator(self):
|
|
||||||
pty.spawn(self.shell, self.outputCallback, self.inputCallback)
|
|
@ -1,34 +0,0 @@
|
|||||||
./play zone/wrapWord.py:21: wrappedLines = currText.split('\n')
|
|
||||||
./play zone/wrapWord.py:50: wrappedLines = currText.split('\n')
|
|
||||||
./play zone/wrapWord.py:93: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/screenDriver/vcsaDriver.py:281: apps = subprocess.Popen('ps -t tty' + currScreen + ' -o comm,tty,stat', shell=True, stdout=subprocess.PIPE).stdout.read().decode()[:-1].split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/line_utils.py:14: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/line_utils.py:30: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/line_utils.py:41: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:14: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:35: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:43: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:58: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:73: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:85: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/mark_utils.py:13: inText = inText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/mark_utils.py:59: inText = inText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/word_utils.py:20: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/word_utils.py:62: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/word_utils.py:91: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/core/outputManager.py:173: currline = text.split('\n')[offset['y']]
|
|
||||||
./src/fenrirscreenreader/core/attributeManager.py:250: textLines = text.split('\n')
|
|
||||||
./src/fenrirscreenreader/core/screenManager.py:166: diffList = ['+ ' + self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']] +'\n']
|
|
||||||
./src/fenrirscreenreader/core/screenManager.py:169: diff = self.differ.compare(oldScreenText.split('\n'),\
|
|
||||||
./src/fenrirscreenreader/core/screenManager.py:170: newScreenText.split('\n'))
|
|
||||||
./src/fenrirscreenreader/core/screenManager.py:225: windowList = text.split('\n')
|
|
||||||
./src/fenrirscreenreader/commands/onCursorChange/62000-spell_check.py:66: newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onCursorChange/60000-word_echo_type.py:39: newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onCursorChange/50000-present_char_if_cursor_change_horizontal.py:41: newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onCursorChange/61000-word_echo_navigation.py:37: newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/commands/spell_check.py:47: newContent = self.env['screen']['newContentText'].split('\n')[cursorPos['y']]
|
|
||||||
./src/fenrirscreenreader/commands/commands/remove_word_from_spell_check.py:45: newContent = self.env['screen']['newContentText'].split('\n')[cursorPos['y']]
|
|
||||||
./src/fenrirscreenreader/commands/commands/add_word_to_spell_check.py:43: newContent = self.env['screen']['newContentText'].split('\n')[cursorPos['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onScreenUpdate/60000-history.py:38: prevLine = self.env['screen']['oldContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onScreenUpdate/60000-history.py:39: currLine = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./TODO v2.0:72: w.fill(i).split('\n')
|
|
@ -1,34 +0,0 @@
|
|||||||
./play zone/wrapWord.py:21: wrappedLines = currText.split('\n')
|
|
||||||
./play zone/wrapWord.py:50: wrappedLines = currText.split('\n')
|
|
||||||
./play zone/wrapWord.py:93: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/screenDriver/vcsaDriver.py:281: apps = subprocess.Popen('ps -t tty' + currScreen + ' -o comm,tty,stat', shell=True, stdout=subprocess.PIPE).stdout.read().decode()[:-1].split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/line_utils.py:14: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/line_utils.py:30: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/line_utils.py:41: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:14: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:35: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:43: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:58: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:73: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/char_utils.py:85: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/mark_utils.py:13: inText = inText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/mark_utils.py:59: inText = inText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/word_utils.py:20: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/word_utils.py:62: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/utils/word_utils.py:91: wrappedLines = currText.split('\n')
|
|
||||||
./src/fenrirscreenreader/core/outputManager.py:173: currline = text.split('\n')[offset['y']]
|
|
||||||
./src/fenrirscreenreader/core/attributeManager.py:250: textLines = text.split('\n')
|
|
||||||
./src/fenrirscreenreader/core/screenManager.py:166: diffList = ['+ ' + self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']] +'\n']
|
|
||||||
./src/fenrirscreenreader/core/screenManager.py:169: diff = self.differ.compare(oldScreenText.split('\n'),\
|
|
||||||
./src/fenrirscreenreader/core/screenManager.py:170: newScreenText.split('\n'))
|
|
||||||
./src/fenrirscreenreader/core/screenManager.py:225: windowList = text.split('\n')
|
|
||||||
./src/fenrirscreenreader/commands/onCursorChange/62000-spell_check.py:66: newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onCursorChange/60000-word_echo_type.py:39: newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onCursorChange/50000-present_char_if_cursor_change_horizontal.py:41: newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onCursorChange/61000-word_echo_navigation.py:37: newContent = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/commands/spell_check.py:47: newContent = self.env['screen']['newContentText'].split('\n')[cursorPos['y']]
|
|
||||||
./src/fenrirscreenreader/commands/commands/remove_word_from_spell_check.py:45: newContent = self.env['screen']['newContentText'].split('\n')[cursorPos['y']]
|
|
||||||
./src/fenrirscreenreader/commands/commands/add_word_to_spell_check.py:43: newContent = self.env['screen']['newContentText'].split('\n')[cursorPos['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onScreenUpdate/60000-history.py:38: prevLine = self.env['screen']['oldContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./src/fenrirscreenreader/commands/onScreenUpdate/60000-history.py:39: currLine = self.env['screen']['newContentText'].split('\n')[self.env['screen']['newCursor']['y']]
|
|
||||||
./TODO v2.0:72: w.fill(i).split('\n')
|
|
@ -1,35 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# clilauncher.sh
|
|
||||||
# Description: Launches xterm with give application and fenrir.
|
|
||||||
#
|
|
||||||
# Copyright 2019, F123 Consulting, <information@f123.org>
|
|
||||||
# Copyright 2019, Storm Dragon, <storm_dragon@linux-a11y.org>
|
|
||||||
#
|
|
||||||
# This is free software; you can redistribute it and/or modify it under the
|
|
||||||
# terms of the GNU General Public License as published by the Free
|
|
||||||
# Software Foundation; either version 3, or (at your option) any later
|
|
||||||
# version.
|
|
||||||
#
|
|
||||||
# This software 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
|
|
||||||
# General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this package; see the file COPYING. If not, write to the Free
|
|
||||||
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
||||||
# 02110-1301, USA.
|
|
||||||
#
|
|
||||||
#--code--
|
|
||||||
|
|
||||||
rm -rf /tmp/fenrir*
|
|
||||||
|
|
||||||
for i in /tmp/fenrirscreenreader-*.sock ; do
|
|
||||||
if [[ "$i" != "/tmp/fenrirscreenreader-deamon.sock" ]]; then
|
|
||||||
echo -n "setting set screen#suspendingScreen=pty" | socat - UNIX-CLIENT:$i
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
/usr/bin/urxvt -e ../src/fenrir -s ./xterm.conf -o "general.shell=./waitForKey1;remote#socketFile=/tmp/fenrirscreenreader-waitForKey1.sock"
|
|
||||||
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# clilauncher.sh
|
|
||||||
# Description: Launches xterm with give application and fenrir.
|
|
||||||
#
|
|
||||||
# Copyright 2019, F123 Consulting, <information@f123.org>
|
|
||||||
# Copyright 2019, Storm Dragon, <storm_dragon@linux-a11y.org>
|
|
||||||
#
|
|
||||||
# This is free software; you can redistribute it and/or modify it under the
|
|
||||||
# terms of the GNU General Public License as published by the Free
|
|
||||||
# Software Foundation; either version 3, or (at your option) any later
|
|
||||||
# version.
|
|
||||||
#
|
|
||||||
# This software 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
|
|
||||||
# General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this package; see the file COPYING. If not, write to the Free
|
|
||||||
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
||||||
# 02110-1301, USA.
|
|
||||||
#
|
|
||||||
#--code--
|
|
||||||
|
|
||||||
for i in /tmp/fenrirscreenreader-*.sock ; do
|
|
||||||
if [[ "$i" != "/tmp/fenrirscreenreader-deamon.sock" ]]; then
|
|
||||||
echo -n "setting set screen#suspendingScreen=pty" | socat - UNIX-CLIENT:$i
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
/usr/bin/urxvt -e ../src/fenrir -d -s ./xterm.conf -o "general.shell=./waitForKey2;remote#socketFile=/tmp/fenrirscreenreader-waitForKey2.sock"
|
|
||||||
|
|
||||||
|
|
@ -1,119 +0,0 @@
|
|||||||
import os
|
|
||||||
import struct
|
|
||||||
import sys
|
|
||||||
import pty
|
|
||||||
import tty
|
|
||||||
import termios
|
|
||||||
import shlex
|
|
||||||
import signal
|
|
||||||
import select
|
|
||||||
import pyte
|
|
||||||
import time
|
|
||||||
|
|
||||||
class Terminal:
|
|
||||||
def __init__(self, columns, lines, p_in):
|
|
||||||
self.screen = pyte.HistoryScreen(columns, lines)
|
|
||||||
self.screen.set_mode(pyte.modes.LNM)
|
|
||||||
self.screen.write_process_input = \
|
|
||||||
lambda data: p_in.write(data.encode())
|
|
||||||
self.stream = pyte.ByteStream()
|
|
||||||
self.stream.attach(self.screen)
|
|
||||||
def feed(self, data):
|
|
||||||
self.stream.feed(data)
|
|
||||||
def dump(self):
|
|
||||||
cursor = self.screen.cursor
|
|
||||||
lines = []
|
|
||||||
for y in self.screen.dirty:
|
|
||||||
line = self.screen.buffer[y]
|
|
||||||
data = [(char.data, char.reverse, char.fg, char.bg)
|
|
||||||
for char in (line[x] for x in range(self.screen.columns))]
|
|
||||||
lines.append((y, data))
|
|
||||||
self.screen.dirty.clear()
|
|
||||||
return {"c": (cursor.x, cursor.y), "lines": lines}
|
|
||||||
|
|
||||||
|
|
||||||
def open_terminal(command="bash", columns=80, lines=24):
|
|
||||||
p_pid, master_fd = pty.fork()
|
|
||||||
if p_pid == 0: # Child.
|
|
||||||
argv = shlex.split(command)
|
|
||||||
env = os.environ.copy()
|
|
||||||
env["TERM"] = 'vt100'
|
|
||||||
os.execvpe(argv[0], argv, env)
|
|
||||||
# File-like object for I/O with the child process aka command.
|
|
||||||
p_out = os.fdopen(master_fd, "w+b", 0)
|
|
||||||
return Terminal(columns, lines, p_out), p_pid, p_out
|
|
||||||
|
|
||||||
def HandleTerminal():
|
|
||||||
debug = False
|
|
||||||
running = True
|
|
||||||
try:
|
|
||||||
old_attr = termios.tcgetattr(sys.stdin)
|
|
||||||
tty.setraw(0)
|
|
||||||
terminal, p_pid, p_out = open_terminal()
|
|
||||||
std_out = os.fdopen(sys.stdout.fileno(), "w+b", 0)
|
|
||||||
while running:
|
|
||||||
r, w, x = select.select([sys.stdin, p_out],[],[])
|
|
||||||
if r == []:
|
|
||||||
continue
|
|
||||||
if p_out in r:
|
|
||||||
if debug:
|
|
||||||
print('pre p_out')
|
|
||||||
try:
|
|
||||||
msgBytes = read_all(p_out.fileno())
|
|
||||||
except (EOFError, OSError):
|
|
||||||
running = False
|
|
||||||
break
|
|
||||||
terminal.feed(msgBytes)
|
|
||||||
os.write(sys.stdout.fileno(), msgBytes)
|
|
||||||
if debug:
|
|
||||||
print('after p_out')
|
|
||||||
if sys.stdin in r:
|
|
||||||
if debug:
|
|
||||||
print('pre stdin')
|
|
||||||
try:
|
|
||||||
msgBytes = read_all(sys.stdin.fileno())
|
|
||||||
except (EOFError, OSError):
|
|
||||||
running = False
|
|
||||||
break
|
|
||||||
terminal.feed(msgBytes)
|
|
||||||
os.write(p_out.fileno(), msgBytes)
|
|
||||||
if debug:
|
|
||||||
print('after stdin')
|
|
||||||
except Exception as e: # Process died?
|
|
||||||
print(e)
|
|
||||||
running = False
|
|
||||||
finally:
|
|
||||||
os.kill(p_pid, signal.SIGTERM)
|
|
||||||
p_out.close()
|
|
||||||
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_attr)
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
def get_terminal_size(fd):
|
|
||||||
s = struct.pack('HHHH', 0, 0, 0, 0)
|
|
||||||
rows, cols, _, _ = struct.unpack('HHHH', fcntl.ioctl(fd, termios.TIOCGWINSZ, s))
|
|
||||||
return rows, cols
|
|
||||||
|
|
||||||
def resize_terminal(fd):
|
|
||||||
s = struct.pack('HHHH', 0, 0, 0, 0)
|
|
||||||
s = fcntl.ioctl(0, termios.TIOCGWINSZ, s)
|
|
||||||
fcntl.ioctl(fd, termios.TIOCSWINSZ, s)
|
|
||||||
rows, cols, _, _ = struct.unpack('hhhh', s)
|
|
||||||
return rows, cols
|
|
||||||
|
|
||||||
def read_all(fd):
|
|
||||||
bytes = os.read(fd, 65536)
|
|
||||||
if bytes == b'':
|
|
||||||
raise EOFError
|
|
||||||
while has_more(fd):
|
|
||||||
data = os.read(fd, 65536)
|
|
||||||
if data == b'':
|
|
||||||
raise EOFError
|
|
||||||
bytes += data
|
|
||||||
return bytes
|
|
||||||
|
|
||||||
def has_more(fd):
|
|
||||||
r, w, e = select.select([fd], [], [], 0)
|
|
||||||
return (fd in r)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
HandleTerminal()
|
|
@ -1,92 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
|
|
||||||
from cairo import *
|
|
||||||
from fcntl import ioctl
|
|
||||||
from array import array
|
|
||||||
import struct
|
|
||||||
import errno
|
|
||||||
import sys
|
|
||||||
|
|
||||||
GIO_UNIMAP = 0x4B66
|
|
||||||
VT_GETHIFONTMASK = 0x560D
|
|
||||||
|
|
||||||
if len(sys.argv) != 3:
|
|
||||||
print "Usage: %s <tty-number> <output-png>" % sys.argv[0]
|
|
||||||
exit()
|
|
||||||
|
|
||||||
ttyno = int(sys.argv[1])
|
|
||||||
png = sys.argv[2]
|
|
||||||
|
|
||||||
tty = open('/dev/tty%d' % ttyno, 'rb')
|
|
||||||
himask = array("H", (0,))
|
|
||||||
ioctl(tty, VT_GETHIFONTMASK, himask)
|
|
||||||
hichar, = struct.unpack_from("@H", himask)
|
|
||||||
|
|
||||||
sz = 512
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
unipairs = array("H", [0]*(2*sz))
|
|
||||||
unimapdesc = array("B", struct.pack("@HP", sz, unipairs.buffer_info()[0]))
|
|
||||||
ioctl(tty.fileno(), GIO_UNIMAP, unimapdesc)
|
|
||||||
break
|
|
||||||
except IOError as e:
|
|
||||||
if e.errno != errno.ENOMEM:
|
|
||||||
raise
|
|
||||||
sz *= 2
|
|
||||||
tty.close()
|
|
||||||
|
|
||||||
ncodes, = struct.unpack_from("@H", unimapdesc)
|
|
||||||
utable = struct.unpack_from("@%dH" % (2*ncodes), unipairs)
|
|
||||||
|
|
||||||
charmap = {}
|
|
||||||
for u, b in zip(utable[::2], utable[1::2]):
|
|
||||||
if charmap.get(b) is None:
|
|
||||||
charmap[b] = unichr(u)
|
|
||||||
|
|
||||||
vcs = open('/dev/vcsa%d' % ttyno, 'rb')
|
|
||||||
|
|
||||||
head = vcs.read(4)
|
|
||||||
rows = ord(head[0])
|
|
||||||
cols = ord(head[1])
|
|
||||||
caretX = ord(head[2])
|
|
||||||
caretY = ord(head[3])
|
|
||||||
|
|
||||||
surf = ImageSurface(FORMAT_RGB24, cols * 8, rows * 16)
|
|
||||||
|
|
||||||
cr = Context(surf)
|
|
||||||
cr.set_source_rgb(1,1,1)
|
|
||||||
cr.set_font_face(ToyFontFace("Mono", FONT_SLANT_NORMAL, FONT_WEIGHT_NORMAL));
|
|
||||||
m = Matrix()
|
|
||||||
m.scale(10.0, 12.0)
|
|
||||||
cr.set_font_matrix(m)
|
|
||||||
|
|
||||||
def CairoColor(b, a):
|
|
||||||
return (b if a & 4 else 0, b if a & 2 else 0, b if a & 1 else 0)
|
|
||||||
|
|
||||||
for y in range(rows):
|
|
||||||
for x in range(cols):
|
|
||||||
data = vcs.read(2)
|
|
||||||
(sh,) = struct.unpack("=H", data)
|
|
||||||
attr = (sh >> 8) & 0xFF
|
|
||||||
ch = sh & 0xFF
|
|
||||||
if hichar == 0x100:
|
|
||||||
attr >>= 1
|
|
||||||
|
|
||||||
ink = attr & 0x0F
|
|
||||||
paper = (attr>>4) & 0x0F
|
|
||||||
b = 1.0 if attr & 0x80 else 0.75
|
|
||||||
if sh & hichar:
|
|
||||||
ch |= 0x100
|
|
||||||
|
|
||||||
cr.set_source_rgb(*CairoColor(b, paper))
|
|
||||||
cr.rectangle(x*8, y*16, 8, 16)
|
|
||||||
cr.fill()
|
|
||||||
|
|
||||||
cr.set_source_rgb(*CairoColor(b, ink))
|
|
||||||
cr.move_to(x*8, 12 + y*16)
|
|
||||||
cr.show_text(charmap.get(ch, u'?'))
|
|
||||||
cr.stroke()
|
|
||||||
vcs.close()
|
|
||||||
|
|
||||||
surf.write_to_png(png)
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo "1"
|
|
||||||
echo "Press 'q' to exit"
|
|
||||||
count=0
|
|
||||||
while : ; do
|
|
||||||
read -n 1 k <&1
|
|
||||||
if [[ $k = q ]] ; then
|
|
||||||
printf "\nQuitting from the program\n"
|
|
||||||
break
|
|
||||||
else
|
|
||||||
((count=$count+1))
|
|
||||||
echo "Press 'q' to exit"
|
|
||||||
fi
|
|
||||||
done
|
|
@ -1,14 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
echo "2"
|
|
||||||
echo "Press 'q' to exit"
|
|
||||||
count=0
|
|
||||||
while : ; do
|
|
||||||
read -n 1 k <&1
|
|
||||||
if [[ $k = q ]] ; then
|
|
||||||
printf "\nQuitting from the program\n"
|
|
||||||
break
|
|
||||||
else
|
|
||||||
((count=$count+1))
|
|
||||||
echo "Press 'q' to exit"
|
|
||||||
fi
|
|
||||||
done
|
|
@ -1,142 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# Fenrir TTY screen reader
|
|
||||||
# By Chrys, Storm Dragon, and contributers.
|
|
||||||
|
|
||||||
#from fenrirscreenreader.core import debug
|
|
||||||
import string
|
|
||||||
# X Y Word END BREAK
|
|
||||||
# -1, -1, '', True False
|
|
||||||
def getPrevWord(currX,currY, currText):
|
|
||||||
lineBreak = False
|
|
||||||
endOfScreen = False
|
|
||||||
if currText == '':
|
|
||||||
return -1, -1, '', endOfScreen, lineBreak
|
|
||||||
if currText.strip( string.whitespace) == '':
|
|
||||||
return currX, currY, '', endOfScreen, lineBreak
|
|
||||||
x, y, currWord, endOfScreen, lineBreakCurrWord = getCurrentWord(currX,currY,currText)
|
|
||||||
if endOfScreen:
|
|
||||||
return x, y, currWord, endOfScreen, lineBreak
|
|
||||||
wrappedLines = currText.split('\n')
|
|
||||||
currLine = wrappedLines[y]
|
|
||||||
if x - 1 < 0:
|
|
||||||
if y - 1 < 0:
|
|
||||||
lineBreak = False
|
|
||||||
endOfScreen = True
|
|
||||||
return currX, currY, '', endOfScreen, lineBreak
|
|
||||||
else:
|
|
||||||
y -= 1
|
|
||||||
currLine = wrappedLines[y]
|
|
||||||
x = len( wrappedLines[y]) - 1
|
|
||||||
lineBreak = True
|
|
||||||
else:
|
|
||||||
x -= 1
|
|
||||||
lineBreakCurrWord = lineBreak or lineBreakCurrWord
|
|
||||||
x, y, currWord, endOfScreen, lineBreak = getCurrentWord(x,y,currText)
|
|
||||||
lineBreak = lineBreak or lineBreakCurrWord
|
|
||||||
return x, y, currWord, endOfScreen, lineBreak
|
|
||||||
|
|
||||||
def getCurrentWord(currX,currY, currText):
|
|
||||||
lineBreak = False
|
|
||||||
endOfScreen = False
|
|
||||||
if currText == '':
|
|
||||||
return -1, -1, '', endOfScreen, lineBreak
|
|
||||||
if currText.strip( string.whitespace) == '':
|
|
||||||
return currX, currY, '', endOfScreen, lineBreak
|
|
||||||
x = currX
|
|
||||||
y = currY
|
|
||||||
currWord = ''
|
|
||||||
wrappedLines = currText.split('\n')
|
|
||||||
currLine = wrappedLines[y]
|
|
||||||
Found = False
|
|
||||||
while(not Found):
|
|
||||||
if not currLine[x] in string.whitespace:
|
|
||||||
if x == 0:
|
|
||||||
Found = True
|
|
||||||
else:
|
|
||||||
if currLine[x - 1] in string.whitespace:
|
|
||||||
Found = True
|
|
||||||
if not Found:
|
|
||||||
if x - 1 < 0:
|
|
||||||
if y - 1 < 0:
|
|
||||||
lineBreak = False
|
|
||||||
endOfScreen = True
|
|
||||||
return currX, currY, '', endOfScreen, lineBreak
|
|
||||||
else:
|
|
||||||
y -= 1
|
|
||||||
currLine = wrappedLines[y]
|
|
||||||
x = len( wrappedLines[y]) - 1
|
|
||||||
lineBreak = True
|
|
||||||
else:
|
|
||||||
x -= 1
|
|
||||||
if Found:
|
|
||||||
currWord = currLine[x:]
|
|
||||||
for d in string.whitespace:
|
|
||||||
delimiterPos = currWord.find(d)
|
|
||||||
if delimiterPos != -1:
|
|
||||||
currWord = currWord[:delimiterPos]
|
|
||||||
|
|
||||||
return x, y, currWord, endOfScreen, lineBreak
|
|
||||||
return currX, currY, '', False, False
|
|
||||||
|
|
||||||
def getNextWord(currX,currY, currText):
|
|
||||||
lineBreak = False
|
|
||||||
endOfScreen = False
|
|
||||||
if currText == '':
|
|
||||||
return -1, -1, '', endOfScreen, lineBreak
|
|
||||||
if currText.strip( string.whitespace) == '':
|
|
||||||
return currX, currY, '', endOfScreen, lineBreak
|
|
||||||
x = currX
|
|
||||||
y = currY
|
|
||||||
currWord = ''
|
|
||||||
wrappedLines = currText.split('\n')
|
|
||||||
currLine = wrappedLines[y]
|
|
||||||
Found = False
|
|
||||||
while(not Found):
|
|
||||||
if not Found:
|
|
||||||
if x + 1 > len( currLine ) - 1:
|
|
||||||
if y + 1 > len( wrappedLines ) - 1:
|
|
||||||
lineBreak = False
|
|
||||||
endOfScreen = True
|
|
||||||
return currX, currY, '', endOfScreen, lineBreak
|
|
||||||
else:
|
|
||||||
y += 1
|
|
||||||
currLine = wrappedLines[y]
|
|
||||||
x = 0
|
|
||||||
lineBreak = True
|
|
||||||
else:
|
|
||||||
x += 1
|
|
||||||
if not currLine[x] in string.whitespace:
|
|
||||||
if x == 0:
|
|
||||||
Found = True
|
|
||||||
else:
|
|
||||||
if currLine[x - 1] in string.whitespace:
|
|
||||||
Found = True
|
|
||||||
if Found:
|
|
||||||
currWord = currLine[x:]
|
|
||||||
for d in string.whitespace:
|
|
||||||
delimiterPos = currWord.find(d)
|
|
||||||
if delimiterPos != -1:
|
|
||||||
currWord = currWord[:delimiterPos]
|
|
||||||
return x, y, currWord, endOfScreen, lineBreak
|
|
||||||
return currX, currY, '', False, False
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
data = """das ist ein test lol
|
|
||||||
das ist ein test l
|
|
||||||
das ist ein test
|
|
||||||
|
|
||||||
asdf asdf a
|
|
||||||
test test
|
|
||||||
te test"""
|
|
||||||
print('__DATA START__')
|
|
||||||
print(data)
|
|
||||||
print('__DATA END__\n\n')
|
|
||||||
|
|
||||||
x = 3
|
|
||||||
y = 0
|
|
||||||
x, y, currWord, endOfScreen, lineBreak = getCurrentWord(x,y,data)
|
|
||||||
print(x,y,currWord)
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
|||||||
#!/bin/python
|
|
||||||
|
|
||||||
import brlapi
|
|
||||||
import time
|
|
||||||
|
|
||||||
brl = brlapi.Connection()
|
|
||||||
brl.enterTtyModeWithPath()
|
|
||||||
print('display size' + str(brl.displaySize))
|
|
||||||
print('driver name'+str(brl.driverName))
|
|
||||||
|
|
||||||
t = time.time()
|
|
||||||
#while(time.time() - t <= 5):
|
|
||||||
try:
|
|
||||||
brl.writeText( 'this is a 5 second test')
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
time.sleep(5)
|
|
||||||
brl.leaveTtyMode()
|
|
||||||
|
|
@ -1,193 +0,0 @@
|
|||||||
[sound]
|
|
||||||
enabled=True
|
|
||||||
driver=genericDriver
|
|
||||||
theme=default
|
|
||||||
volume=1.0
|
|
||||||
# shell commands for generic sound driver
|
|
||||||
genericPlayFileCommand=play -q -v fenrirVolume fenrirSoundFile
|
|
||||||
genericFrequencyCommand=play -q -v fenrirVolume -n -c1 synth fenrirDuration sine fenrirFrequence
|
|
||||||
|
|
||||||
[speech]
|
|
||||||
enabled=True
|
|
||||||
driver=speechdDriver
|
|
||||||
#driver=genericDriver
|
|
||||||
serverPath=
|
|
||||||
rate=0.85
|
|
||||||
pitch=0.5
|
|
||||||
# Pitch for capital letters
|
|
||||||
capitalPitch=0.9
|
|
||||||
#module=espeak
|
|
||||||
voice=bdl
|
|
||||||
#language=en
|
|
||||||
volume=1.0
|
|
||||||
autoReadIncoming=True
|
|
||||||
|
|
||||||
# genericSpeechCommand is the command that is executed for talking
|
|
||||||
# the following variables are replaced with values
|
|
||||||
# fenrirText = is the text that should be spoken
|
|
||||||
# fenrirModule = may be the speech module like used in speech-dispatcher, not every TTY need this
|
|
||||||
# fenrirLanguage = the language
|
|
||||||
# fenrirVoice = is the current voice that should be used
|
|
||||||
# the current volume, pitch and rate is calculated like this
|
|
||||||
# value = min + settingValue * (min - max )
|
|
||||||
# fenrirVolume = is replaced with the current volume
|
|
||||||
# fenrirPitch = is replaced with the current pitch
|
|
||||||
# fenrirRate = is replaced with the current speed (speech rate)
|
|
||||||
genericSpeechCommand=espeak -a fenrirVolume -s fenrirRate -p fenrirPitch -v fenrirVoice -- "fenrirText"
|
|
||||||
|
|
||||||
# these are the min and max values of the TTS system that is used in genericSpeechCommand
|
|
||||||
fenrirMinVolume=0
|
|
||||||
fenrirMaxVolume=200
|
|
||||||
fenrirMinPitch=0
|
|
||||||
fenrirMaxPitch=99
|
|
||||||
fenrirMinRate=80
|
|
||||||
fenrirMaxRate=890
|
|
||||||
|
|
||||||
[braille]
|
|
||||||
enabled=True
|
|
||||||
driver=dummyDriver
|
|
||||||
#layout=en
|
|
||||||
# to what should the flush timeout relate to
|
|
||||||
# word = flush after (number of words to display) * seconds
|
|
||||||
# char = flush after (number of chars to display) * seconds
|
|
||||||
# fix = flush after X seconds
|
|
||||||
# none = no automatic flush (manual via shortcut)
|
|
||||||
flushMode=word
|
|
||||||
# seconds to flush or
|
|
||||||
# -1 = no automatic flush (manual via shortcut)
|
|
||||||
flushTimeout=3
|
|
||||||
# how should the cursor be focused?
|
|
||||||
# page = if cursor cross the border move to next page and start at beginn
|
|
||||||
# fixCell = ajust the cursor on an special cell where it is always placed. the display scroll here more smooth.
|
|
||||||
cursorFocusMode=page
|
|
||||||
# define the cell on the Braille device where fenrir should scroll and keep the cursor
|
|
||||||
# 0 = first cell on device
|
|
||||||
# -1 = last cell on device
|
|
||||||
# >0 = fix cell number
|
|
||||||
fixCursorOnCell=-1
|
|
||||||
#How should the braille follow the focus
|
|
||||||
# none = no automatic toggle command used
|
|
||||||
# review = priority to review
|
|
||||||
# last = follow last used cursor
|
|
||||||
cursorFollowMode=last
|
|
||||||
# number of cells in panning (horizontal)
|
|
||||||
# 0 = display size, >0 number of cells
|
|
||||||
panSizeHorizontal=0
|
|
||||||
|
|
||||||
[screen]
|
|
||||||
driver=ptyDriver
|
|
||||||
encoding=auto
|
|
||||||
screenUpdateDelay=0.05
|
|
||||||
suspendingScreen=1
|
|
||||||
autodetectSuspendingScreen=False
|
|
||||||
|
|
||||||
[keyboard]
|
|
||||||
driver=evdevDriver
|
|
||||||
# filter input devices NOMICE, ALL or a DEVICE NAME
|
|
||||||
device=ALL
|
|
||||||
grabDevices=True
|
|
||||||
ignoreShortcuts=False
|
|
||||||
keyboardLayout=desktop
|
|
||||||
charEcho=False
|
|
||||||
charDeleteEcho=True
|
|
||||||
wordEcho=False
|
|
||||||
interruptOnKeyPress=True
|
|
||||||
# you can filter the keys on that the speech should interrupt (empty = all keys, otherwhise the given keys)
|
|
||||||
interruptOnKeyPressFilter=
|
|
||||||
# timeout for double tap in sec
|
|
||||||
doubleTapTimeout=0.2
|
|
||||||
|
|
||||||
[general]
|
|
||||||
debugLevel=1
|
|
||||||
# debugMode sets where the debug output should send to:
|
|
||||||
# debugMode=File writes to debugFile (Default: /var/log/fenrirscreenreader/fenrir.log)
|
|
||||||
# debugMode=Print just prints on the screen
|
|
||||||
debugMode=File
|
|
||||||
debugFile=
|
|
||||||
punctuationProfile=default
|
|
||||||
punctuationLevel=some
|
|
||||||
respectPunctuationPause=True
|
|
||||||
newLinePause=True
|
|
||||||
numberOfClipboards=10
|
|
||||||
# used path for "export_clipboard_to_file"
|
|
||||||
# $user is replaced by username
|
|
||||||
clipboardExportPath=/tmp/fenrirClipboard
|
|
||||||
emoticons=True
|
|
||||||
fenrirKeys=KEY_KP0,KEY_CAPSLOCK
|
|
||||||
scriptKeys=KEY_META,KEY_COMPOSE
|
|
||||||
timeFormat=%H:%M:%P
|
|
||||||
dateFormat="%A, %B %d, %Y"
|
|
||||||
autoSpellCheck=True
|
|
||||||
spellCheckLanguage=en_US
|
|
||||||
scriptPath=/usr/share/fenrirscreenreader/scripts
|
|
||||||
# overload commands, and create new one without changing Fenrir default
|
|
||||||
commandPath=
|
|
||||||
#fenrirBGColor = the backgroundcolor
|
|
||||||
#fenrirFGColor = the foregroundcolor
|
|
||||||
#fenrirUnderline = speak the underline attribute
|
|
||||||
#fenrirBold = speak the bold attribute
|
|
||||||
#fenrirBlink = speak the blink attribute
|
|
||||||
#fenrirFont = the font
|
|
||||||
#fenrirFontSize = the fontsize
|
|
||||||
attributeFormatString=Background fenrirBGColor,Foreground fenrirFGColor,fenrirUnderline,fenrirBold,fenrirBlink, Font fenrirFont,Fontsize fenrirFontSize
|
|
||||||
autoPresentIndent=False
|
|
||||||
# play a sound when attributes are changeing
|
|
||||||
hasAttributes=False
|
|
||||||
# shell for PTY emulatiun (empty = default shell)
|
|
||||||
shell=
|
|
||||||
|
|
||||||
[focus]
|
|
||||||
#follow the text cursor
|
|
||||||
cursor=True
|
|
||||||
#follow highlighted text changes
|
|
||||||
highlight=False
|
|
||||||
|
|
||||||
[remote]
|
|
||||||
enable=True
|
|
||||||
# connection type
|
|
||||||
# unix = unix sockets
|
|
||||||
# tcp = tcp (localhost only)
|
|
||||||
method=unix
|
|
||||||
# tcp port
|
|
||||||
port=22447
|
|
||||||
# socket filepath
|
|
||||||
socketpath=/tmp/
|
|
||||||
# allow settings to overwrite
|
|
||||||
enableSettingsRemote=True
|
|
||||||
# allow commands to be executed
|
|
||||||
enableCommandRemote=True
|
|
||||||
|
|
||||||
[barrier]
|
|
||||||
enabled=True
|
|
||||||
leftBarriers=│└┌─
|
|
||||||
rightBarriers=│┘┐─
|
|
||||||
|
|
||||||
[review]
|
|
||||||
lineBreak=True
|
|
||||||
endOfScreen=True
|
|
||||||
# leave the review when pressing a key
|
|
||||||
leaveReviewOnCursorChange=True
|
|
||||||
# leave the review when changing the screen
|
|
||||||
leaveReviewOnScreenChange=True
|
|
||||||
|
|
||||||
[promote]
|
|
||||||
enabled=True
|
|
||||||
inactiveTimeoutSec=120
|
|
||||||
list=
|
|
||||||
|
|
||||||
[time]
|
|
||||||
# automatic time anouncement
|
|
||||||
enabled=False
|
|
||||||
# present time
|
|
||||||
presentTime=True
|
|
||||||
# present date (on change)
|
|
||||||
presentDate=True
|
|
||||||
# present time after x seconds
|
|
||||||
delaySec=0
|
|
||||||
# present time after to given minutes example every 15 minutes: 00,15,30,45
|
|
||||||
# if delaySec is >0 onMinutes is ignored
|
|
||||||
onMinutes=00,30
|
|
||||||
# announce via soundicon
|
|
||||||
announce=True
|
|
||||||
# interrupt current speech for time announcement
|
|
||||||
interrupt=False
|
|
@ -1,265 +0,0 @@
|
|||||||
# 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
|
|
@ -1,71 +0,0 @@
|
|||||||
Cleanups:
|
|
||||||
[X] re.sub(' +,' ',text) -> text.lstrip()? check this?
|
|
||||||
- inheritation for drivers
|
|
||||||
[X] Speech (All)
|
|
||||||
[X] Braille (All)
|
|
||||||
[X] Sound (All)
|
|
||||||
[X] Input (All)
|
|
||||||
[X] Screen (All)
|
|
||||||
- generic list or see Tutorial mode list (convert clipboard management) (Easy for contribution) - core.memoryManager
|
|
||||||
[X] next item
|
|
||||||
[X] prev item
|
|
||||||
[X] curr item
|
|
||||||
[X] first item
|
|
||||||
[X] last item
|
|
||||||
General:
|
|
||||||
[X] make it runable using pypy3
|
|
||||||
[X] play sound on plugging device
|
|
||||||
[X] interrupt speech while entering an ignored screen
|
|
||||||
[X] read ignorescreens from an file to be able to halt fenrir from outside
|
|
||||||
- commands
|
|
||||||
[X] place last spoken to clipboard (Easy for contribution)
|
|
||||||
- Improvend Headline Seperator and Multible Char Support
|
|
||||||
[X]read "13 #" insteed of ###################
|
|
||||||
- autospeak indentation changes (useful for python programming)
|
|
||||||
Braille Support:
|
|
||||||
Driver:
|
|
||||||
[X] evdev InputDriver
|
|
||||||
[X] grab/ ungrab devices on ignored screens
|
|
||||||
Driver (screen, input):
|
|
||||||
[X] PTY Screen driver (to use gnome-terminal and other terminal emulators)
|
|
||||||
[X] emulation
|
|
||||||
[X] basic reading
|
|
||||||
[X] detect colum/ lines
|
|
||||||
[X] resize on colum / line change
|
|
||||||
[X] make shell command configurable (or detect it)
|
|
||||||
[X] stop emulation properly
|
|
||||||
[X] attributes
|
|
||||||
[X] unify hilgight tracking
|
|
||||||
[X] make pasteing text work again
|
|
||||||
[X] make double tap work again
|
|
||||||
[X] new event for byte shortcuts (escape sequences)
|
|
||||||
[X] create driver
|
|
||||||
[X] handle byte shortcuts
|
|
||||||
[X] detect shortcuts
|
|
||||||
[X] Load escape sequence shortcuts
|
|
||||||
[X] controll modes (vim like mode to not collide with application shortcuts)
|
|
||||||
[X] create keyboard layout
|
|
||||||
[X]set flag that it is used in emulation
|
|
||||||
[X] write/ consume them (controll it at all)
|
|
||||||
https://docs.python.org/3.2/library/pty.html
|
|
||||||
http://sqizit.bartletts.id.au/2011/02/14/pseudo-terminals-in-python/
|
|
||||||
https://blog.konpat.me/pythons-pseudo-terminal-pty-examples/
|
|
||||||
|
|
||||||
[X] make generic speech driver default
|
|
||||||
[X] pyttsx3 speech driver
|
|
||||||
- get information already in watchdogs insteed of mainloop (use eventloop to transport)
|
|
||||||
[X] InputDriver
|
|
||||||
Settings:
|
|
||||||
Application Profiles:
|
|
||||||
Translation:
|
|
||||||
- German (thanks to schulle4u and Jenny) https://robbinaer.info/index.php?article101/fenrir
|
|
||||||
Fixes:
|
|
||||||
- no shell in generic speech Driver
|
|
||||||
- imporove validity checks for speech driver
|
|
||||||
- handle thread and process shutdown more gracefully
|
|
||||||
- cleanup
|
|
||||||
- a lot more fixes
|
|
||||||
- better device detection
|
|
||||||
[X] (not conflict with other applications) find . -iname "*.py" -exec sed 's/from \(core.*\) import/from fenrir-screenreader.\1 import/g' {} \;
|
|
||||||
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
|||||||
- import clipboard from x (xclip)
|
|
||||||
- barrier mode (respect pseudo cli window borders like used in dialog or pdmenu)
|
|
||||||
- toggle for barrier mode
|
|
||||||
- soundicon for barrier mode when enter and leave the barrier detection
|
|
||||||
- imporove accuracy of speak history (arrow up/ down in bash)
|
|
||||||
- higher accuracy for hilight tracking
|
|
||||||
- soundicon for attribute
|
|
||||||
- overall improved attribute code
|
|
||||||
- variouse speedups and bugfixes
|
|
@ -1,13 +0,0 @@
|
|||||||
- fix hight CPU load in VCSA pressing mute key
|
|
||||||
- add remote manager
|
|
||||||
- remote manager: TCP connection
|
|
||||||
- remote manager: UNIX Socket connection(default)
|
|
||||||
- remote manager: set settings set a setting (-o syntax) "setting set sound#enabled=False"
|
|
||||||
- remote manager: reset settings "setting reset"
|
|
||||||
- remote manager: save settings "setting save /path/settings.conf"
|
|
||||||
- remote Manager: say command (say something) "command say this is a test"
|
|
||||||
- remote manager: interrupt command (interrupt current speech) "command interrupt"
|
|
||||||
- remote manager: window command (to define window) "command window startX startY endX endY"
|
|
||||||
- remote manager: resetwindow command (to reset window) "command resetwindow"
|
|
||||||
- settings: store settings more centralized
|
|
||||||
- variouse speedups and bugfixes
|
|
@ -1,5 +0,0 @@
|
|||||||
- initial working emacspeak driver
|
|
||||||
- fixes for fenrir-ignore-screen/ fenrir-unignore-screen management tools
|
|
||||||
- settings and sections are now case sensitive (this makes it possible to make better validity checks.)
|
|
||||||
- validate datatype for settings you set with "-o" parameter or remotemanager "setting set"
|
|
||||||
- variouse speedups and bugfixes
|
|
@ -1,19 +0,0 @@
|
|||||||
!!!! ATTENTION !!!!
|
|
||||||
the speech-dispatcher driver was reworked. the language and voice was swapped.
|
|
||||||
this needs some reconfiguration in your settings.conf
|
|
||||||
what you have as speech language= needs now to be set to voice=
|
|
||||||
!!!! ATTENTION !!!!
|
|
||||||
|
|
||||||
1. vMenu
|
|
||||||
- it allows to define macros in an menu like structure
|
|
||||||
- allows us to create a settings menu
|
|
||||||
2. first letter navigation in vMenu
|
|
||||||
3. quit command for remote manager for exiting fenrir
|
|
||||||
4. "vmenu" command for remote manager for lock an vmenu
|
|
||||||
5. "resetvmenu" command for remote manager for release complete vmenu
|
|
||||||
6. NVDA compatible keyboard layouts
|
|
||||||
7. fixes to speech-dispatcher driver
|
|
||||||
8. quickMenu
|
|
||||||
|
|
||||||
Bugfixes and Cleanups
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
1. PTY screen driver (leaves experimental state, stable now)
|
|
||||||
- lot higher accuracy
|
|
||||||
- works with "dialog" now
|
|
||||||
- a lot of performance speedup
|
|
||||||
- shortcuts are now recognieced more accurate
|
|
||||||
2. VCSA screen driver got support for UTF32 using /dev/vcsu (needs Linux >=4.19)
|
|
||||||
3. Tutorial mode now creates more userfriendly output of the shortcuts
|
|
||||||
4. faster word echo
|
|
||||||
5. improved dynamic grab/ ungrab of devices
|
|
||||||
6. custom dicts and emojis can now use regex when prefix with regex;
|
|
||||||
Bugfixes and Cleanups
|
|
||||||
|
|
10
setup.py
10
setup.py
@ -6,7 +6,7 @@ from shutil import copyfile
|
|||||||
from setuptools import find_packages
|
from setuptools import find_packages
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
|
|
||||||
fenrirVersion = '1.9.7'
|
fenrirVersion = '1.9.9'
|
||||||
packageVersion = 'post1'
|
packageVersion = 'post1'
|
||||||
|
|
||||||
# handle flags for package manager like aurman and pacaur.
|
# handle flags for package manager like aurman and pacaur.
|
||||||
@ -59,8 +59,8 @@ setup(
|
|||||||
long_description=read('README.md'),
|
long_description=read('README.md'),
|
||||||
keywords=['screenreader', 'a11y', 'accessibility', 'terminal', 'TTY', 'console'],
|
keywords=['screenreader', 'a11y', 'accessibility', 'terminal', 'TTY', 'console'],
|
||||||
license="License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
|
license="License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
|
||||||
url="https://github.com/chrys87/fenrir/",
|
url="https://git.stormux.org/storm/fenrir/",
|
||||||
download_url = 'https://github.com/chrys87/fenrir/archive/' + fenrirVersion + '.tar.gz',
|
download_url = 'https://git.stormux.org/storm/fenrir/archive/' + fenrirVersion + '.tar.gz',
|
||||||
classifiers=[
|
classifiers=[
|
||||||
"Programming Language :: Python",
|
"Programming Language :: Python",
|
||||||
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
|
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
|
||||||
@ -70,8 +70,8 @@ setup(
|
|||||||
],
|
],
|
||||||
|
|
||||||
# Application author details:
|
# Application author details:
|
||||||
author="Chrys, Storm_dragon, Jeremiah and others",
|
author="Storm Dragon, Jeremiah, Chrys and others",
|
||||||
author_email="chrysg@linux-a11y.org",
|
author_email="storm_dragon@stormux.org",
|
||||||
|
|
||||||
# Packages
|
# Packages
|
||||||
packages=find_packages('src/'),
|
packages=find_packages('src/'),
|
||||||
|
Loading…
Reference in New Issue
Block a user