2020-09-28 02:29:13 +11:00
|
|
|
%
|
|
|
|
% nouveau 20 juillet 2014 ave StExupery
|
|
|
|
%
|
|
|
|
\chapter{curses}
|
|
|
|
\label{curses}
|
|
|
|
\index{curses}
|
|
|
|
|
|
|
|
En fait, nous allons plutôt parler de \textbf{ncurses} qui est
|
2021-12-24 06:06:52 +11:00
|
|
|
l'implémentation actuelle de l'ancêtre \texttt{curses}.
|
|
|
|
Voici ce qu'en dit une page de man~:
|
2020-09-28 02:29:13 +11:00
|
|
|
|
|
|
|
\begin{quote}
|
2021-09-10 19:17:33 +11:00
|
|
|
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.
|
2020-09-28 02:29:13 +11:00
|
|
|
\end{quote}
|
|
|
|
|
2021-09-10 19:17:33 +11:00
|
|
|
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é.
|
2020-09-28 02:29:13 +11:00
|
|
|
|
2021-12-24 06:06:52 +11:00
|
|
|
% =========================================================
|
|
|
|
|
|
|
|
\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.
|
2024-02-23 07:39:39 +11:00
|
|
|
Et le second est l'image interne que se fait la mécanique de l'écran
|
2021-12-24 06:06:52 +11:00
|
|
|
physique, donc ce que voit le yuser.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% =========================================================
|
|
|
|
|
2021-09-10 19:17:33 +11:00
|
|
|
\section{Premier exemple}
|
2020-09-28 02:29:13 +11:00
|
|
|
|
|
|
|
Bien entendu, nous commencerons par l'ECM traditionnel de rigueur.
|
|
|
|
|
2020-11-23 07:07:05 +11:00
|
|
|
\lstinputlisting[language=C]{code/ex_curses.c}
|
2020-09-28 02:29:13 +11:00
|
|
|
|
|
|
|
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
|
2021-09-10 19:17:33 +11:00
|
|
|
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é)
|
2020-09-28 02:29:13 +11:00
|
|
|
par le \texttt{refresh()}.
|
|
|
|
|
2021-09-10 19:17:33 +11:00
|
|
|
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.
|
2020-09-28 02:29:13 +11:00
|
|
|
|
2021-12-24 06:06:52 +11:00
|
|
|
% =========================================================
|
|
|
|
|
2021-09-10 19:17:33 +11:00
|
|
|
\section{Bell and whistles}
|
|
|
|
|
2024-02-23 07:39:39 +11:00
|
|
|
\subsection{Attributs}
|
|
|
|
|
2021-09-10 19:17:33 +11:00
|
|
|
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.
|
|
|
|
|
2021-12-24 06:06:52 +11:00
|
|
|
% =========================================================
|
|
|
|
|
|
|
|
\section{Les fenêtres}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% =========================================================
|
|
|
|
|
2021-09-10 19:17:33 +11:00
|
|
|
\section{Astuces}
|
2020-09-28 02:29:13 +11:00
|
|
|
|
2024-02-23 07:39:39 +11:00
|
|
|
\subsection{kbhit} \index{kbhit} \label{kbhit}
|
|
|
|
|
2020-09-28 02:29:13 +11:00
|
|
|
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
|
2024-02-23 07:39:39 +11:00
|
|
|
saisie (genre un Joystick\index{joystick}) sans rester en attente ?
|
2020-09-28 02:29:13 +11:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2024-02-23 07:39:39 +11:00
|
|
|
Sauf que, Unix, c'est bien foutu ---> voir \texttt{fileno(3)}
|
|
|
|
|
|
|
|
% =========================================================
|
2020-09-28 02:29:13 +11:00
|
|
|
|
2024-02-23 07:39:39 +11:00
|
|
|
\section{Et pour continuer ?}
|
|
|
|
|
|
|
|
Il existe des bibliothèques pour faire des interfaces
|
|
|
|
\textsl{wimp}\footnote{Window, Icon, Mouse, Pulldown}
|
|
|
|
assez avancées.
|
|
|
|
|
|
|
|
% =========================================================
|
2020-09-28 02:29:13 +11:00
|
|
|
|
|
|
|
|
|
|
|
|