2018-03-25 18:47:00 -04:00
|
|
|
#!/bin/python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
# Fenrir TTY screen reader
|
|
|
|
# By Chrys, Storm Dragon, and contributers.
|
|
|
|
|
|
|
|
from fenrirscreenreader.core import debug
|
2018-05-29 16:47:10 -04:00
|
|
|
from fenrirscreenreader.core.eventData import fenrirEventType
|
|
|
|
import os, inspect, re, time
|
2018-03-26 01:54:04 -04:00
|
|
|
currentdir = os.path.dirname(os.path.realpath(os.path.abspath(inspect.getfile(inspect.currentframe()))))
|
|
|
|
fenrirPath = os.path.dirname(currentdir)
|
2018-03-25 18:47:00 -04:00
|
|
|
|
|
|
|
class byteManager():
|
|
|
|
def __init__(self):
|
2018-05-29 16:47:10 -04:00
|
|
|
self.command = ''
|
|
|
|
self.switchCtrlModeOnce = 0
|
|
|
|
self.controlMode = True
|
|
|
|
self.repeat = 1
|
|
|
|
self.lastInputTime = time.time()
|
|
|
|
self.lastByteKey = b''
|
2018-03-25 18:47:00 -04:00
|
|
|
def initialize(self, environment):
|
|
|
|
self.env = environment
|
|
|
|
def shutdown(self):
|
|
|
|
pass
|
|
|
|
def unifyEscapeSeq(self, escapeSequence):
|
|
|
|
convertedEscapeSequence = escapeSequence
|
|
|
|
if convertedEscapeSequence[0] == 27:
|
2018-03-26 18:26:34 -04:00
|
|
|
convertedEscapeSequence = b'^[' + convertedEscapeSequence[1:]
|
|
|
|
if len(convertedEscapeSequence) > 1:
|
|
|
|
if convertedEscapeSequence[0] == 94 and convertedEscapeSequence[1] ==91:
|
|
|
|
convertedEscapeSequence = b'^[' + convertedEscapeSequence[2:]
|
2018-05-29 16:47:10 -04:00
|
|
|
return convertedEscapeSequence
|
|
|
|
def handleByteInput(self, eventData):
|
|
|
|
if not eventData:
|
|
|
|
return
|
|
|
|
if eventData == b'':
|
|
|
|
return
|
|
|
|
|
|
|
|
convertedEscapeSequence = self.unifyEscapeSeq(eventData)
|
|
|
|
|
|
|
|
if self.switchCtrlModeOnce > 0:
|
|
|
|
self.switchCtrlModeOnce -= 1
|
|
|
|
|
|
|
|
isControlMode = False
|
|
|
|
if self.controlMode and not self.switchCtrlModeOnce == 1 or\
|
|
|
|
not self.controlMode:
|
|
|
|
isControlMode = self.handleControlMode(eventData)
|
|
|
|
shortcutData = convertedEscapeSequence
|
|
|
|
if self.lastByteKey == convertedEscapeSequence:
|
|
|
|
if time.time() - self.lastInputTime <= self.env['runtime']['settingsManager'].getSettingAsFloat('keyboard','doubleTapTimeout'):
|
|
|
|
self.repeat += 1
|
|
|
|
shortcutData = shortcutData + convertedEscapeSequence
|
|
|
|
isCommand = False
|
|
|
|
if self.controlMode and not self.switchCtrlModeOnce == 1 or\
|
|
|
|
not self.controlMode and self.switchCtrlModeOnce == 1:
|
|
|
|
isCommand = self.detectByteCommand(shortcutData)
|
|
|
|
if not isCommand:
|
|
|
|
isCommand = self.detectByteCommand(convertedEscapeSequence)
|
|
|
|
self.repeat = 1
|
|
|
|
if not (isCommand or isControlMode):
|
|
|
|
self.env['runtime']['screenManager'].injectTextToScreen(eventData)
|
|
|
|
if not isCommand:
|
|
|
|
self.repeat = 1
|
|
|
|
self.lastByteKey = convertedEscapeSequence
|
|
|
|
self.lastInputTime = time.time()
|
|
|
|
def handleControlMode(self, escapeSequence):
|
|
|
|
convertedEscapeSequence = self.unifyEscapeSeq(escapeSequence)
|
|
|
|
if convertedEscapeSequence == b'^[R':
|
|
|
|
self.controlMode = not self.controlMode
|
|
|
|
self.switchCtrlModeOnce = 0
|
|
|
|
if self.controlMode:
|
|
|
|
self.env['runtime']['outputManager'].presentText(_('Sticky Mode On'), soundIcon='Accept', interrupt=True, flush=True)
|
|
|
|
else:
|
|
|
|
self.env['runtime']['outputManager'].presentText(_('Sticky Mode On'), soundIcon='Cancel', interrupt=True, flush=True)
|
|
|
|
return True
|
|
|
|
if convertedEscapeSequence == b'^[:':
|
|
|
|
self.switchCtrlModeOnce = 2
|
|
|
|
self.env['runtime']['outputManager'].presentText(_('bypass'), soundIcon='PTYBypass', interrupt=True, flush=True)
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
def detectByteCommand(self, escapeSequence):
|
|
|
|
convertedEscapeSequence = self.unifyEscapeSeq(escapeSequence)
|
|
|
|
self.command = self.env['runtime']['inputManager'].getCommandForShortcut(convertedEscapeSequence)
|
|
|
|
if self.command != '':
|
|
|
|
self.env['runtime']['eventManager'].putToEventQueue(fenrirEventType.ExecuteCommand, self.command)
|
|
|
|
self.command = ''
|
|
|
|
return True
|
|
|
|
return False
|
2018-03-26 01:54:04 -04:00
|
|
|
def loadByteShortcuts(self, kbConfigPath=fenrirPath + '/../../config/keyboard/pty.conf'):
|
|
|
|
kbConfig = open(kbConfigPath,"r")
|
|
|
|
while(True):
|
|
|
|
line = kbConfig.readline()
|
|
|
|
if not line:
|
|
|
|
break
|
|
|
|
line = line.replace('\n','')
|
|
|
|
if line.replace(" ","") == '':
|
|
|
|
continue
|
|
|
|
if line.replace(" ","").startswith("#"):
|
|
|
|
continue
|
|
|
|
if line.count("=") != 1:
|
|
|
|
continue
|
|
|
|
Values = line.split('=')
|
|
|
|
shortcut = bytes(Values[0],'UTF-8')
|
|
|
|
commandName = Values[1].upper()
|
|
|
|
self.env['bindings'][shortcut] = commandName
|
|
|
|
self.env['runtime']['debug'].writeDebugOut("Byte Shortcut: "+ str(shortcut) + ' command:' +commandName ,debug.debugLevel.INFO, onAnyLevel=True)
|
|
|
|
kbConfig.close()
|