Je programme en C en utilisant des bibliothèques ncurses (c‘est la première fois) et j’ai deux problèmes. Je suis sur Ubuntu avec le terminal par défaut (terminal gnome).
1) J’ai besoin de redimensionner le terminal. J’ai utilisé resizeter () et resize_term (), mais ils échouent.
2) J’utilise la fonction scrollok () et le problème est que je perds les lignes défilées (quand je reviens avec wscrl (), il y a des lignes vides).
#include 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; }
Vous ne pouvez pas redimensionner la fenêtre du terminal à partir de ncurses. Les fonctions que vous mentionnez redimensionnent la partie de la fenêtre du terminal peinte par des curses. L’idée est que vous SIGWINCH
signal SIGWINCH
et appelez resizeterm
dans le gestionnaire lorsque l’utilisateur redimensionne la fenêtre de l’extérieur de l’application (à l’aide de la souris, probablement).
Ce comportement est prévu, bien que mal documenté dans ncurses et dans le standard Unix / POSIX. La documentation de NetBSD sur les sorts l’ indique explicitement:
Si n est positif,
stdscr
fait défiler l’stdscr
vers le haut. n lignes sont perdues en haut destdscr
et n lignes vides sont insérées en bas. Si n est négatif,stdscr
fait défiler la liste. n lignes vides sont insérées en haut destdscr
et n lignes sont perdues en bas.
Vous devrez donc enregistrer manuellement les entrées et les réimprimer lors du défilement.
Vous ne pouvez pas redimensionner la fenêtre du terminal à partir de ncurses mais vous pouvez redimensionner le terminal avec lequel l’appel système est redimensionné .
#include #include 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"); }
POSIX ne couvre pas ce cas, car le document curses ne fait pas partie de POSIX. Il arrive que le groupe ouvert maintienne la documentation pour les deux:
signal.h
(notez que SIGWINCH
est absent) Comme indiqué dans la page de manuel de resizeterm
, vous ne devez pas appeler cette fonction depuis un gestionnaire de signaux, car elle appelle des fonctions “non sécurisées”. Le sujet des fonctions “dangereuses” est abordé à plusieurs endroits; que dans la documentation de gcc ferait pour commencer.
En ce qui concerne la documentation, @larsmans semble citer scroll(3)
, mais ne cite pas de liens comparables pour ncurses et “POSIX”. Pour ce que ça vaut:
Retour à la question de OP:
resizeterm
ni de resize_term
. Ce n’est pas indiqué, mais OP a vraisemblablement redimensionné la fenêtre du terminal et le programme n’a pas répondu. La page de manuel relative à resizeterm
est suffisamment claire pour que ncurses ne provoque pas le redimensionnement du terminal. Pour cela (sur certains terminaux), on peut utiliser l’option -s
de resize
(un programme utilitaire pour xterm
). En cas de succès, le terminal est redimensionné, ce qui envoie à son tour un SIGWINCH
. ncurses a un gestionnaire de signal prédéfini pour cela, mais au niveau de l’ application , la gestion de KEY_RESIZE
est la méthode recommandée. Il existe plusieurs programmes dans ncurses-examples qui le font.