1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
from adl.ADLParser import ADLParser
from dom.DOM import DOM
from dom import events
import interactors
import winsys
from utils import vfs
import os, sys
class Desklet(object):
def __init__(self, adlfile, id='id0'):
# the current window
self.__window = None
# the interactors of this desklet
self.__interactors = []
data = self.__read_adlfile(adlfile)
adl = ADLParser(data, adlfile)
# FIXME: the ID should be given by the starting entity (e.g. daemon)
self.__id = id
self.__dom = DOM(self, self.__id, adl.get_irepr())
# load some standard interactors
self.__rendering = interactors.load_interactor("rendering")
self.attach_interactor(self.__rendering)
self.__scripting = interactors.load_interactor("scripting")
self.attach_interactor(self.__scripting)
self.__dom.introduce()
# create a window, desktop style
window = winsys.get_winsys("desktop").new_window()
self.set_window(window)
(self.__dom.notify_script(None, s) for s in adl.get_scriptlets())
def __read_adlfile(self, adlfile):
data = ""
try:
data = vfs.read_entire_file(os.path.abspath(adlfile))
except IOError:
sys.exit(1)
return data
def __on_event(self, x, y, ev_name, ev_value):
"""
Handles window events.
"""
if (ev_name == events.CLOSE):
self.close()
else:
self.__dom.send_event(x, y, ev_name, ev_value)
def attach_interactor(self, ia):
"""
Adds the given interactor to the DOM.
"""
self.__interactors.append(ia)
ia.set_desklet(self)
def handle_dom_update(self, ident, cmd, *args):
# TODO: only send events to interactors that are interested
for ia in self.__interactors: ia.update_handler(ident, cmd, *args)
def send_event(self, *args):
"""
Sends an event to this desklet.
"""
self.__dom.send_event(*args)
def get_dom(self):
return self.__dom
def get_id(self):
return self.__id
def set_window(self, window):
"""
Sets the window to use for this desklet. The window can be changed
at runtime, e.g. to move desklets between different window systems.
"""
self.__window = window
window.add_observer(self.__on_event)
self.__rendering.reconnect()
def get_window(self):
return self.__window
def close(self):
self.__interactors = []
winsys.get_winsys("desktop").destroy_window(self.__window)
|