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

8. Réalisation d'une bibliothèque de fonctions gérant les capacités d'un terminal

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

8.1 La fonction 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.

8.2 Ebauche d'une ébauche de bibliothèque de fonctions

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.

8.2.1 Le fichier d'en tête xinuconio.h

#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

8.2.2 Implémentation de quelques fonctions dans le fichier xinuconio.c

#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));
}

// ......

8.2.3 Quelques remarques sur les couleurs et les codes

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


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