terminfo
Il existe trois fonctions qui permettent d'accéder aux valeurs des capacités définies dans une base de données d'un terminal déterminé :
Les fonctions tigetflag
, tigetnum
et tigetstr
renvoient la valeur de la capacité correspondant dans terminfo
à
l'argument capname, qui leur a été transmis.
La fonction tigetflag
renvoie la valeur -1 si capname n'est pas une capacité de type booléen, ou 0 si cette capacité
est, soit effacée, soit absente dans la base de données du terminal.
La fonction tigetnum
renvoie la valeur -2 si capname n'est pas une capacité de type numérique, ou -1 si cette
capacité est, soit effacée, soit absente dans la base de données du terminal.
La fonction tigetstr
renvoie la valeur (char *)-1 si capname n'est pas une capacité de type chaîne de caractères, ou 0
si cette capacité est, soit effacée, soit absente dans la base de données du
terminal.
Notez :
les quatre phrases ci-dessus ne sont que la
traduction du manuel d'aide que vous pouvez consulter en tapant la commande :
man curs_terminfo
tigetflag
Vous pourriez tester le programme suivant...
#include <stdio.h>#include <term.h>
#include <ncurses.h>
int main(int argc, char * argv[])
{
int r,rb;
int erreur;
if (argc<2){
printf("Entrez les noms d'un terminal et d'une capacité séparés par un espace\n");
exit(1);
}
else
r=setupterm(argv[1], fileno(stdout),&erreur);//Terminal de la ligne de commande
if (r==OK){
printf("Traitement correct\n");
rb=tigetflag(argv[2]);
switch(rb){
case -1 :
printf("%s n'est pas une capacité booléenne\n",argv[2]);
break;
case 0 :
printf("La capacité %s n'est pas supportée par le terminal %s\n",argv[2],argv[1]);
break;
default :
printf("La capacité %s est supportée par le terminal %s\n",argv[2],argv[1]);
break;
}
}
else
switch(erreur){
case 0 :
printf("Le terminal %s est inconnu.\n",argv[1]);
break;
case -1 :
printf("Aucune base de données pour le terminal %s.\n",argv[1]);
break;
}
return 0;
}
Voici un exemple d'appels et de réponses successifs au programme ci dessus :
[pierre@localhost terminfo]$ ./testcapb xterm km
Traitement correct
La capacité km est supportée par le terminal xterm
[pierre@localhost terminfo]$ ./testcapb linux km
Traitement correct
La capacité km n'est pas supportée par le terminal linux
[pierre@localhost terminfo]$ ./testcapb linux bce
Traitement correct
La capacité bce est supportée par le terminal linux
[pierre@localhost terminfo]$ ./testcapb xterm bce
Traitement correct
La capacité bce n'est pas supportée par le terminal xterm
tigetnum
Je vous laisse le soin d'imaginer les modifications à apporter au programme
précédent pour tester, cette fois, des capacités de type numérique à l'aide
de la fonction tigetnum
.
Je me contenterai de reproduire quelques exemples de tests de ces capacités
de type numérique sur mon système.Si nous nous intéressons, par exemple, aux
capacités de traitement des couleurs, nous pouvons interroger trois bases de
données, d'un terminal, respectivement linux
, xterm
, nxterm
. L'interrogation porte sur le support de la capacité colors. Nous
obtenons :
[pierre@localhost terminfo]$ ./testcapn linux colors
Traitement correct
La capacité colors est supportée par le terminal linux
Valeur de colors : 8
La capacité colors est gérée par le terminal linux. Huit couleurs sont reconnues.
[pierre@localhost terminfo]$ ./testcapn xterm colors
Traitement correct
La capacité colors n'est pas supportée par le terminal xterm
Petite surprise tout de même les couleurs ne semblent pas être reconnues par
la base de données du terminal xterm
. Vous pouvez le vérifier en
faisant afficher cette base de données par l'utilitaire infocmp
; or ce terminal est celui qui est habituellement émulé sous X Window.
[pierre@localhost terminfo]$ ./testcapn nxterm colors
Traitement correct
La capacité colors est supportée par le terminal nxterm
Valeur de colors : 8
Autre surprise, le terminal nxterm
, cousin issu de germain du
terminal xterm
, lui supporte la capacité colors
.
tigetstr
Nous pourrons appliquer des modifications semblables aux précédentes à notre
programme pour tester, cette fois, la fonction tigetstr
.Parmi les
capacités de type chaîne de caractères, une d'entre elles nous a semblé
importante, celle qui permet de rendre le curseur invisible : civis
.
Testons donc cette capacité sur nos terminaux habituels :
[pierre@localhost terminfo]$ ./testcapc linux civis
Traitement correct
La capacité civis est supportée par le terminal linux
Valeur de civis : \E[?25l\E[?1c
[pierre@localhost terminfo]$ ./testcapc xterm civis
Traitement correct
La capacité civis n'est pas supportée par le terminal xterm
Le lecteur voudra bien me pardonner ce fastidieux affichage, il n'est là que
pour souligner la diversité du contenu des fichiers terminfo
. Ainsi,
une fois de plus, et sur une capacité aussi usuelle et utile que l'effacement
du curseur, force est de constater que pour un terminal linux
, la
capacité est supportée et qu'elle ne l'est pas sur un terminal de type xterm
.Nous examinerons les conséquences de tout cela dans le chapitre 7
intitulé Pallier les insuffisances d'une base de données
.