LES CODES CONSOLE

Sous Linux, le gestionnaire de console implémente un sous-ensemble important des séquences de contrôle des terminaux VT102 et ECMA-48/ISO 6429/ANSI X3.64, ainsi que quelques séquences spécifiques pour le changement de palette de couleurs, de fonte de caractères, etc...

Dans la description ci-dessous, la seconde colonne de la table contient les mnémoniques ECMA-48 ou DEC (ces derniers ayant le préfixe DEC) pour chaque fonction indiquée. Les séquences sans mnémoniques ne correspondent ni à l'ECMA-48 ni au VT102.

Lorsque tout le prétraitement nécessaire à une sortie est terminé, et qu'un flux de caractères arrive au gestionnaire de console pour être effectivement affiché, se produit tout d'abord une traduction des codes utilisés pour le prétraitement en code utilisés pour l'affichage.

Si la console est en mode UTF-8, les octets arrivants sont tout d'abord assemblés en codes sur 16 bits au standard Unicode. Sinon chaque octet est transformé en fonction de la table de correspondance en cours (qui convertit chaque octet en une valeur Unicode). Voir le paragraphe JEUX DE CARACTÈRES plus bas pour plus de détails.

Normalement, la valeur Unicode est convertie en un index dans la table de caractères, qui est alors stocké dans la mémoire vidéo, afin que le symbole graphique correspondant (comme ceux qui se trouvent dans la mémoire morte vidéo), apparaisse sur l'écran. Notez que l'utilisation de l'Unicode, et la conception des PC, permettent de disposer simultanément de 512 symboles différents.

Si la valeur Unicode rencontrée est un caractère de contrôle,

ou si l'on est déjà dans le traitement d'une séquence d'échappement, la valeur sera traitée de manière particulière. Plutôt que d'être convertie en un index dans la table des caractères et affichée comme un symbole, elle peut provoquer un déplacement du curseur, ou toute autre fonction de contrôle.

Il vaut mieux éviter en général de coder en dur les contrôles de terminaux dans les programmes. Linux propose l'utilisation de la base de données terminfo concernant les possibilités des terminaux.

Plutôt que d'émettre des séquences d'échappement à la main, vous pourrez presque toujours utiliser des bibliothèques de gestion de terminaux utilisant terminfo, ou des utilitaires comme ncurses, tput, ou .reset.

  CONTRÔLE DE LA CONSOLE LINUX

Ce paragraphe décrit tous les caractères de contrôle et les séquences d'échappement qui déclenchent certaines fonctions spéciales (c'est à dire n'affichant pas un symbole graphique à la position du curseur) sur la console Linux.

Caractères de contrôle

Un caractère est dit «de contrôle» s'il correspond à l'un des 14 codes suivants (avant traduction par la table de correspondance en cours) :

00 (NUL), 07 (BEL), 08 (BS), 09 (HT), 0A (LF), 0B (VT), 0C (FF), 0D (CR), 0E (SO), 0F (SI), 18 (CAN), 1A (SUB), 1B (ESC), 7F (DEL). On peut demander un mode d'affichage des caractères de contrôle (voir plus bas), dans lequel les codes 07, 09, 0B, 18, 1A, et 7F seront quand même affichés sous forme graphique. Inversement, en mode UTF-8 tous les codes de l'intervalle 00-1F sont considérés comme des caractères de contrôle quelque soit le mode d'affichage de ces codes.

Lorsqu'un caractère de contrôle est rencontré, il agit immédiatement, puis est oublié (même au milieu d'une séquence d'échappement, laquelle continue avec le caractère suivant).

Toutefois, ESC indique le début d'une nouvelle séquence d'échappement, annulant alors une éventuelle séquence déjà commencée. De même CAN et SUB annulent toute séquence d'échappement entamée. Les caractères de contrôle reconnus sont BEL, BS, HT, LF, VT, FF, CR, SO, SI, CAN, SUB, ESC, DEL, CSI. Ils effectuent les actions suivantes :

BEL (0x07, ^G) émet un bip,

BS (0x08, ^H) revient en arrière d'une colonne (mais ne remonte pas à la ligne précédente quand il est invoqué en début de ligne),

HT (0x09, ^I) saute à la prochaine tabulation, ou à la fin de ligne s'il n'y a pas de tabulation d'ici là,

LF (0x0A, ^J), VT (0x0B, ^K) et FF (0x0C, ^L) effectuent tous les trois un saut de ligne,

CR (0x0D, ^M) déclenche un retour-chariot,

SO (0x0E, ^N) active le jeu de caractères G1, et si LF/NL

(mode new-line) est actif, effectue un retour-chariot,

SI (0x0F, ^O) active le jeu de caractères G0,

CAN (0x18, ^X) et

SUB (0x1A, ^Z) interrompent les séquences d'échappement,

ESC (0x1B, ^[) débute une séquence d'échappement,

DEL (0x7F) est ignoré,

CSI (0x9B) est équivalent à ESC [.

Séquences d'échappement ESC, non CSI

ESC c RIS Réinitialisation.

ESC D IND Saut de ligne.

ESC E NEL Nouvelle ligne.

ESC H HTS Positionner une tabulation à la colonne en cours

ESC M RI Saut de ligne inversé.

ESC Z DECID Identification privée DEC. Le noyau renvoie la chaine ESC [ ? 6 c, simulant un VT102.

ESC 7 DECSC Sauvegarde de l'état en cours (coordonnées curseur, attributs, jeu de caractères).

ESC 8 DECRC Restaure l'état sauvegardé le plus récent.

ESC [ CSI Début de séquence de contrôle.

ESC % Début de séquence de sélection de jeu de caractère.

ESC % @ Jeu par défaut (ISO 646/ISO 8859-1)

ESC % G Jeu UTF-8

ESC % 8 Jeu UTF-8 (obsolète)

ESC # 8 DECALN Test d'alignement d'écran DEC, remplit l'écran avec des E.

ESC ( Début de séquence de définition du jeu G0

ESC ( B Correspondance par défaut (ISO 8859-1)

ESC ( 0 Correspondance VT100 graphique

ESC ( U Pas de correspondance - caractères en ROM

ESC ( K Correspondance définie par l'utilisateur avec l'utilitaire mapscrn.

ESC ) Début de séquence de définition du jeu G1 (suivi de B, 0, U, K, comme ci-dessus).

ESC > DECPNM Mode de pavé numérique.

ESC = DECPAM Mode de pavé alphabétique.

ESC ] OSC (Opérating system command)

ESC ] P nrrvvbb : fixe la palette, le paramètre est fourni avec 7 chiffres héxadécimaux après le P final. n est la couleur (0-16), et rrvvbb indique les valeurs rouge/verte/bleue (0-255). ESC ] R : réinitialise la palette.

Séquences d'échappement ECMA-48 CSI

CSI (ou ESC [) est suivi d'une série de paramètres, au plus NPAR (16), représentés par des nombres décimaux séparés par des

points virgules. Un paramètre vide ou absent est considéré comme nul. La série de paramètre peut être précédée par un point d'interrogation.

Toutefois, après CSI [ (ou ESC [ [) un seul caractère est lu, et le reste de la séquence est ignoré. L'idée est d'éliminer les touches de fonctions doublées.

L'action déclenchée par une séquence CSI est indiquée par le dernier caractère.

@ ICH Insère le nombre indiqué de caractères blancs.

A CUU Remonter le curseur du nombre de lignes indiqué.

B CUD Descendre le curseur du nombre de lignes indiqué.

C CUF Avancer le curseur du nombre de colonnes indiqué.

D CUB Reculer le curseur du nombre de colonnes indiqué.

E CNL Descendre le curseur du nombre de ligne indiqué, en colonne numéro 1.

F CPL Remonter le curseur du nombre de lignes indiqué, en colonne numéro 1.

G CHA Déplacer le curseur à la ligne indiquée, même colonne.

H CUP Déplacer le curseur à la ligne et à la colonne indiquées (origine en 1, 1).

J ED Effacer l'ecran (par défaut depuis la position du curseur jusqu'à la fin de l'ecran).ESC [ 1 J: efface du début juqu'au curseur.ESC [ 2 J: efface tout l'écran.

K EL Efface la ligne (par défaut depuis le curseur jusqu'à la fin de la ligne).

ESC [ 1 K: efface du début de ligne jusqu'au curseur.

ESC [ 2 K: efface toute la ligne.

L IL Insère le nombre indiqué de lignes blanches.

M DL Supprimer le nombre indiqué de lignes.

P DCH Supprime le nombre indiqué de caractères sur la ligne en cours.

X ECH Efface le nombre indiqué de caractères sur la ligne en cours.

a HPR Avancer le curseur jusqu'à la colonne indiquée.

c DA Répondre ESC [ ? 6 c: `Je suis un VT102'.

d VPA Placer le curseur sur la ligne indiquée, même colonne.

e VPR Descendre le curseur du nombre indiqué de lignes.

f HVP Placer le curseur aux lignes et colonnes indiquées.

g TBC Sans paramètre: effacer la tabulation a la position courante.ESC [ 3 g: effacer toutes les tabulations.

h SM Fixe le mode (voir plus bas).

l RM Réinitialise le mode (voir plus bas).

m SGR Fixe les attributs (voir plus bas).

n DSR Indique le statut (voir plus bas).

q DECLL Fixe les LEDs du clavier. ESC [ 0 q: Effacer toutes les LEDs ESC [ 1 q: Allumer LED Scroll-Lock (Défilement) ESC [ 2 q: Allumer LED Num-Lock (Pavé numérique) ESC [ 3 q: Allumer LES Caps-Lock (Majuscules)

r DECSTBM Indique une région de défilement, les paramètres correspondent aux lignes hautes et basses.

s ? Mémoriser l'emplacement du curseur.

u ? Restituer l'emplacement du curseur.

` HPA Déplacer le curseur à la colonne indiquée, même ligne.

Affichage graphique ECMA-48

La séquence ECMA-48 SGR suivante ESC [ <paramètres> m fixe les paramètres d'affichage. Plusieurs attributs peuvent être indiqués dans la même séquence.

param résultat.

0 réinitialiser tous les attributs à leurs valeurs par défaut.

1 attribut gras.

2 attribut demi-luminosité (simulé par une couleur sur certains écrans couleurs).

4 attribut soulignement (simulé par une couleur sur certains écrans couleurs).(Les couleurs utilisées pour simuler la demi-luminosité ou le soulignement sont choisies en utilisant ESC ] ...).

5 clignotement.

7 vidéo inversée.

10 réinitialise la correspondance des touches, affiche l'état de contrôle et change l'attribut «méta».

11 active une correspondance nulle, affiche l'état de contrôle et change l'attribut «méta».

12 active une correspondance nulle, affiche l'état de contrôle et active l'attribut «méta». (le changement d'attribut méta sert à changer le bit de poids fort avant la conversion avec la table de correspondance).

21 intensité normale (non compatible avec ECMA-48).

22 intensité normale.

24 pas de soulignement.

25 pas de clignotement.

27 pas d'inversion vidéo.

30 encre noire.

31 encre rouge.

32 encre verte.

33 encre marron.

34 encre bleue.

35 encre magenta.

36 encre cyan.

37 encre blanche.

38 soulignement, et couleur d'encre par défaut.

39 arrêt soulignement et couleur d'encre par défaut.

40 fond noir.

41 fond rouge.

42 fond vert.

43 fond marron.

44 fond bleu.

45 fond magenta.

46 fond cyan.

47 fond blanc.

49 couleur de fond par défaut.

Modes ECMA-48

ESC [ 3 h DECCRM (inactif par défaut): Afficher les caractères de contrôle.

ESC [ 4 h DECIM (inactif par défaut): Mode d'insertion.

ESC [ 20 h LF/NL (inactif par défaut): faire suivre les LF, VT ou FF par un CR.

Demande de rapport d'état ECMA-48

ESC [ 5 n Rapport d'état du périphérique (DSR): La réponse est ESC [ 0 n (Terminal OK).

ESC [ 6 n Rapport de position du curseur (CPR): La réponse est ESC [ y ; x R, où x,y est la position actuelle du curseur.

Modes privés DEC (DECSET/DECRST)

Ces modes ne sont pas décrits dans l'ECMA-48. La liste ci-dessous présente les séquences d'activation des modes, les séquences de désactivation sont obtenues en remplaçant le `h' final par un `l'

ESC [ ? 1 h DECCKM (inactif par défaut): Les touches de déplacement du curseur émettent un préfixe ESC O plutôt que ESC [.

ESC [ ? 3 h DECCOLM (inactif par défaut): Bascule de 80 colonnes en 132 colonnes. Les sources du gestionnaire de console indiquent que ce code n'est pas suffisant à lui seul. Certains utilitaires comme resizecons modifient également les registres matériels de la carte vidéo.

ESC [ ? 5 h DECSCNM (inactif par défaut): Mode d'inversion vidéo.

ESC [ ? 6 h DECOM (inactif par défaut): Adressage du curseur relatif au coin haut gauche de la région de défilement.

ESC [ ? 7 h DECAWM (actif par défaut): saut de ligne automatique. Un caractère émis après la colonne 80 (ou 132 en mode DECCOLM), est affiché au début de la ligne suivante.

ESC [ ? 8 h DECARM (actif par défaut): Répétition automatique des touches du clavier.

ESC [ ? 9 h Etat de souris X10 (inactif par défaut): Fixe le mode de rapport d'état de la souris à 1 (ou le réinitialise à 0) - voir plus bas.

ESC [ ? 25 h DECCM (actif par défaut): curseur visible.

ESC [ ? 1000 h Etat de souris X11 (inactif par défaut): Fixe le mode de rapport d'état de la souris à 2 (ou le réinitialise à 0) - voir plus bas.

Séquences CSI privées de la console Linux

Les séquences suivantes ne sont ni ECMA-48 ni du VT102 original. Elles sont spécifiques au gestionnaire de console de Linux. Les couleurs sont indiquées ainsi :

0 = noir, 1 = rouge, 2 = vert, 3 = marron, 4 = bleu, 5 = magenta, 6 = cyan, 7 = blanc.

ESC [ 1 ; n ] Choisit la couleur n pour simuler le soulignement.

ESC [ 2 ; n ] Choisit la couleur n pour simuler la demi-brillance.

ESC [ 8 ] Utilise la paire de couleurs actuelle par défaut.

ESC [ 9 ; n ] Délai d'économiseur d'écran en minutes.

ESC [ 10 ; n ] Fréquence du bip en Hz.

ESC [ 11 ; n ] Durée du bip en ms.

ESC [ 12 ; n ] Bascule sur la console virtuelle indiquée.

ESC [ 13 ] Arrête l'économiseur d'écran.

ESC [ 14 ; n ] Indique l'intervalle d'arrêt écran VESA en minutes.

JEUX DE CARACTÈRES

Le noyau connait 4 types de traductions des octets en symboles graphiques pour la console. Les 4 tables sont a) Latin1 -> PC, b) VT100 graphique -> PC, c) PC -> PC, d) spécifique utilisateur.

Il existe deux jeux de caractères, appelés G0 et G1, et l'un d'entre eux est selectionné comme jeu en cours (initialement G0). La frappe de ^N sélectionne le jeu G1 comme jeu en cours, la frappe de ^O sélectionne le jeu G0.

Ces variables G0 et G1 pointent vers des tables de traduction, qui peuvent être modifiées par l'utilisateur. Initialement elles pointent respectivement vers les tables a) et b). Les séquences ESC ( B, ESC (0, ESC ( U et ESC (K font pointer G0 respectivement vers les tables a), b), c) et d). Les séquences ESC) B, ESC) 0, ESC) U, ESC) K font pointer G1 vers les tables a), b), c) et d) respectivement.

La séquence ESC c réinitialise le terminal. C'est ce qui doit être effectué lorsque l'écran est rempli de codes incompréhensibles. La commande classique «echo ^V^O» sélectionne seulement le jeu G0, elle ne garantit pas que G0 pointe sur la table a). Dans certaines distributions, on trouve une commande reset qui effectue simplement «echo ^[c». Si l'entrée de la base terminfo pour la console est correcte, et dispose d'une entrée rs1=\Ec alors la commande «tput reset» fonctionnera aussi.

La table de correspondance définie par l'utilisateur peut être construite en utilisant mapscrn.Cette correspondance agit ainsi : si le symbole c doit être imprimé, alors le symbole s = map[c] est envoyé à la mémoire vidéo. La représentation graphique correspondant à s est placée par défaut en mémoire morte, et peut être modifiée en utilisant setfont.

GESTION DE SOURIS

Les possibilités de gestion de souris sont prévues pour fournir un rapport d'état de la souris compatible avec xterm. Comme le gestionnaire de console n'a aucun moyen de connaitre le périphérique, ni le type de souris, ces rapports sont envoyés dans le flux de saisie de la console uniquement quand une requête ioctl de mise à jour de la souris est reçue.Ces requêtes doivent être déclenchées par une application utilisateur capable de gérer les souris, comme le démon gpm.

Les paramètres numériques pour toutes les séquences de suivi de souris engendrées par xterm sont encodés dans un unique caractère, de code valeur+040. par exemple, `!' correspond à 1. Le systeme de coordonnées d'écran commence à 1.

En mode de compatibilité X10, une séquence d'echappement est envoyée lors de l'appui sur un bouton, encodant la position et le numéro du bouton pressé. Ce mode est activé avec ESC [ ? 9 h et désactivé par ESC [ ? 9 l. Lors d'une pression sur un bouton, xterm envoie ESC [ M bxy (6 caractères). Dans ce message b correspond au numéro de bouton \-1, x et y sont les coordonnees de l'emplacement où le bouton a été pressé.Ce sont les mêmes codes que ceux produits par le noyau.

En mode de suivi normal (non implémenté sous Linux 2.0.24), une séquence d'echappement est envoyée lors de l'appui sur un bouton, mais aussi lors du relâchement. Des informations sur les touches de modification (SHIFT, CTL...) sont également envoyées.

Le mode est activé par ESC [ ? 1000 h et désactivé avec ESC [ 1000 l.

Lors de l'appui ou du relâchement d'un bouton, xterm envoie ESC [ M bxy. Les deux bits de poids faible de b correspondent à l'état du bouton 0=B1 pressé, 1=B2 pressé, 2=B3 pressé, 3=relâchement.

Les bits de poids forts codent l'éventuelle touche modificatrice enfoncée lors de l'appui sur le bouton 4=Shift, 8=Méta, 16=Control. A nouveau x et y sont les coordonnées de la souris au moment de l'évènement. Le coin en haut à gauche de l'écran a pour coordonnées (1,1).

 

d'après la Man page traduite par

Christophe Blaess, 1997.


© Copyright 2000 Diamond Editions/Linux magazine France. - Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1or any later version published by the Free Software Foundation; A copy of the license is included in the section entitled "GNU Free Documentation License".