I'm programming in C using ncurses libraries (it's the first time) and I've two problems. I'm on ubuntu with the default terminal (gnome terminal).
1) I need to resize the terminal. I used resizeter() and resize_term(), but they fail.
2) I use scrollok() function and the problem is that I lose scrolled lines (when I get back with wscrl(), there are blank lines).
#include <ncurses.h>
int main() {
WINDOW *win, *win2;
int i;
char c;
initscr();
cbreak();
noecho();
win=newwin(8,20,1,1);
box(win,0,0);
win2=newwin(6,18,2,2);
scrollok(win2,1);
wrefresh(win);
wrefresh(win);
for(i=0;i<15;i++){
c=wgetch(win2);
if(c=='u'){
wscrl(win2,-1);
wrefresh(win2);
}
else{
wprintw(win2,"%c\n",c);
wrefresh(win2);
}
}
delwin(win);
delwin(win2);
endwin();
return 0;
}
POSIX does not cover this case, because the curses document is not part of POSIX. The Open Group happens to maintain documentation for both:
- X/Open CURSES Issue 4 Version 2 (overview)
- X/Open Curses, Issue 4 Version 2 (documentation)
- The Open Group Base Specifications Issue 7
IEEE Std 1003.1, 2013 Edition (aka "POSIX")
signal.h
(note that SIGWINCH
is absent)
As noted in the manual page for resizeterm
, you should not call that function from within a signal handler, because it calls "unsafe" functions. The topic of "unsafe" functions is discussed in several places; that in gcc's documentation would do for a start.
Regarding documentation, @larsmans appears to be quoting from scroll(3)
, but not citing comparable links for ncurses and "POSIX". For what it's worth:
- ncurses (seems to address the points implied to be unique to NetBSD)
- X/Open (is necessarily more general, as it is intended to cover different implementations)
Back to OP's question:
- the sample program does not show OP's use of
resizeterm
nor of resize_term
. It is not stated, but presumably OP resized the terminal window and the program did not respond. The manual page for resizeterm
is clear enough that ncurses does not cause the terminal to resize. For that (on some terminals), one can use the -s
option of resize
(a utility program for xterm
). If successful, that resizes the terminal, which in turn sends a SIGWINCH
.
ncurses has a predefined signal handler for that, but at the application level, handling KEY_RESIZE
is the recommended way. There are several programs in ncurses-examples which do this.
- moving the lines up in a window necessarily moves some out of the window. That implies that lines are shifted into the window to replace those which have left. A "window" is just that: a limited-size view of data. For views with different size, the developer is advised to use "pads" (see manual page). The notes in the scroll manual page mention some issues with the color of blanks (the replacement lines). It is up to the application whether to leave the replacements blank or fill them with the application's data. Curses does not do that automatically (not even for pads).
You can't resize the terminal window from ncurses but you can resize the terminal which the resize system call.
#include <ncurses.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
WINDOW *ventana1;
system("resize -s 30 80");
initscr();
start_color();
ventana1 = newwin(15, 50, 0, 0);
init_pair(1,COLOR_YELLOW,COLOR_BLUE);
init_pair(2,COLOR_BLUE, COLOR_YELLOW);
wbkgd(ventana1,COLOR_PAIR(1));
wprintw(ventana1, "POLLO");
wrefresh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
system("resize -s 20 60");
wbkgd(ventana1,COLOR_PAIR(2));
wprintw(ventana1, "POLLO");
wrefresh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
system("resize -s 35 85");
system("clear");
wbkgd(ventana1,COLOR_PAIR(1));
wprintw(ventana1, "POLLO");
wrefresh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
delwin(ventana1);
endwin();
system("resize -s 25 75");
}