Andrew M. Kuchling | d0939fa | 2000-06-10 23:06:53 +0000 | [diff] [blame] | 1 | """curses.wrapper |
| 2 | |
| 3 | Contains one function, wrapper(), which runs another function which |
| 4 | should be the rest of your curses-based application. If the |
| 5 | application raises an exception, wrapper() will restore the terminal |
| 6 | to a sane state so you can read the resulting traceback. |
| 7 | |
| 8 | """ |
| 9 | |
Christian Heimes | 05e8be1 | 2008-02-23 18:30:17 +0000 | [diff] [blame] | 10 | import curses |
Andrew M. Kuchling | d0939fa | 2000-06-10 23:06:53 +0000 | [diff] [blame] | 11 | |
Michael W. Hudson | 09ad235 | 2004-08-07 15:18:07 +0000 | [diff] [blame] | 12 | def wrapper(func, *args, **kwds): |
Andrew M. Kuchling | d0939fa | 2000-06-10 23:06:53 +0000 | [diff] [blame] | 13 | """Wrapper function that initializes curses and calls another function, |
| 14 | restoring normal keyboard/screen behavior on error. |
| 15 | The callable object 'func' is then passed the main window 'stdscr' |
| 16 | as its first argument, followed by any other arguments passed to |
| 17 | wrapper(). |
| 18 | """ |
Guido van Rossum | bffa52f | 2002-09-29 00:25:51 +0000 | [diff] [blame] | 19 | |
Andrew M. Kuchling | 8f790fe | 2000-06-27 00:50:40 +0000 | [diff] [blame] | 20 | res = None |
Andrew M. Kuchling | d0939fa | 2000-06-10 23:06:53 +0000 | [diff] [blame] | 21 | try: |
Guido van Rossum | bffa52f | 2002-09-29 00:25:51 +0000 | [diff] [blame] | 22 | # Initialize curses |
Jeremy Hylton | 2ea17fa | 2000-07-07 21:02:22 +0000 | [diff] [blame] | 23 | stdscr=curses.initscr() |
Guido van Rossum | bffa52f | 2002-09-29 00:25:51 +0000 | [diff] [blame] | 24 | |
| 25 | # Turn off echoing of keys, and enter cbreak mode, |
| 26 | # where no buffering is performed on keyboard input |
Jeremy Hylton | 2ea17fa | 2000-07-07 21:02:22 +0000 | [diff] [blame] | 27 | curses.noecho() |
| 28 | curses.cbreak() |
Andrew M. Kuchling | d0939fa | 2000-06-10 23:06:53 +0000 | [diff] [blame] | 29 | |
Guido van Rossum | bffa52f | 2002-09-29 00:25:51 +0000 | [diff] [blame] | 30 | # In keypad mode, escape sequences for special keys |
| 31 | # (like the cursor keys) will be interpreted and |
| 32 | # a special value like curses.KEY_LEFT will be returned |
Andrew M. Kuchling | d0939fa | 2000-06-10 23:06:53 +0000 | [diff] [blame] | 33 | stdscr.keypad(1) |
| 34 | |
Eric S. Raymond | 1ebd3f6 | 2000-08-09 21:11:07 +0000 | [diff] [blame] | 35 | # Start color, too. Harmless if the terminal doesn't have |
| 36 | # color; user can test with has_color() later on. The try/catch |
| 37 | # works around a minor bit of over-conscientiousness in the curses |
| 38 | # module -- the error return from C start_color() is ignorable. |
| 39 | try: |
| 40 | curses.start_color() |
| 41 | except: |
| 42 | pass |
| 43 | |
Michael W. Hudson | 3fdd43e | 2004-08-07 15:20:15 +0000 | [diff] [blame] | 44 | return func(stdscr, *args, **kwds) |
Michael W. Hudson | 09ad235 | 2004-08-07 15:18:07 +0000 | [diff] [blame] | 45 | finally: |
Guido van Rossum | bffa52f | 2002-09-29 00:25:51 +0000 | [diff] [blame] | 46 | # Set everything back to normal |
Jeremy Hylton | 2ea17fa | 2000-07-07 21:02:22 +0000 | [diff] [blame] | 47 | stdscr.keypad(0) |
| 48 | curses.echo() |
| 49 | curses.nocbreak() |
Michael W. Hudson | 09ad235 | 2004-08-07 15:18:07 +0000 | [diff] [blame] | 50 | curses.endwin() |