|
|
@@ -0,0 +1,84 @@
|
|
|
+from touch import MultitouchServer, screen_size
|
|
|
+
|
|
|
+
|
|
|
+W, H = screen_size
|
|
|
+
|
|
|
+
|
|
|
+def convert_to_pixels(x, y):
|
|
|
+ return x * W, y * H
|
|
|
+
|
|
|
+
|
|
|
+class EventWindow(object):
|
|
|
+ def __init__(self, divider=None):
|
|
|
+ self.handlers = {}
|
|
|
+ self.divider = divider
|
|
|
+
|
|
|
+ def set_position(self, x, y):
|
|
|
+ self.x = x
|
|
|
+ self.y = y
|
|
|
+
|
|
|
+ def set_size(self, width, height):
|
|
|
+ self.width = width
|
|
|
+ self.height = height
|
|
|
+
|
|
|
+ def contains_coords(self, x, y):
|
|
|
+ return self.x <= x < self.x + self.width \
|
|
|
+ and self.y <= y < self.y + self.height
|
|
|
+
|
|
|
+ def bind(self, name, handler, *args, **kwargs):
|
|
|
+ if name not in self.handlers:
|
|
|
+ self.handlers[name] = []
|
|
|
+
|
|
|
+ self.handlers[name].append((handler, args, kwargs))
|
|
|
+ self.divider.bind_event_name(name, self)
|
|
|
+
|
|
|
+ def trigger(self, event):
|
|
|
+ """
|
|
|
+ Call all handlers bound to the name of the triggered event.
|
|
|
+ """
|
|
|
+ # Convert event coordinates to offset coordinates
|
|
|
+ offset_event = event.create_offset_event(self.x, self.y)
|
|
|
+
|
|
|
+ name = event.__class__._name
|
|
|
+
|
|
|
+ if name in self.handlers:
|
|
|
+ for handler, args, kwargs in self.handlers[name]:
|
|
|
+ handler(offset_event, *args, **kwargs)
|
|
|
+
|
|
|
+
|
|
|
+class EventDivider(object):
|
|
|
+ def __init__(self):
|
|
|
+ self.server = MultitouchServer()
|
|
|
+ self.windows = []
|
|
|
+
|
|
|
+ def create_window(self, x, y, width, height):
|
|
|
+ window = EventWindow()
|
|
|
+ window.set_position(x, y)
|
|
|
+ window.set_size(width, height)
|
|
|
+ self.add_window(window)
|
|
|
+
|
|
|
+ return window
|
|
|
+
|
|
|
+ def add_window(self, window):
|
|
|
+ window.divider = self
|
|
|
+ self.windows.append(window)
|
|
|
+
|
|
|
+ def start_server(self):
|
|
|
+ self.server.start()
|
|
|
+
|
|
|
+ def bind_event_name(self, name, window):
|
|
|
+ self.server.bind(name, self.trigger, window)
|
|
|
+
|
|
|
+ def trigger(self, event, window):
|
|
|
+ if window.contains_coords(*event.pixel_coords()):
|
|
|
+ window.trigger(event)
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ def tap(event):
|
|
|
+ print 'tap:', event
|
|
|
+
|
|
|
+ div = EventDivider()
|
|
|
+ win = div.create_window(100, 100, 640, 480)
|
|
|
+ win.bind('tap', tap)
|
|
|
+ div.start_server()
|