1 """Event handling and generation.
3 The Event module manages event generation. Events are created by
4 EventSource instances. Each event source is associated with a file
5 handle. This handle will be poll()'ed and the eventsource will be
6 called, as sonn as input is available."""
8 import select, Logger, Node, Actions
12 def __init__(self, context, code):
13 self.context = context
16 def __getitem__(self, index):
17 rerturn (self.context, self.code)[index]
19 def __cmp__(self, other):
20 return cmp(self.context, other.context) or cmp(self.code, other.code)
23 return hash(self.context) ^ hash(self.code)
26 return repr((self.context, self.code))
29 class ControlEvent(Event):
31 def __init__(self, context, code, value):
32 Event.__init__(self, context, code)
36 return repr((self.context, self.code, self.value))
39 class EventSource(Node.Node):
41 def __init__(self, fd, context):
42 Node.Node.__init__(self)
44 self._context = context
53 return self._fd.fileno()
56 raise NotImplementedError
59 class Dispatcher(Node.Node):
61 _sources = Node.NodeMap()
63 def __init__(self, keylist):
64 Node.Node.__init__(self)
67 self._keylist = keylist
68 self._poller = select.poll()
71 self._idleCallback = None
73 def registerSource(self, eventSource):
74 self._sources[eventSource.fileno()] = eventSource
75 self._poller.register(eventSource.fileno(),select.POLLIN)
77 def unregisterSource(self, eventSource):
78 del self._sources[eventSource.fileno()]
79 self._poller.unregister(eventSource.fileno())
81 def registerCallback(self,cb):
82 self._callbacks.append(cb)
84 def unregisterCallback(self,cb):
85 self._callbacks.remove(cb)
87 def currentEvent(self):
90 def setIdleCallback(self, cb, interval):
91 self._interval = interval
92 self._idleCallback = cb
94 def unsetIdleCallback(self):
96 self._idleCallback = None
98 def emit(self, event):
99 binding = self._keylist.lookup(event)
100 if binding is not None:
107 for cb in self._callbacks : cb()
109 pollEvents = self._poller.poll(self._interval)
110 except select.error, v:
111 if v[0]==4 : continue
113 if not pollEvents and self._idleCallback:
115 for fd, pollEvent in pollEvents:
116 if pollEvent != select.POLLIN : return
117 for event in self._sources[fd].readEvents():
118 Logger.log('dispatcher', 'event: ' + str(event))
121 class EmitEvent(Actions.Action):
123 def __init__(self, name, dispatcher, event):
124 Actions.Action.__init__(self, name)
125 self._dispatcher = dispatcher
128 def __call__(self, binding):
129 self._dispatcher.emit(self._event)