| """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() |