% % nouveau 20 juillet 2014 ave StExupery % \chapter{curses} \label{curses} \index{curses} En fait, nous allons plutôt parler de \textbf{ncurses} qui est l'implémentation actuelle de l'ancêtre \texttt{curses}. Voic ce qu'en dit une page de man~: \begin{quote} The ncurses library routines give the user a terminal-independent method of updating character screens with reasonable optimization. This implementation is ``new curses'' (ncurses) and is the approved replacement for 4.4BSD classic curses, which ha been discontinued. \end{quote} Plus concrètement, Curses est un moyen optimisé de gestion des écrans textes (Rappellez-vous notre ami le \textsc{Minitel}) afin de créer des interfaces 'full-screen'. Vous pouvez adresser chaque cellule de votre écran (la case où l'on peut mettre un caractère) pour y écrire quelque chose, en gérant des attributs tels que gras ou souligné. \section{Premier exemple} Bien entendu, nous commencerons par l'ECM traditionnel de rigueur. \lstinputlisting[language=C]{code/ex_curses.c} La première étape consiste à initialiser et configurer le moteur interne de ncurses, et à régler l'interaction clavier/écran. Ensuite, avec \texttt{mvaddstr}, nous écrivons le texte passé en paramètre à une position fixée ligne,colonne dans un écran virtuel (qui n'existe qu'en mémoire) qui sera ensuite transféré dans l'écran réel (celui qui est affiché) par le \texttt{refresh()}. Dans ma grande mansuétude, je n'aurais pas l'audace de vous montrer une capture d'écran, puisque je me permet de supposer que vous avez pris le temps de compiler l'exemple, et de voir par vous même ce que ça donne. \section{Bell and whistles} Voici comment centrer sur la ligne du haut un texte écrit en \textbf{gras} grace à l'attribut \texttt{A\_BOLD} : \begin{verbatim} attron(A_BOLD); mvaddstr(0, (COLS / 2) - (strlen(text) / 2), text); attroff(A_BOLD); \end{verbatim} Il existe tout un tas d'autres attributs: \texttt{A\_UNDERLINE} pour le soulignement ou \texttt{A\_BLINK} pour clignoter, par exemple. La liste complète est dans le man~: \texttt{attr(3NCURSES)}, avec plein de fonctions spécialisées dans le traitement des attributs. \section{Astuces} Dans une boucle interactive, on va utiliser \texttt{getch()}, qui va bloquer tant qu'on n'a pas tapé sur une touche. Mais que faire si on veut utiliser, en plus du clavier, un autre périphérique de saisie, genre un Joystick\index{joystick} ? Bien entendu, on peut utiliser \texttt{select(2)}, mais cela nécessite de connaitre le \textit{file descriptor} auquel est attaché le clavier. Dans le contexte classique, on peut assumer que ce sera le \texttt{fd} associé à \textit{stdin}, mais il est imprudent de compter là-dessus. ---> voir \texttt{newterm(3)}