Started project cleanup.
This commit is contained in:
parent
bd975df912
commit
e123c8ebfa
9
CREDITS
9
CREDITS
@ -3,11 +3,16 @@
|
||||
|
||||
## Developers
|
||||
|
||||
* Chrys: Main coder.
|
||||
* Storm Dragon Sounds and keyboard layout, tiny bits of code.
|
||||
* Storm Dragon: Project leader
|
||||
* Jeremiah: Coder.
|
||||
|
||||
|
||||
## Previous Developers
|
||||
|
||||
* Chrys: coder.
|
||||
|
||||
|
||||
## Special thanks to:
|
||||
|
||||
* 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, ''< |