uinput-mapper/mapper.py

77 lines
2.0 KiB
Python
Raw Normal View History

2013-05-18 11:39:00 -04:00
# encoding: utf-8
2013-04-21 06:42:51 -04:00
import cinput
# XXX: Also parse name, etc
2013-05-18 11:39:00 -04:00
def parse_conf(f, devname):
2013-04-21 06:42:51 -04:00
conf = {}
e = f.get_exposed_events()
for k, v in e.iteritems():
t = cinput.events[k]
if t == cinput.EV_SYN:
continue
2013-05-18 11:39:00 -04:00
conf[(devname, t)] = {}
2013-04-21 06:42:51 -04:00
for key in v:
tt = cinput.event_keys[t][key]
2013-05-18 11:39:00 -04:00
conf[(devname, t)][tt] = {
'type' : (devname, t),
2013-04-21 06:42:51 -04:00
'code' : tt,
2013-05-09 10:10:28 -04:00
'value' : None
#'value' : lambda x: x
2013-04-21 06:42:51 -04:00
}
return conf
2013-05-18 11:39:00 -04:00
def pretty_conf_print(c):
for k, v in c.iteritems():
print 'Input:', k[0], 'Type:', cinput.rev_events[k[1]]
for kk, vv in v.iteritems():
n_ev_d, n_ev_t = vv['type']
print ' ' * 4,
print cinput.rev_event_keys[k[1]][kk],
print ' → ([%d, %s], %s)' % (n_ev_d,
cinput.rev_events[n_ev_t],
cinput.rev_event_keys[n_ev_t][vv['code']])
def get_exported_device_count(c):
m = 0
for _, v in c.iteritems():
for _, o in v.iteritems():
m = max(m, o['type'][0])
return m + 1
2013-05-18 11:39:00 -04:00
2013-04-21 06:42:51 -04:00
class KeyMapper(object):
def __init__(self, config):
self._config = config
def map_event(self, ev, fd):
2013-04-21 06:42:51 -04:00
_type = ev.type
2013-04-21 06:42:51 -04:00
if _type in self._config:
typemaps = self._config[(fd, _type)]
2013-04-21 06:42:51 -04:00
if ev.code in typemaps:
info = typemaps[ev.code]
ofd, ev.type = info['type']
2013-04-21 06:42:51 -04:00
ev.code = info['code']
2013-05-09 10:10:28 -04:00
if info['value'] is not None:
ev.value = info['value'](ev.value)
else:
ev.value = ev.value
else:
ofd = fd
2013-04-21 06:42:51 -04:00
return ofd, ev
2013-04-21 06:42:51 -04:00
def expose(self, d, fd):
for (n, evt), v in self._config.iteritems():
2013-04-21 06:42:51 -04:00
for code, dat in v.iteritems():
ofd, t = dat['type']
if ofd != fd:
continue
d.expose_event_type(t)
d.expose_event(t, dat['code'])