Page suivante Page précédente Table des matières

5. Accès aux valeurs définies par les capacités d'une base de données terminfo

5.1 Prototype des fonctions d'accès aux capacités

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é :

5.2 Cahier des charges des fonctions d'accès

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

5.3 Exemple d'emploi de 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

5.4 Exemple d'emploi de 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.

5.5 Exemple d'emploi de 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.


Page suivante Page précédente Table des matières