#!/usr/bin/env python
import sys
import argparse
import threading
from daemon import Daemon
import pyudev
import pyudev.glib
[docs]class UdevListener(threading.Thread):
def __init__(self, gobject_loop, el, listener, log):
threading.Thread.__init__(self)
self._gobject_loop = gobject_loop
self._event_loop = el
self._listener = listener
self.log = log
[docs] def device_added(self, observer, device):
for inp in self._event_loop.input_providers:
if device.sys_name == inp.device:
self.log.debug("Device '%s'/'%s' added ; starting event loop" % (device.sys_name, device.parent['PRODUCT']))
self._event_loop.start()
self._listener.update_devices()
[docs] def device_removed(self, observer, device):
for inp in self._event_loop.input_providers:
if device.sys_name == inp.device:
self.log.debug("Device '%s' removed ; stopping event loop" % (device.sys_name,))
self._event_loop.stop()
[docs] def run(self):
self.log.debug("Starting udev listener")
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
observer = pyudev.glib.GUDevMonitorObserver(monitor)
observer.connect('device-added', self.device_added)
observer.connect('device-removed', self.device_removed)
monitor.enable_receiving()
self._gobject_loop()
[docs]def run():
"""
main function that parses the cli arguments and starts the application
"""
parser = argparse.ArgumentParser(prog=sys.argv[0],
description="KiTT: Kivy Touch Tool")
parser.add_argument("-v", "--verbose",
dest="verbose",
action="store_true",
help="Enable verbose output")
parser.add_argument("-c", "--config",
dest="config",
action="store",
default="~/.kivy/kitt_config.json",
help="Select the gesture plugin")
parser.add_argument("-g", "--gestures",
dest="gestures",
action="store",
default="~/.kivy/kitt_gestures.json",
help="Select the gesture plugin")
parser.add_argument("-p", "--pid",
dest="pid",
action="store",
default="/tmp/kitt.pid",
help="Where to store PID file")
subparsers = parser.add_subparsers(
help='Daemon commands',
dest='commands')
def main(args):
"""
subfunction that launches the application
"""
sys.argv = sys.argv[0:1]
from kivy.logger import Logger, logging
log = Logger.getChild("KiTT")
if args.verbose:
Logger.setLevel(logging.DEBUG)
else:
Logger.setLevel(logging.ERROR)
from kivy.base import EventLoop, runTouchApp, stopTouchApp
from kivy.support import install_gobject_iteration
from listener import Listener
listener = Listener(args.config, args.gestures, EventLoop)
EventLoop.add_event_listener(listener)
UdevListener(install_gobject_iteration, EventLoop, listener, log).start()
runTouchApp()
class Main(Daemon):
"""
Daemonification class
"""
def run(self):
main(self.args)
def do_start(args):
Main(args.pid, args=args).start()
def do_stop(args):
Main(args.pid, args=args).stop()
def do_foreground(args):
main(args)
subparsers.add_parser('start',
help = "Start daemon").set_defaults(func=do_start)
subparsers.add_parser('stop',
help = "Stop daemon").set_defaults(func=do_stop)
subparsers.add_parser('foreground',
help = "Start in foreground").set_defaults(func=do_foreground)
args = parser.parse_args(sys.argv[1:])
args.func(args)
if __name__ == "__main__":
run()