Re: Curses and resizing windows



Nick ! <kousue@xxxxxxxxx> wrote:

http://web.cs.mun.ca/~rod/ncurses/ncurses.html#xterm says "The ncurses
library does not catch [the SIGWINCH aka resizing] signal, because it
cannot in general know how you want the screen re-painted". First, is
this really true? When I make my xterms smaller they clip what is

no - given that particular url is a file dating from 1995, it's something
that I overlooked in making corrections here:

http://invisible-island.net/ncurses/ncurses-intro.html

But also note where I link it from:

http://invisible-island.net/ncurses/ncurses.faq.html#additional_reading

displayed--is that a function of curses or the xterm?

both - xterm sends the signal, and curses receives it.

Second, if true, it explains /what/ is going on--stdscr, only--, but
isn't really satisfactory; it doesn't solve the original poster's bug.

#!/usr/bin/env python
"""
curses_resize.py -> run the program without hooking SIGWINCH
curses_resize.py 1 -> run the program with hooking SIGWINCH
"""


import sys, curses, signal, time

def sigwinch_handler(n, frame):
curses.endwin()
curses.initscr()

Actually I'd expect to see curses.refresh() here - but that may be a quirk
of the python code.

In general, ncurses passes a KEY_RESIZE via the getch() call that the
application (such as python) should process. If it's not reading from
getch(), ncurses' repainting/resizing won't happen.

Also, if you add your own signal handler, ncurses' SIGWINCH catcher won't
work. (I'd recommend chaining the signal handlers, but don't know if
python supports that ;-).

def main(stdscr):
"""just repeatedly redraw a long string to reveal the window boundaries"""
while 1:
stdscr.insstr(0,0,"abcd"*40)
time.sleep(1)

if __name__=='__main__':
if len(sys.argv)==2 and sys.argv[1]=="1":
signal.signal(signal.SIGWINCH, sigwinch_handler)
curses.wrapper(main)

--
Thomas E. Dickey
http://invisible-island.net
ftp://invisible-island.net
.


Quantcast