/usr/lib/python3/dist-packages/evdev/util.py is in python3-evdev 0.4.1-0ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | # encoding: utf-8
import os
import stat
import glob
from evdev import ecodes
from evdev.events import event_factory
def list_devices(input_device_dir='/dev/input'):
'''List readable character devices.'''
fns = glob.glob('{}/event*'.format(input_device_dir))
fns = list(filter(is_device, fns))
return fns
def is_device(fn):
'''Determine if a file exists, is readable and is a character device.'''
if not os.path.exists(fn):
return False
m = os.stat(fn)[stat.ST_MODE]
if not stat.S_ISCHR(m):
return False
if not os.access(fn, os.R_OK):
return False
return True
def categorize(event):
'''
Categorize an event according to its type.
The :data:`event_factory <evdev.events.event_factory>` dictionary maps
event types to their classes. If there is no corresponding key, the event
is returned as it was.
'''
if event.type in event_factory:
return event_factory[event.type](event)
else:
return event
def resolve_ecodes(typecodemap, unknown='?'):
'''
Resolve event codes and types to their verbose names.
:param typecodemap: mapping of event types to lists of event codes
:param unknown: symbol to which unknown types or codes will be resolved
Example::
resolve_ecodes({ 1 : [272, 273, 274] })
{ ('EV_KEY', 1) : [('BTN_MOUSE', 272), ('BTN_RIGHT', 273), ('BTN_MIDDLE', 274)] }
If the typecodemap contains absolute axis info (wrapped in
instances of `AbsInfo <evdev.device.AbsInfo>`) the result would
look like::
resove_ecodes({ 3 : [(0, AbsInfo(...))] })
{ ('EV_ABS', 3L): [(('ABS_X', 0L), AbsInfo(...))] }
'''
for etype, codes in typecodemap.items():
type_name = ecodes.EV[etype]
# ecodes.keys are a combination of KEY_ and BTN_ codes
if etype == ecodes.EV_KEY:
code_names = ecodes.keys
else:
code_names = getattr(ecodes, type_name.split('_')[-1])
res = []
for i in codes:
# elements with AbsInfo(), eg { 3 : [(0, AbsInfo(...)), (1, AbsInfo(...))] }
if isinstance(i, tuple):
l = ((code_names[i[0]], i[0]), i[1]) if i[0] in code_names \
else ((unknown, i[0]), i[1])
# just ecodes { 0 : [0, 1, 3], 1 : [30, 48] }
else:
l = (code_names[i], i) if i in code_names else (unknown, i)
res.append(l)
yield (type_name, etype), res
__all__ = ('list_devices', 'is_device', 'categorize', 'resolve_ecodes')
|