mirror of
https://github.com/python/cpython.git
synced 2025-07-19 01:05:26 +00:00

[ 1005008 ] curses.wrapper should also forward keyword args Plus my rewrite to use finally as opposed to painfully doing the equivalent by hand.
50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
"""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, *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().
|
|
"""
|
|
|
|
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)
|
|
|
|
# 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
|
|
|
|
return func(stdscr, *rest)
|
|
finally:
|
|
# Set everything back to normal
|
|
stdscr.keypad(0)
|
|
curses.echo()
|
|
curses.nocbreak()
|
|
curses.endwin()
|