~gdesklets-desklet-team/gdesklets/trunk

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)