% % 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}. Voici 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{Les principes} \begin{itemize} \item{Indépendance de l'écran physique} \item{Fenêtre et sous-fenêtre} \item{Deux écrans : stdscr et curscr} \end{itemize} Au tout début était le terminal canonique, la \textsc{Teletype}. C'est dans le doux cliquetis de la vénérable \texttt{ASR33} que se sont échaffaudées les premières lignes du code, écrites avec \textsl{the only true one}\footnote{ed}. Ensuite sont arrivés les terminaux à écran vidéo, les fameuses \textsl{Glass TTYs}, qui ne tardèrent pas à se munir d'un curseur adressable, ce qui permet alors d'écrire un caractère à n'importe quelle endroit de l'écran. Adm3a, vt52, Qume 60... Une structure essentielle dans curses est l'écran, appelé \textsl{screen} dans l'original. C'est une matrice rectangulaire de cellules caractère/attribut et quelques données associées. Pourquoi deux écrans ? La mécanique interne de curses maintient en interne deux écrans (qui sont en fait des fenêtres de la taille de l'écran physique) connus sous les noms de \texttt{stdscr} et \texttt{curscr}. Le premier est celui que voit l'application, et qu'il peut manipuler avec les fonctions (genre \texttt{mvaddstr}) que nous verrons très bientôt. Et le second est l'image que se fait la mécanique de l'écran physique, donc ce que voit le yuser. % ========================================================= \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{Les fenêtres} % ========================================================= \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)}