Redimensionner le terminal et le problème de défilement avec ncurses

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; } 

  1. 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).

  2. 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 de stdscr 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 de stdscr 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:

  • X / Open CURSES Version 4 Version 2 (aperçu)
  • X / Open Curses, Numéro 4, version 2 (documentation)
  • Spécifications du groupe ouvert, édition 7, normes IEEE 1003.1, 2013 (alias “POSIX”)
  • 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:

  • ncurses (semble traiter les points supposés être uniques à NetBSD)
  • X / Open (est nécessairement plus général, car il est destiné à couvrir différentes implémentations)

Retour à la question de OP:

  1. l’exemple de programme ne montre pas l’utilisation par OP de 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.
  2. déplacer les lignes dans une fenêtre en déplace nécessairement certaines hors de la fenêtre. Cela implique que les lignes sont décalées dans la fenêtre pour remplacer celles qui sont restées. Une “fenêtre” n’est que cela: une vue limitée des données. Pour les vues de taille différente, le développeur est invité à utiliser des “pads” (voir page de manuel ). Les notes de la page de manuel de défilement mentionnent certains problèmes liés à la couleur des blancs (les lignes de remplacement). Il appartient à l’application de laisser les remplacements en blanc ou de les renseigner avec les données de l’application. Curses ne le fait pas automatiquement (pas même pour les pads).