2018-03-21 06:10:28 -04:00
|
|
|
#!/bin/python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
# Fenrir TTY screen reader
|
|
|
|
# By Chrys, Storm Dragon, and contributers.
|
|
|
|
|
|
|
|
import time
|
|
|
|
from fenrirscreenreader.core import debug
|
|
|
|
|
|
|
|
class inputManager():
|
|
|
|
def __init__(self):
|
|
|
|
self.setLedState = True
|
|
|
|
def initialize(self, environment):
|
|
|
|
self.env = environment
|
|
|
|
self.env['runtime']['settingsManager'].loadDriver(\
|
|
|
|
self.env['runtime']['settingsManager'].getSetting('keyboard', 'driver'), 'inputDriver')
|
|
|
|
self.updateInputDevices()
|
|
|
|
# init LEDs with current state
|
|
|
|
self.env['input']['newNumLock'] = self.env['runtime']['inputDriver'].getLedState()
|
|
|
|
self.env['input']['oldNumLock'] = self.env['input']['newNumLock']
|
|
|
|
self.env['input']['newCapsLock'] = self.env['runtime']['inputDriver'].getLedState(1)
|
|
|
|
self.env['input']['oldCapsLock'] = self.env['input']['newCapsLock']
|
|
|
|
self.env['input']['newScrollLock'] = self.env['runtime']['inputDriver'].getLedState(2)
|
|
|
|
self.env['input']['oldScrollLock'] = self.env['input']['newScrollLock']
|
|
|
|
self.lastDeepestInput = []
|
2018-03-22 16:01:38 -04:00
|
|
|
self.env['input']['shortcutRepeat'] = 1
|
2018-03-21 06:10:28 -04:00
|
|
|
self.lastInputTime = time.time()
|
|
|
|
def shutdown(self):
|
|
|
|
self.removeAllDevices()
|
|
|
|
self.env['runtime']['settingsManager'].shutdownDriver('inputDriver')
|
|
|
|
def getInputEvent(self):
|
|
|
|
return self.env['runtime']['inputDriver'].getInputEvent()
|
|
|
|
def handleInputEvent(self, eventData):
|
|
|
|
self.env['runtime']['debug'].writeDebugOut('DEBUG INPUT inputMan:' + str(eventData),debug.debugLevel.INFO)
|
|
|
|
if not eventData:
|
|
|
|
return
|
|
|
|
self.env['input']['prevInput'] = self.env['input']['currInput'].copy()
|
|
|
|
if eventData['EventState'] == 0:
|
|
|
|
if eventData['EventName'] in self.env['input']['currInput']:
|
|
|
|
self.env['input']['currInput'].remove(eventData['EventName'])
|
|
|
|
if len(self.env['input']['currInput']) > 1:
|
|
|
|
self.env['input']['currInput'] = sorted(self.env['input']['currInput'])
|
|
|
|
elif len(self.env['input']['currInput']) == 0:
|
|
|
|
self.env['input']['shortcutRepeat'] = 1
|
|
|
|
self.setLedState = self.handleLedStates(eventData)
|
|
|
|
self.lastInputTime = time.time()
|
|
|
|
elif eventData['EventState'] == 1:
|
|
|
|
if not eventData['EventName'] in self.env['input']['currInput']:
|
|
|
|
self.env['input']['currInput'].append(eventData['EventName'])
|
|
|
|
if len(self.env['input']['currInput']) > 1:
|
|
|
|
self.env['input']['currInput'] = sorted(self.env['input']['currInput'])
|
|
|
|
if len(self.lastDeepestInput) < len(self.env['input']['currInput']):
|
|
|
|
self.setLastDeepestInput( self.env['input']['currInput'].copy())
|
|
|
|
elif self.lastDeepestInput == self.env['input']['currInput']:
|
|
|
|
if time.time() - self.lastInputTime <= self.env['runtime']['settingsManager'].getSettingAsFloat('keyboard','doubleTapTimeout'):
|
|
|
|
self.env['input']['shortcutRepeat'] += 1
|
|
|
|
else:
|
|
|
|
self.env['input']['shortcutRepeat'] = 1
|
|
|
|
self.setLedState = self.handleLedStates(eventData)
|
|
|
|
self.lastInputTime = time.time()
|
|
|
|
elif eventData['EventState'] == 2:
|
|
|
|
self.lastInputTime = time.time()
|
|
|
|
|
|
|
|
self.env['input']['oldNumLock'] = self.env['input']['newNumLock']
|
|
|
|
self.env['input']['newNumLock'] = self.env['runtime']['inputDriver'].getLedState()
|
|
|
|
self.env['input']['oldCapsLock'] = self.env['input']['newCapsLock']
|
|
|
|
self.env['input']['newCapsLock'] = self.env['runtime']['inputDriver'].getLedState(1)
|
|
|
|
self.env['input']['oldScrollLock'] = self.env['input']['newScrollLock']
|
|
|
|
self.env['input']['newScrollLock'] = self.env['runtime']['inputDriver'].getLedState(2)
|
|
|
|
self.env['runtime']['debug'].writeDebugOut("currInput " + str(self.env['input']['currInput'] ) ,debug.debugLevel.INFO)
|
|
|
|
if self.noKeyPressed():
|
|
|
|
self.env['input']['prevInput'] = []
|
|
|
|
self.setLedState = True
|
|
|
|
|
|
|
|
def handleLedStates(self, mEvent):
|
|
|
|
if not self.setLedState:
|
|
|
|
return self.setLedState
|
|
|
|
if mEvent['EventName'] == 'KEY_NUMLOCK':
|
|
|
|
if mEvent['EventState'] == 1 and not self.env['input']['newNumLock'] == 1:
|
|
|
|
self.env['runtime']['inputDriver'].toggleLedState()
|
|
|
|
return False
|
|
|
|
if mEvent['EventState'] == 0 and not self.env['input']['newNumLock'] == 0:
|
|
|
|
self.env['runtime']['inputDriver'].toggleLedState()
|
|
|
|
return False
|
|
|
|
if mEvent['EventName'] == 'KEY_CAPSLOCK':
|
|
|
|
if mEvent['EventState'] == 1 and not self.env['input']['newCapsLock'] == 1:
|
|
|
|
self.env['runtime']['inputDriver'].toggleLedState(1)
|
|
|
|
return False
|
|
|
|
if mEvent['EventState'] == 0 and not self.env['input']['newCapsLock'] == 0:
|
|
|
|
self.env['runtime']['inputDriver'].toggleLedState(1)
|
|
|
|
return False
|
|
|
|
if mEvent['EventName'] == 'KEY_SCROLLLOCK':
|
|
|
|
if mEvent['EventState'] == 1 and not self.env['input']['newScrollLock'] == 1:
|
|
|
|
self.env['runtime']['inputDriver'].toggleLedState(2)
|
|
|
|
return False
|
|
|
|
if mEvent['EventState'] == 0 and not self.env['input']['newScrollLock'] == 0:
|
|
|
|
self.env['runtime']['inputDriver'].toggleLedState(2)
|
|
|
|
return False
|
|
|
|
return self.setLedState
|
|
|
|
|
|
|
|
def grabAllDevices(self):
|
|
|
|
if self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'grabDevices'):
|
|
|
|
self.env['runtime']['inputDriver'].grabAllDevices()
|
|
|
|
|
|
|
|
def updateInputDevices(self):
|
|
|
|
try:
|
|
|
|
self.env['runtime']['inputDriver'].updateInputDevices()
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
|
|
|
|
def removeAllDevices(self):
|
|
|
|
try:
|
|
|
|
self.env['runtime']['inputDriver'].removeAllDevices()
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
|
|
|
|
def convertEventName(self, eventName):
|
|
|
|
if not eventName:
|
|
|
|
return ''
|
|
|
|
if eventName == '':
|
|
|
|
return ''
|
|
|
|
eventName = eventName.upper()
|
|
|
|
if eventName == 'KEY_LEFTCTRL':
|
|
|
|
eventName = 'KEY_CTRL'
|
|
|
|
elif eventName == 'KEY_RIGHTCTRL':
|
|
|
|
eventName = 'KEY_CTRL'
|
|
|
|
elif eventName == 'KEY_LEFTSHIFT':
|
|
|
|
eventName = 'KEY_SHIFT'
|
|
|
|
elif eventName == 'KEY_RIGHTSHIFT':
|
|
|
|
eventName = 'KEY_SHIFT'
|
|
|
|
elif eventName == 'KEY_LEFTALT':
|
|
|
|
eventName = 'KEY_ALT'
|
|
|
|
elif eventName == 'KEY_RIGHTALT':
|
|
|
|
eventName = 'KEY_ALT'
|
|
|
|
elif eventName == 'KEY_LEFTMETA':
|
|
|
|
eventName = 'KEY_META'
|
|
|
|
elif eventName == 'KEY_RIGHTMETA':
|
|
|
|
eventName = 'KEY_META'
|
|
|
|
if self.isFenrirKey(eventName):
|
|
|
|
eventName = 'KEY_FENRIR'
|
|
|
|
if self.isScriptKey(eventName):
|
|
|
|
eventName = 'KEY_SCRIPT'
|
|
|
|
return eventName
|
|
|
|
|
|
|
|
def clearEventBuffer(self):
|
|
|
|
self.env['runtime']['inputDriver'].clearEventBuffer()
|
|
|
|
def setLastDeepestInput(self, currentDeepestInput):
|
|
|
|
self.lastDeepestInput = currentDeepestInput
|
|
|
|
def clearLastDeepInput(self):
|
|
|
|
self.lastDeepestInput = []
|
|
|
|
def getLastInputTime(self):
|
|
|
|
return self.lastInputTime
|
|
|
|
def getLastDeepestInput(self):
|
|
|
|
return self.lastDeepestInput
|
|
|
|
def writeEventBuffer(self):
|
|
|
|
try:
|
|
|
|
if self.env['runtime']['settingsManager'].getSettingAsBool('keyboard', 'grabDevices'):
|
|
|
|
self.env['runtime']['inputDriver'].writeEventBuffer()
|
|
|
|
self.clearEventBuffer()
|
|
|
|
except Exception as e:
|
|
|
|
self.env['runtime']['debug'].writeDebugOut("Error while writeUInput",debug.debugLevel.ERROR)
|
|
|
|
self.env['runtime']['debug'].writeDebugOut(str(e),debug.debugLevel.ERROR)
|
|
|
|
|
|
|
|
def noKeyPressed(self):
|
|
|
|
return self.env['input']['currInput'] == []
|
|
|
|
def isKeyPress(self):
|
|
|
|
return (self.env['input']['prevInput'] == []) and (self.env['input']['currInput'] != [])
|
|
|
|
def getPrevDeepestShortcut(self):
|
|
|
|
shortcut = []
|
|
|
|
shortcut.append(self.env['input']['shortcutRepeat'])
|
|
|
|
shortcut.append(self.getLastDeepestInput())
|
|
|
|
return str(shortcut)
|
|
|
|
|
|
|
|
def getPrevShortcut(self):
|
|
|
|
shortcut = []
|
|
|
|
shortcut.append(self.env['input']['shortcutRepeat'])
|
|
|
|
shortcut.append(self.env['input']['prevInput'])
|
|
|
|
return str(shortcut)
|
|
|
|
|
|
|
|
def getCurrShortcut(self, inputSequence = None):
|
|
|
|
shortcut = []
|
|
|
|
shortcut.append(self.env['input']['shortcutRepeat'])
|
|
|
|
if inputSequence:
|
|
|
|
shortcut.append(inputSequence)
|
|
|
|
else:
|
|
|
|
shortcut.append(self.env['input']['currInput'])
|
|
|
|
if len(self.env['input']['prevInput']) < len(self.env['input']['currInput']):
|
|
|
|
if self.env['input']['shortcutRepeat'] > 1 and not self.shortcutExists(str(shortcut)):
|
|
|
|
shortcut = []
|
|
|
|
self.env['input']['shortcutRepeat'] = 1
|
|
|
|
shortcut.append(self.env['input']['shortcutRepeat'])
|
|
|
|
shortcut.append(self.env['input']['currInput'])
|
|
|
|
self.env['runtime']['debug'].writeDebugOut("currShortcut " + str(shortcut) ,debug.debugLevel.INFO)
|
|
|
|
return str(shortcut)
|
|
|
|
|
|
|
|
def currKeyIsModifier(self):
|
|
|
|
if len(self.getLastDeepestInput()) != 1:
|
|
|
|
return False
|
|
|
|
return (self.env['input']['currInput'][0] =='KEY_FENRIR') or (self.env['input']['currInput'][0] == 'KEY_SCRIPT')
|
|
|
|
|
|
|
|
def isFenrirKey(self, eventName):
|
|
|
|
return eventName in self.env['input']['fenrirKey']
|
|
|
|
|
|
|
|
def isScriptKey(self, eventName):
|
|
|
|
return eventName in self.env['input']['scriptKey']
|
|
|
|
|
|
|
|
def getCommandForShortcut(self, shortcut):
|
|
|
|
if not self.shortcutExists(shortcut):
|
|
|
|
return ''
|
|
|
|
return self.env['bindings'][shortcut]
|
|
|
|
|
|
|
|
def shortcutExists(self, shortcut):
|
|
|
|
return(shortcut in self.env['bindings'])
|