Qu'est-ce que l'API graphique du terminal?

8

Comment certains programmes peuvent-ils définir les couleurs d'arrière-plan et de police, écrire des caractères au même endroit à l'écran (par exemple, dans la troisième ligne, la cinquième colonne) plusieurs fois?

Quelques exemples sont la barre de progression affichée par curl google.com > a, certains écrans d'installation et presque n'importe quel éditeur de texte.

vemv
la source

Réponses:

5

Ce que vous demandez n'est pas vraiment une API graphique, c'est juste des caractères de contrôle de terminal.

Il y a beaucoup d'histoire derrière cela, mais les terminaux à l'époque étaient des machines de télétype . Fondamentalement, une machine à écrire avec du papier alimenté par des pistes connecté à l'ordinateur avec une connexion série. Taper un caractère enverrait cette valeur binaire à l'ordinateur (ainsi que la taper sur la page). L'ordinateur réimprime les caractères en sortie de tout ce que vous avez demandé.

Des caractères spéciaux ont été utilisés pour contrôler le terminal (d'où vient la clé de contrôle, c'était pour produire ces caractères). Par exemple, ^Hou ^?serait un retour arrière, ^Mest un retour chariot (déplace le curseur au début de la ligne) et ^Jest un saut de ligne (déplace la page d'une ligne vers le haut). Certains codes de contrôle ont une séquence d'échappement en C (qui est partagée par presque tous les langages de programmation) pour générer les caractères de contrôle. Les contrôles seraient énumérés précédemment être \b, \r, \nrespectivement.

L' émulateur de terminal que vous utilisez aujourd'hui est exactement ce que cela ressemble, c'est un logiciel qui prétend être une vieille machine de télétype. D'une certaine manière, c'est presque comme si Unix pensait toujours que vous utilisez une machine à écrire pour communiquer avec elle.

Dans le cas de curl, il écrit une ligne entière puis envoie \r(retour chariot) en amenant le curseur au début de la ligne puis écrit une autre ligne. Comme un saut de ligne n'est pas envoyé, il continue d'écrire sur la même ligne à l'écran.

Voici quelque chose que vous pouvez essayer de démontrer:

echo -n  "First" ; sleep 5 ; echo -en "\rSecond\n"

Vous verrez le mot "First" imprimé (mais aucune nouvelle ligne n'est envoyée). 5 secondes plus tard, il sera remplacé par le mot "Second" et une nouvelle ligne sera envoyée. Vous pouvez répéter ce modèle indéfiniment. Essayez d'ajouter "Troisième" vous-même, vous verrez quelque chose auquel vous ne vous attendiez probablement pas ;-)

Pour plus d'informations sur ces caractères de contrôle et sur d'autres, consultez le ascii(7)manuel.

bahamat
la source
7

Cherchez-vous quelque chose comme ncurses ?

Boris Ivanov
la source
3
Ces jours-ci, vous voudrez les nouvelles malédictions, ou ncurses.
Steven lundi
Exactement. Merci pour les corrections. J'ai oublié qu'ils étaient différents.
Boris Ivanov
1

Cette question est en fait plusieurs questions, et les "caractères de contrôle" n'en abordent qu'une petite partie, par exemple la barre de progression de curl. Plus généralement, ce sont des caractéristiques communes aux terminaux (et aux émulateurs de terminaux).

La plupart de ces caractéristiques communes sont normalisées dans ECMA-48: Fonctions de contrôle pour les jeux de caractères codés . Cependant, d'autres fonctionnalités ne le sont pas . Ils sont définis par l'implémentation.

ECMA-48 fait référence aux fonctions de contrôle . Cela inclut les caractères de contrôle et les séquences de contrôle (souvent appelés séquences d'échappement, séquences ANSI, etc.).

Certains caractères de contrôle sont utilisés pour des opérations simples , par exemple,

  • déplacer le curseur sur la colonne précédente de la même ligne
  • déplacer le curseur sur la première colonne de la même ligne
  • déplacer le curseur sur la tabulation suivante sur la même ligne
  • déplacer le curseur sur la ligne suivante (et faire défiler l'écran s'il est déjà sur la dernière ligne)

La barre de progression de curlest construite à l'aide de ces opérations simples. Mais les personnages de contrôle ne peuvent pas faire grand chose, pas plus. Les séquences de contrôle font plus, par exemple,

  • déplacer le curseur sur n'importe quelle ligne / colonne de l'écran
  • déplacer le curseur sur n'importe quelle ligne de la même colonne à l'écran
  • déplacer le curseur sur n'importe quelle colonne de la même ligne à l'écran
  • définir des taquets de tabulation sur n'importe quelle colonne de l'écran
  • déplacer le curseur sur la ligne précédente
  • faire défiler l'écran vers le haut ou vers le bas sans déplacer le curseur

Voilà pour les parallèles entre simple / complexe. Les séquences de contrôle sont également utilisées pour changer la couleur du texte et de l'arrière-plan, effacer le texte de l'écran, afficher le texte en vidéo inverse (ou en gras, souligner, clignoter).

Les programmes qui dessinent une barre de progression vidéo inverse (ou colorée) utilisent des séquences de contrôle .

Bien que les séquences de contrôle puissent faire plus, elles ne peuvent faire que des choses spécifiques. Les assembler pour créer des éditeurs de texte, des écrans d'installation (et des programmes qui dessinent des barres de progression colorées) se compliquent. Une partie de cela est rendue plus simple en utilisant des bibliothèques qui connaissent ces choses. Initialement, nous avions termcap (et une base de données de quelques centaines de types de terminaux), étendu à terminfo (et une base de données d'environ mille types de terminaux).

Même avec la normalisation, il existe des dizaines de descriptions de terminaux que vous pouvez utiliser . Nous continuons donc à utiliser des bibliothèques pour toutes les applications, sauf les plus triviales. L'un est ncurses ("new-curses"), un autre est l'argot (techniquement "S-Lang").

Lectures complémentaires:

Thomas Dickey
la source