def run(self):
        '''The main entry point of a :mod:`jcn`-based application. :meth:`run`
        sets up the terminal and then runs then event loop, continually
        responding to user input and drawing UI element to the screen when
        required.

        Specifically, :mod:`jcn` applications run the terminal full-screen and
        with the cursor hidden, and set :attr:`sys.stdin` to unbuffered and
        non-blocking so that we can respond immediately to any keystrokes from
        the user. We also correctly handle being suspended (:kbd:`Control-z`,
        SIGTSTP) and resumed, and the terminal window being resized.

        We run :mod:`asyncio` event loop inside context managers that will
        handle exceptions gracefully and return the terminal to the previous
        state before exiting. Aren't we nice ;-)
        '''
        with self.terminal.fullscreen(), self.terminal.hidden_cursor(), (
                self.terminal.unbuffered_input()), (
                self.terminal.nonblocking_input()), (
                self._handle_screen_resize()):
            def read_stdin():
                data = self.terminal.infile.read()
                unhandled_input = self.element.handle_input(
                    self.keyboard[data])
                if unhandled_input:
                    self.handle_input(unhandled_input)
            if self.terminal.infile.isatty():
                self.loop.add_reader(self.terminal.infile, read_stdin)
            self.draw()
            self.loop.run_forever()