def wait(self, *tasks: Awaitable) -> Any:
     """
     Wait until one of the passed tasks finishes, and return the result,
     while servicing the wire context.  If a message comes until one of the
     tasks ends, `UnexpectedMessageError` is raised.
     """
     return loop.race(self.read_any(()), *tasks)
    async def handle_input(self) -> None:
        touch = loop.wait(io.TOUCH)
        timeout = loop.sleep(1000)
        race_touch = loop.race(touch)
        race_timeout = loop.race(touch, timeout)

        while True:
            if self.pending_button is not None:
                race = race_timeout
            else:
                race = race_touch
            result = await race

            if touch in race.finished:
                event, x, y = result
                self.dispatch(event, x, y)
            else:
                self.on_timeout()