| """curses.wrapper |
| |
| Contains one function, wrapper(), which runs another function which |
| should be the rest of your curses-based application. If the |
| application raises an exception, wrapper() will restore the terminal |
| to a sane state so you can read the resulting traceback. |
| |
| """ |
| |
| import curses |
| |
| def wrapper(func, *args, **kwds): |
| """Wrapper function that initializes curses and calls another function, |
| restoring normal keyboard/screen behavior on error. |
| The callable object 'func' is then passed the main window 'stdscr' |
| as its first argument, followed by any other arguments passed to |
| wrapper(). |
| """ |
| |
| 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 |
| |
| return func(stdscr, *args, **kwds) |
| finally: |
| # Set everything back to normal |
| if 'stdscr' in locals(): |
| stdscr.keypad(0) |
| curses.echo() |
| curses.nocbreak() |
| curses.endwin() |