wrapper.py 1.61 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
"""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 sys, curses

Michael W. Hudson's avatar
Michael W. Hudson committed
12
def wrapper(func, *args, **kwds):
13 14 15 16 17 18
    """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().
    """
19

20
    res = None
21
    try:
22
        # Initialize curses
23
        stdscr=curses.initscr()
24 25 26

        # Turn off echoing of keys, and enter cbreak mode,
        # where no buffering is performed on keyboard input
27 28
        curses.noecho()
        curses.cbreak()
29

30 31 32
        # 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
33 34
        stdscr.keypad(1)

35 36 37 38 39 40 41 42 43
        # 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

44
        return func(stdscr, *args, **kwds)
Michael W. Hudson's avatar
Michael W. Hudson committed
45
    finally:
46
        # Set everything back to normal
47 48 49
        stdscr.keypad(0)
        curses.echo()
        curses.nocbreak()
Michael W. Hudson's avatar
Michael W. Hudson committed
50
        curses.endwin()