Searching for a working example of a curses application that resizes in xterm

S

schwerdy

Hi together,

can someone provide an example of a curses application that works in a
xterm that can be resized?

I could not find any working example yet...

Thanks in advance,
Sebastian 'Schwerdy' Schwerdhöfer
 
T

Thomas Guettler

Am Mon, 19 Sep 2005 03:40:38 -0700 schrieb schwerdy:
Hi together,

can someone provide an example of a curses application that works in a
xterm that can be resized?

I could not find any working example yet...

Hi,

You should find this in the C source of "mutt" or "less".

HTH,
Thomas
 
F

Fredrik Lundh

G

Grant Edwards

can someone provide an example of a curses application that works in a
xterm that can be resized?

I'm afraid I can't post the entire program, but what you need
to do is to catch the WINCH signal and set a flag which is
checked by your main "event" loop and handled. Here's the
basic C code:

static void sigwinchHandler(int sig)
{
(void) sig;
sigwinchReceived = 1;
}

static void clipWindows(void)
{
tCh *ch;
int x,y,rows,cols;

for (ch = chlist; ch != NULL; ch = ch->next)
{
getbegyx(ch->win,y,x);
getmaxyx(ch->win,rows,cols);
clipwin(&rows,&cols,&y,&x);
moveWindow(ch,rows,cols,y,x);
}
}


main()
{
[...]
sigact.sa_handler = sigwinchHandler;
s = sigaction(SIGWINCH, &sigact, NULL);
assert(s==0);


// start up curses
while (1)
{
// do stuff
if (sigwinchReceived)
{
struct winsize size;
if (ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0)
{
resizeterm(size.ws_row, size.ws_col);
clipWindows();
}
sigwinchReceived = 0;
}
}
}
 
S

schwerdy

Thanks, but I had already read these discussions (hope the grammar is
correct...), and thought I understood them. But my exact problem: If I
resize a xterm, in most cases curses prints crap (if it does not crash
python). And I could not find any python-curses application that is
displayed correctly after a terminal resize.

I hope nobody will kill me, 'cause I'm a spammer; here is my example:

------
import curses

def gettermres():
"""
returns the current terminal size in columns and lines
"""
import struct, fcntl, sys, termios
lines, cols = struct.unpack("HHHH",
fcntl.ioctl(sys.stdout.fileno(),termios.TIOCGWINSZ, struct.pack("HHHH",
0, 0, 0, 0)))[:2]
return cols, lines

def splitwin(scr, extend1, axis=0, isPercent=True,
useFullScreen=False):
"""
splits the scr in 2 windows and return both
extend1 is the size of the first window
axis=0 --> split horizontal
axis=1 --> split vertical
if isPercent is False, extend1 will be interpreted as absolut size
"""
if isPercent and not 0 < extend1 < 100:
raise "extend1 must be between 0 and 100"
if not axis in (0,1):
raise "axis must be 0 or 1"

if useFullScreen:
res = [0,0]
res[1], res[0] = gettermres()
pos = (0,0)
else:
res = scr.getmaxyx()
pos = scr.getbegyx()

size1 = list(res)
size2 = list(res)

if isPercent:
totallen = float(res[axis])
size1[axis] = int( totallen*extend1 / 100 )
else:
size1[axis] = extend1

size2[axis] = res[axis] - size1[axis]
start1 = list(pos)
start2 = list(pos)
start2[axis] = size1[axis]

win1 = curses.newwin(size1[0], size1[1], start1[0], start1[1])
win2 = curses.newwin(size2[0], size2[1], start2[0], start2[1])

return win1, win2

def startcurses(stdscr):
curses.use_default_colors() # transparency
curses.init_pair(2, curses.COLOR_GREEN, -1)

while 1:
curses.setupterm()
winTop, winBottom = splitwin(stdscr, 80, useFullScreen=True)
winLeft, winRight = splitwin(winTop, 50, 1)
winLeft.border()
winLeft.noutrefresh()
winRight.border()
winRight.addstr(1,1,"hallo", curses.color_pair(2))
winRight.noutrefresh()
winBottom.border()
winBottom.noutrefresh()
curses.doupdate()
k = winLeft.getch()
if k == ord('q'):
break

curses.wrapper(startcurses)
------
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,175
Latest member
Vinay Kumar_ Nevatia
Top