3
# ScreenletsDaemon - (c) RYX (Rico Pfaus) 2007
6
# This is a background daemon that keeps track of opened screenlets. The
7
# screenlets.session.ScreenletSession currently (ab)uses this as a workaround
8
# for the incomplete pyinotify-support in common distros.
11
# - use a filewatch on '/tmp/screenlets/screenlets.running' instead of
12
# requring screenlets to register themselves with the daemon??
17
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
22
from screenlets import utils
24
SLD_BUS = 'org.screenlets.ScreenletsDaemon'
25
SLD_PATH = '/org/screenlets/ScreenletsDaemon'
26
SLD_IFACE = 'org.screenlets.ScreenletsDaemon'
29
class ScreenletsDaemon (dbus.service.Object):
30
"""A simple backend class where screenlets register and unregister. It
31
offers functions to keep track of currently opened screenlets."""
34
# create bus, call super
35
session_bus = dbus.SessionBus()
36
bus_name = dbus.service.BusName(SLD_BUS, bus=session_bus)
37
dbus.service.Object.__init__(self, bus_name, SLD_PATH)
39
self.running_screenlets = []
40
# get list of currently open screenlets from system
41
running = utils.list_running_screenlets()
43
self.running_screenlets = running
45
@dbus.service.method(SLD_IFACE)
46
def get_running_screenlets (self):
47
"""Get a list of all currently running screenlets."""
48
return self.running_screenlets
50
@dbus.service.method(SLD_IFACE)
51
def register_screenlet (self, name):
52
"""Register the screenlet with the given name as running."""
53
self.running_screenlets.append(name)
54
self.screenlet_registered(name) # send signal
55
print "ScreenletsDaemon: registered %s" % name
57
@dbus.service.method(SLD_IFACE)
58
def unregister_screenlet (self, name):
59
"""Unregister the screenlet with the given name from the list."""
60
if self.running_screenlets.count(name):
61
self.running_screenlets.remove(name)
62
self.screenlet_unregistered(name) # send signal
63
print "screenletsDaemon: unregistered %s" % name
65
@dbus.service.signal(SLD_IFACE)
66
def screenlet_registered (self, name):
67
"""Send the 'register'-signal over DBus."""
70
@dbus.service.signal(SLD_IFACE)
71
def screenlet_unregistered (self, name):
72
"""Send the 'unregister'-signal over DBus."""
76
if __name__ == '__main__':
77
# check for running daemon
79
proc = os.popen("ps axo \"%p,%a\" | grep \"screenlets-daemon.py\" | grep -v grep|cut -d',' -f1").read()
80
procs = proc.split('\n')
82
pid = int(procs[0].strip())
89
daemon = ScreenletsDaemon()
90
print 'ScreenletsDaemon running ...'
94
loop = gobject.MainLoop()
96
except KeyboardInterrupt:
97
# notify when daemon is closed
98
#service.notify('Screenlets-backend has been shut down .... ', 5000)
99
print 'ScreenletsDaemon has been shut down ...'
100
except Exception, ex:
101
print "Exception in ScreenletsDaemon: %s" % ex