summaryrefslogtreecommitdiffstats
path: root/Lib/curses/__init__.py
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2011-06-19 00:21:09 (GMT)
committerR David Murray <rdmurray@bitdance.com>2011-06-19 00:21:09 (GMT)
commitafc9a5eaa144eb246e22a16a6539821859fc08f5 (patch)
treecaebfc5b3710eadb3e67da29b9e9a687c9b814a6 /Lib/curses/__init__.py
parent50ae84e727b99c8000d2f6d03559dda90985a33d (diff)
downloadcpython-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__.py46
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()