diff --git a/Lib/curses/__init__.py b/Lib/curses/__init__.py new file mode 100644 index 00000000000..8e8f7d8bb7d --- /dev/null +++ b/Lib/curses/__init__.py @@ -0,0 +1,18 @@ +"""curses + +The main package for curses support for Python. Normally used by importing +the package, and perhaps a particular module inside it. + + import curses + from curses import textpad + curses.initwin() + ... + +""" + +__revision__ = "$Id$" + +from _curses import * +from curses.wrapper import wrapper + + diff --git a/Lib/curses/wrapper.py b/Lib/curses/wrapper.py new file mode 100644 index 00000000000..1de17ee5d1b --- /dev/null +++ b/Lib/curses/wrapper.py @@ -0,0 +1,50 @@ +"""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 + +def wrapper(func, *rest): + """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(). + """ + + res = None + 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) + + res = apply(func, (stdscr,) + rest) + except: + # In the event of an error, restore the terminal + # to a sane state. + stdscr.keypad(0) + curses.echo() ; curses.nocbreak() + curses.endwin() + # Pass the exception upwards + (exc_type, exc_value, exc_traceback) = sys.exc_info() + raise exc_type, exc_value, exc_traceback + else: + # Set everything back to normal + stdscr.keypad(0) + curses.echo() ; curses.nocbreak() + curses.endwin() # Terminate curses + + return res +