diff options
author | R David Murray <rdmurray@bitdance.com> | 2011-06-19 00:21:09 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2011-06-19 00:21:09 (GMT) |
commit | afc9a5eaa144eb246e22a16a6539821859fc08f5 (patch) | |
tree | caebfc5b3710eadb3e67da29b9e9a687c9b814a6 /Lib/curses/__init__.py | |
parent | 50ae84e727b99c8000d2f6d03559dda90985a33d (diff) | |
download | cpython-afc9a5eaa144eb246e22a16a6539821859fc08f5.zip cpython-afc9a5eaa144eb246e22a16a6539821859fc08f5.tar.gz cpython-afc9a5eaa144eb246e22a16a6539821859fc08f5.tar.bz2 |
#6771: Move wrapper function into __init__ and eliminate wrapper module
Andrew agreed in the issue that eliminating the module file made sense.
Wrapper has only been exposed as a function, and so there is no (easy)
way to access the wrapper module, which in any case only had the one
function in it. Since __init__ already contains a couple wrapper
functions, it seems to make sense to just move wrapper there instead of
importing it from a single function module.
Diffstat (limited to 'Lib/curses/__init__.py')
-rw-r--r-- | Lib/curses/__init__.py | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/Lib/curses/__init__.py b/Lib/curses/__init__.py index bd7d5f6..5cd4eda 100644 --- a/Lib/curses/__init__.py +++ b/Lib/curses/__init__.py @@ -13,7 +13,6 @@ the package, and perhaps a particular module inside it. __revision__ = "$Id$" from _curses import * -from curses.wrapper import wrapper import os as _os import sys as _sys @@ -57,3 +56,48 @@ try: has_key except NameError: from has_key import has_key + +# Wrapper for the entire curses-based application. Runs a 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. + +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 = initscr() + + # Turn off echoing of keys, and enter cbreak mode, + # where no buffering is performed on keyboard input + noecho() + 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: + start_color() + except: + pass + + return func(stdscr, *args, **kwds) + finally: + # Set everything back to normal + if 'stdscr' in locals(): + stdscr.keypad(0) + echo() + nocbreak() + endwin() |