Tout est prêt pour que vous réalisiez une bibliothèque des fonctions les plus
souvent utilisées pour la gestion d'un écran. Bien entendu, vous savez qu'un
terminal est un ensemble entrée/sortie et vous trouverez dans les bases de
données terminfo
des capacités de gestion du clavier. Ceci vous
permettra d'étendre les possibilités de cette bibliothèque que l'on pourrait
appeler xinuconio
tparm
est bien un interpréteur
Il me paraît utile de lever une ambigüité qui pourrait subsister dans l'esprit
de certains lecteurs.Les exemples d'utilisation que nous avons proposés jusqu'à
présent pourraient laisser penser que la fonction tparm
est associée
à l'activation d'un terminal qui contiendrait dans sa base de données terminfo
, la valeur de capacité traitée par tparm
.
Il n'en est rien la fonction tparm
interprète bien la chaîne de
caractères transmise en argument suivant la grammaire, la syntaxe, le lexique
des chaînes de caractères définies pour les fichiers terminfo
.
Ainsi, si vous mettez en oeuvre le petit programme suivant quel que soit le
terminal dans lequel vous exécuterez ce programme, vous obtiendrez le même
résultat, semblable à celui que nous avions obtenu précédemment, alors que nous
avions utilisé la fonction setupterm
.
#include <stdio.h>
#include <term.h>
#include <ncurses.h>
void affiche(char * m)
{
int i;
for(i=0; i<strlen(m);i++)
if (m[i]==27)
printf("\\E");
else
printf("%c",m[i]);
}
int main(int argc, char * argv[])
{
char * deplaceCurseur = "\033[%i%p1%d;%p2%dH";
char * esc_seq;
printf("Valeur de la capacité : ");
affiche(deplaceCurseur);
printf("\n");
esc_seq=tparm(deplaceCurseur,0,0);
printf("Chaîne à envoyer : ");
affiche(esc_seq);
printf(" au terminal\n");
return 0;
}
L'exécution de ce programme donnera le résultat suivant :
[pierre@localhost terminfo]$ ./tesparm
Valeur de la capacité : \E[%i%p1%d;%p2%dH
Chaîne à envoyer : \E[1;1H au terminal
conforme à ce que nous attendions.
Une structure minimale définirait dans le fichier d'en tête les valeurs des capacités J'en donne neuf exemples et ceux qui sont intéressés par la question pourront en rechercher et imaginer d'autres.
#include <stdio.h>
#include <term.h>
#include <ncurses.h>
const char * chEffaceEcran="\033[H\033[J";
const char * chCacheCurseur="\033[?25l\033[?1c";
const char * chMontreCurseur="\033[?25h\033[?0c";
const char * chPlaceCurseur="\033[%i%p1%d;%p2%dH";
const char * chEffaceFinLigne="\033[K";
const char * chEffaceDebLigne="\033[1K";
const char * chCouleurFond="\033[4%p1%dm";
const char * chCouleurForme="\033[3%p1%dm";
const char * chCoulDef="\033[39;49m";
void clrscr(); // fonction qui efface l'écran
void clreol(); // fonction qui efface jusqu'à la fin de la ligne
void clrbof(); // fonction qui efface du curseur au début de la ligne
void gotoxy(unsigned short x, unsigned short y); // Placement curseur en x,y
void cursorOff(); // Curseur invisible
void cursorOn(); // Curseur normal
void colorBkgd(unsigned short c); // Chargement couleur de fond c
void colorFrgd(unsigned short c); // Chargement couleur écriture c
void defaultColor(); // Rétablissement couleurs par défaut
#include <xinuconio.h>
// fonction qui efface l'écran
void clrscr()
{
putp(chEffaceEcran);
}
// fonction qui efface jusqu'à la fin de la ligne
void clreol()
{
putp(chEffaceFinLigne);
}
//............etc .........
// Placement curseur en x,y
void gotoxy(unsigned short x, unsigned short y)
{
putp(tparm(chPlaceCurseur,y,x));
}
// Chargement couleur de fond c
void colorBkgd(unsigned short c)
{
putp(tparm(chCouleurFond,c));
}
// ......
Le début d'une séquence d'échappement commence par "\033", c'est à dire le
caractère de code ASCII 27 soit 033 en octal qui était affiché \E dans
l'affichage conventionnel des fichiers terminfo
et dans les fichiers sources.
Vous aurez constaté les valeurs des capacités setab
et setaf
qui permettent de modifier respectivement la couleur de fond et la couleur
d'écriture : \E[4%p1%dm et \E[3%p1%dm. Vous remarquerez que la
commande commence pour l'un par 4, pour l'autre par 3 ce qui correspond à la
différenciation entre couleur fond et forme, ce qui fait que la valeur à
transmettre est une valeur numérique comprise entre 0 et le nombre maximum de
couleurs supportées par le terminal. Le paramètre à transmettre pour ces deux
fonctions est donc un nombre compris entre 0 et max_colors-1(le plus souvent
max_colors est égal à 8 ; il est donné par la valeur de la capacité colors).
Ainsi si vous appliquez à ces capacités le traitement qui permet de produire
la séquence d'échappement à l'aide de la fonction tparm
, vous
obtiendrez les résultats suivants :
[pierre@localhost terminfo]$ ./tesparm
Valeur de la capacité : \E[4%p1%dm
Chaîne à envoyer : \E[45m au terminal
et
[pierre@localhost terminfo]$ ./tesparm
Valeur de la capacité : \E[3%p1%dm
Chaîne à envoyer : \E[36m au terminal
pour deux appels avec les valeurs de couleur 5 et 6.Vous reconnaîtrez sans
peine les couleurs définies par
Cédric dans son document
.
Donc en utilisant les capacités de terminfo
le code c à transmettre
aux fonctions que nous avons créées colorBkgd(unsigned short c)
est
une valeur comprise dans l'intervalle [0,7]. Pour faciliter les choses
vous pouvez utiliser les constantes symboliques définies dans ncurses
.
En voici les valeurs :
COLOR_BLACK 0
COLOR_RED 1
COLOR_GREEN 2
COLOR_YELLOW 3
COLOR_BLUE 4
COLOR_MAGENTA 5
COLOR_CYAN 6
COLOR_WHITE 7