From: Victor Stinner Date: Mon, 28 Nov 2011 23:06:10 +0000 (+0100) Subject: (Merge 3.2) Fix curses module for strict SysV implementation (without has_key function) X-Git-Tag: v3.3.0a1~716 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5d7c9aba29ee73ce5708f97beb1371222cc5889e;p=python (Merge 3.2) Fix curses module for strict SysV implementation (without has_key function) --- 5d7c9aba29ee73ce5708f97beb1371222cc5889e diff --cc Lib/curses/__init__.py index 61ce443a68,a3e9def72a..7bfa6673d7 --- a/Lib/curses/__init__.py +++ b/Lib/curses/__init__.py @@@ -53,49 -54,4 +53,49 @@@ def start_color() try: has_key except NameError: - from has_key import has_key + 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()