138 lines
4.4 KiB
Python
Raw Normal View History

2016-09-15 00:04:52 +02:00
#!/bin/python
# -*- coding: utf-8 -*-
# Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributers.
2016-09-15 00:04:52 +02:00
import evdev
import time
from evdev import InputDevice, UInput
2016-09-17 23:38:40 +02:00
from select import select
from core import inputEvent
from core import debug
2016-09-15 00:04:52 +02:00
class driver():
def __init__(self):
self.iDevices = {}
self.uDevices = {}
self.ledDevices = {}
2016-09-15 00:04:52 +02:00
def initialize(self, environment):
2016-09-18 15:13:24 +02:00
self.getInputDevices(environment)
2016-09-15 00:04:52 +02:00
def shutdown(self, environment):
pass
2016-09-21 18:07:28 +02:00
def getInputEvent(self, environment):
2016-09-15 00:04:52 +02:00
event = None
r, w, x = select(self.iDevices, [], [], environment['runtime']['settingsManager'].getSettingAsFloat(environment, 'screen', 'screenUpdateDelay'))
if r != []:
for fd in r:
event = self.iDevices[fd].read_one()
2016-09-18 15:13:24 +02:00
environment['input']['eventBuffer'].append( [self.iDevices[fd], self.uDevices[fd], event])
return environment['runtime']['inputDriver'].mapEvent(environment, event)
2016-09-15 00:04:52 +02:00
return None
2016-09-18 15:13:24 +02:00
def writeEventBuffer(self, environment):
for iDevice, uDevice, event in environment['input']['eventBuffer']:
self.writeUInput(environment, uDevice, event)
self.clearEventBuffer(environment)
def clearEventBuffer(self, environment):
del environment['input']['eventBuffer'][:]
def writeUInput(self, environment, uDevice, event):
2016-09-15 00:04:52 +02:00
uDevice.write_event(event)
uDevice.syn()
2016-09-18 15:13:24 +02:00
def getInputDevices(self, environment):
# 3 pos absolute
# 2 pos relative
# 17 LEDs
# 1 Keys
# we try to filter out mices and other stuff here
2016-09-15 00:04:52 +02:00
self.iDevices = map(evdev.InputDevice, (evdev.list_devices()))
self.iDevices = {dev.fd: dev for dev in self.iDevices if 1 in dev.capabilities() and not 3 in dev.capabilities() and not 2 in dev.capabilities()}
self.ledDevices = map(evdev.InputDevice, (evdev.list_devices()))
self.ledDevices = {dev.fd: dev for dev in self.ledDevices if 1 in dev.capabilities() and 17 in dev.capabilities() and not 3 in dev.capabilities() and not 2 in dev.capabilities()}
2016-09-17 23:38:40 +02:00
def mapEvent(self,environment, event):
if not event:
return None
mEvent = inputEvent.inputEvent
try:
2016-09-17 23:38:40 +02:00
mEvent['EventName'] = evdev.ecodes.keys[event.code].upper()
mEvent['EventValue'] = event.code
mEvent['EventSec'] = event.sec
mEvent['EventUsec'] = event.usec
mEvent['EventState'] = event.value
return mEvent
except Exception as e:
print(e)
return None
def getNumlock(self,environment):
if self.ledDevices == {}:
return True
if self.ledDevices == None:
return True
for fd, dev in self.ledDevices.items():
return 0 in dev.leds()
return True
def getCapslock(self,environment):
if self.ledDevices == {}:
return False
if self.ledDevices == None:
return False
for fd, dev in self.ledDevices.items():
return 1 in dev.leds()
return False
def getScrollLock(self,environment):
if self.ledDevices == {}:
return False
if self.ledDevices == None:
return False
for fd, dev in self.ledDevices.items():
return 2 in dev.leds()
return False
2016-09-18 15:13:24 +02:00
def grabDevices(self, environment):
2016-09-15 00:04:52 +02:00
for fd in self.iDevices:
dev = self.iDevices[fd]
cap = dev.capabilities()
del cap[0]
self.uDevices[fd] = UInput(
cap,
dev.name,
#dev.info.vendor,
#dev.info.product,
#dev.version,
#dev.info.bustype,
#'/dev/uinput'
)
dev.grab()
2016-09-18 15:13:24 +02:00
def releaseDevices(self, environment):
2016-09-15 00:04:52 +02:00
for fd in self.iDevices:
try:
self.iDevices[fd].ungrab()
except:
pass
try:
self.iDevices[fd].close()
except:
pass
try:
self.uDevices[fd].close()
except:
pass
self.iDevices.clear()
self.uDevices.clear()
def __del__(self):
self.releaseDevices()