diff options
Diffstat (limited to 'asciifarm/client/main.py')
| -rw-r--r-- | asciifarm/client/main.py | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/asciifarm/client/main.py b/asciifarm/client/main.py index f6cf7e3..c00b592 100644 --- a/asciifarm/client/main.py +++ b/asciifarm/client/main.py @@ -26,7 +26,29 @@ def main(argv=None): os.environ.setdefault("ESCDELAY", "25") - def start(stdscr): + try: + # Initialize curses + stdscr = curses.initscr() + + # Turn off echoing of keys, and enter cbreak mode, + # where no buffering is performed on keyboard input + curses.noecho() + curses.cbreak() + + # In keypad mode, escape sequences for special keys + # (like the cursor keys) will be interpreted and + # a special value like curses.KEY_LEFT will be returned + stdscr.keypad(1) + + # Start color, too. Harmless if the terminal doesn't have + # color; user can test with has_color() later on. The try/catch + # works around a minor bit of over-conscientiousness in the curses + # module -- the error return from C start_color() is ignorable. + try: + curses.start_color() + except: + pass + display = Display(stdscr, characters, colours) client = Client(stdscr, display, name, connection, keybindings, logfile) try: @@ -36,12 +58,16 @@ def main(argv=None): except Exception as e: # throw the execption outside ncurses # so the cleanup can happen first - nonlocal error error = e - nonlocal closeMessage closeMessage = client.closeMessage - - curses.wrapper(start) + finally: + # Set everything back to normal + if 'stdscr' in locals(): + stdscr.keypad(0) + curses.echo() + curses.nocbreak() + curses.endwin() + if error is not None: raise error |
