2013-05-14 17:46:18 -04:00
|
|
|
#!/usr/bin/env python
|
2013-05-09 10:10:28 -04:00
|
|
|
import linux_uinput, ctypes, fcntl, os, sys
|
2013-05-18 11:39:00 -04:00
|
|
|
import select
|
|
|
|
|
2013-05-09 10:10:28 -04:00
|
|
|
from cinput import *
|
2013-05-18 11:39:00 -04:00
|
|
|
from mapper import KeyMapper, parse_conf, pretty_conf_print
|
2013-05-09 10:10:28 -04:00
|
|
|
|
|
|
|
try:
|
|
|
|
import cPickle as pickle
|
|
|
|
except ImportError:
|
|
|
|
import pickle
|
|
|
|
|
2013-05-10 05:05:31 -04:00
|
|
|
import optparse
|
2013-05-09 10:10:28 -04:00
|
|
|
|
2013-05-14 17:46:18 -04:00
|
|
|
_usage = 'input-read /dev/input/event<0> ... /dev/input/event<N>'
|
2013-05-14 15:30:03 -04:00
|
|
|
parser = optparse.OptionParser(description='Read input devices.',
|
|
|
|
usage = _usage,
|
|
|
|
version='0.01')
|
2013-05-10 05:05:31 -04:00
|
|
|
parser.add_option('-D', '--dump', action='store_false',
|
|
|
|
default=True, help='Dump will marshall all the events to stdout')
|
2013-05-09 10:10:28 -04:00
|
|
|
|
2013-05-10 05:05:31 -04:00
|
|
|
parser.add_option('-C', '--compat', action='store_true',
|
|
|
|
help='Enable compatibility mode; for Python < 2.7')
|
2013-05-09 10:10:28 -04:00
|
|
|
|
2013-05-10 11:33:25 -04:00
|
|
|
args, input_file = parser.parse_args()
|
2013-05-10 05:05:31 -04:00
|
|
|
|
|
|
|
|
2013-05-10 11:33:25 -04:00
|
|
|
if len(input_file) == 0:
|
2013-05-10 05:05:31 -04:00
|
|
|
parser.print_help()
|
|
|
|
exit(0)
|
2013-05-09 10:10:28 -04:00
|
|
|
|
2013-05-18 11:39:00 -04:00
|
|
|
fs = map(InputDevice, input_file)
|
|
|
|
|
|
|
|
config = {}
|
|
|
|
for idx, f in enumerate(fs):
|
|
|
|
c = parse_conf(f, idx)
|
|
|
|
|
|
|
|
config.update(c)
|
2013-05-10 05:05:31 -04:00
|
|
|
|
2013-05-18 11:39:00 -04:00
|
|
|
pretty_conf_print(config)
|
|
|
|
|
|
|
|
p = select.epoll()
|
|
|
|
for f in fs:
|
|
|
|
p.register(f.get_fd(), select.EPOLLIN)
|
2013-05-10 05:05:31 -04:00
|
|
|
|
|
|
|
if args.dump:
|
2013-05-18 11:39:00 -04:00
|
|
|
for f in fs:
|
|
|
|
print 'Version:', f.get_version()
|
|
|
|
print f.get_name()
|
2013-05-10 05:05:31 -04:00
|
|
|
|
2013-05-18 11:39:00 -04:00
|
|
|
d = f.get_exposed_events()
|
|
|
|
for k, v in d.iteritems():
|
|
|
|
print k + ':', ', '.join(v)
|
2013-05-10 05:05:31 -04:00
|
|
|
|
|
|
|
else:
|
|
|
|
p = pickle.Pickler(sys.stdout)
|
|
|
|
|
2013-05-18 11:39:00 -04:00
|
|
|
p.dump(len(fs))
|
|
|
|
|
2013-05-10 05:05:31 -04:00
|
|
|
p.dump(config)
|
2013-05-09 10:10:28 -04:00
|
|
|
|
|
|
|
sys.stdout.flush()
|
|
|
|
|
2013-05-18 11:39:00 -04:00
|
|
|
i = 0
|
2013-05-10 05:05:31 -04:00
|
|
|
while True:
|
2013-05-18 11:39:00 -04:00
|
|
|
events = p.poll()
|
2013-05-09 10:10:28 -04:00
|
|
|
|
2013-05-18 11:39:00 -04:00
|
|
|
for e in events:
|
|
|
|
fd, ev_mask = e
|
|
|
|
|
|
|
|
if not ev_mask & select.EPOLLIN:
|
|
|
|
continue
|
|
|
|
|
|
|
|
# Lets undo that epoll speedup ;-)
|
|
|
|
for idx, _ in enumerate(fs):
|
|
|
|
if _.get_fd() == fd:
|
|
|
|
f = _
|
|
|
|
i = idx
|
|
|
|
|
|
|
|
ev = f.next_event()
|
|
|
|
|
|
|
|
if args.dump:
|
|
|
|
try:
|
|
|
|
print i, ev.time.tv_sec, ev.time.tv_usec
|
|
|
|
s = '%s %s %d' % (rev_events[ev.type], rev_event_keys[ev.type][ev.code], ev.value)
|
|
|
|
print 'Event type:', s
|
|
|
|
except KeyError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
else:
|
|
|
|
if not args.compat:
|
|
|
|
p.dump((i, ev))
|
|
|
|
else:
|
|
|
|
# Use this rather than the line above if you use an old python version (also
|
|
|
|
# edit create.py)
|
|
|
|
p.dump((i, (ev.time.tv_sec, ev.time.tv_usec, ev.type, ev.code,
|
|
|
|
ev.value)))
|
|
|
|
|
|
|
|
sys.stdout.flush()
|