TetaTricks/chap/curses.tex
2021-09-10 10:17:33 +02:00

82 lines
2.7 KiB
TeX

%
% 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)}