]> granicus.if.org Git - python/commitdiff
(Merge 3.2) Fix curses module for strict SysV implementation (without has_key function)
authorVictor Stinner <victor.stinner@haypocalc.com>
Mon, 28 Nov 2011 23:06:10 +0000 (00:06 +0100)
committerVictor Stinner <victor.stinner@haypocalc.com>
Mon, 28 Nov 2011 23:06:10 +0000 (00:06 +0100)
1  2 
Lib/curses/__init__.py

index 61ce443a68592e4020dc26e2b175c0009862ac48,a3e9def72a27a240ad9bd7d5450261ad427c36c2..7bfa6673d75c4bda002c175c9770658ea57ade87
@@@ -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()