Source code for kitt.listener
#!/usr/bin/env python
from kivy.logger import Logger
log = Logger.getChild("KiTT")
from kivy.event import EventDispatcher
from kivy.graphics import Line
from kivy.gesture import Gesture, GestureDatabase
import pyudev
from actions import Actions
[docs]def make_gesture(name, point_list):
"""
A simple helper function
"""
g = Gesture()
g.add_stroke(point_list)
g.normalize()
g.name = name
return g
[docs]class Listener(EventDispatcher):
"""
listener function that queries kivy for touch events, builds the gesture
and dispatch it through the actions singleton.
"""
def __init__(self, config, gestures, el, *args, **kwarg):
"""
:param config: string containing the path to the action configuration
:param gestures: string containing the path to the gestures configuration
"""
super(EventDispatcher, self).__init__(*args, **kwarg)
self._event_loop = el
self._gdb = GestureDatabase()
self._actions = Actions(config, gestures)
self.update_devices()
self._multitouches = []
[docs] def update_devices(self):
log.debug('update_devices()')
context = pyudev.Context()
for device in context.list_devices(subsystem='input', ID_INPUT_MOUSE=True):
if device.sys_name.startswith('event'):
if 'PRODUCT' in device.parent.keys():
self._actions.update_gestures(device.parent['PRODUCT'])
for gest_n, gest_r in self._actions.get_gestures().iteritems():
for g in gest_r:
g = self._gdb.str_to_gesture(g)
g.normalize()
g.name = gest_n
self._gdb.add_gesture(g)
[docs] def on_touch_down(self, touch):
"""
listening function executed at begining of touch event
builds the gesture
"""
self._multitouches.append(touch)
touch.ud['line'] = Line(points=(touch.sx, touch.sy))
return True
[docs] def on_touch_move(self, touch):
"""
listening function executed during touch event
store points of the gesture
"""
# store points of the touch movement
try:
touch.ud['line'].points += [touch.sx, touch.sy]
return True
except (KeyError), e:
pass
[docs] def on_touch_up(self, touch):
"""
touch is over, display informations, and check if it matches some
known gesture.
"""
if len(self._multitouches) is 0:
return True
log.debug("multitouches: \t%d" % len(self._multitouches))
gestures = map(lambda g: self._gdb.find(make_gesture('',zip(touch.ud['line'].points[::2],
touch.ud['line'].points[1::2])), minscore=0.70), self._multitouches)
if not self._actions.dispatch(gestures, self._gdb):
for touch in self._multitouches:
log.debug("Touch:\t%s" % self._gdb.gesture_to_str(make_gesture('',zip(touch.ud['line'].points[::2],
touch.ud['line'].points[1::2]))))
self._multitouches = []
[docs] def on_motion(self, etype, me):
"""
dispatches motion events
"""
if etype == "begin":
self.on_touch_down(me)
elif etype == "update":
self.on_touch_move(me)
elif etype == "end":
self.on_touch_up(me)
else:
log.error("Receive unknown event of type '%r': %s" % (etype, me))
[docs] def dispatch(self, ev_type, ev_action, ev):
"""
dispatches motion events
"""
if ev_type == "on_motion":
self.on_motion(ev_action, ev)
else:
log.error("asking to dispatch unknown event: '%r': '%r'" % (ev_type, ev))