Comprendre les terminaux avec des malédictions

Les capacités de votre programme sont limitées, en partie, par les capacités du terminal sur lequel il s'exécute.

Cette section fournit des informations sur l'initialisation des terminaux et l'identification de leurs capacités.

Manipulation de plusieurs terminaux

Avec les malédictions, vous pouvez utiliser un ou plusieurs terminaux pour l'entrée et la sortie. Les sous-routines de terminal vous permettent d'établir de nouveaux terminaux, de commuter le traitement d'entrée et de sortie et d'extraire les fonctions de terminal.

Vous pouvez lancer des curses sur un seul écran par défaut à l'aide de la sous-routine initscr . Si votre application envoie une sortie à plusieurs terminaux, utilisez la sous-routine newterm . Appelez la sous-routine newterm pour chaque terminal. Utilisez également la sous-routine newterm si votre application souhaite une indication des conditions d'erreur afin qu'elle puisse continuer à s'exécuter en mode orienté ligne si le terminal ne peut pas prendre en charge un programme orienté écran.

Une fois terminé, un programme doit appeler la sous-routine endwin pour chaque terminal utilisé. Si vous appelez la sous-routine newterm plusieurs fois pour le même terminal, le premier terminal auquel il est fait référence doit être le dernier terminal pour lequel vous appelez la sous-routine endwin .

La sous-routine set_term bascule le traitement d'entrée et de sortie entre les différents terminaux.

Détermination des capacités du terminal

Curses fournit les sous-routines suivantes pour vous aider à déterminer les capacités d'un terminal:
Sous-routine Descriptif
a_ic Détermine si un terminal dispose de la fonction d'insertion de caractères
a_il Détermine si un terminal possède la fonction d'insertion de ligne
nomlongue Renvoie le nom prolixe du terminal

La sous-routine longname renvoie un pointeur vers une zone statique contenant une description prolixe du terminal en cours. Cette zone statique est définie uniquement après un appel à la sous-routine initscr ou newterm . Si vous prévoyez d'utiliser la sous-routine longname avec plusieurs terminaux, chaque appel à la sous-routine newterm remplace cette zone. Les appels à la sous-routine set_term ne restaurent pas la valeur. A la place, sauvegardez cette zone entre les appels à la sous-routine newterm .

La sous-routine has_ic renvoie TRUE si le terminal possède des fonctions d'insertion et de suppression de caractères.

La sous-routine has_il renvoie TRUE si le terminal dispose de fonctions d'insertion et de suppression de ligne ou s'il peut simuler ces fonctions à l'aide de zones de défilement. Utilisez la sous-routine has_il pour vérifier s'il est approprié d'activer le défilement physique à l'aide des sous-routines scrollok ou idlok .

Définition des modes d'entrée et de sortie du terminal

Les sous-routines qui contrôlent l'entrée et la sortie déterminent comment votre application extrait et affiche les données aux utilisateurs.

Modes d'entrée

Les caractères d'entrée spéciaux incluent les caractères de contrôle de flux, le caractère d'interruption, le caractère d'effacement et le caractère de suppression. Les modes de malédiction mutuellement exclusifs suivants permettent à l'application de contrôler l'effet des caractères d'entrée:

Mode cuit
Ce mode permet un traitement normal de la ligne à la fois avec tous les caractères spéciaux traités en dehors de l'application, ce qui a le même effet que le traitement d'entrée en mode canonique. L'état des indicateurs ISIG et IXON n'est pas modifié lors de l'entrée dans ce mode en appelant nocbreak () et sont mis en place en entrant dans ce mode en appelant noraw ().

L'implémentation prend en charge l'effacement et l'arrêt des caractères de tout environnement local pris en charge, quelle que soit la largeur du caractère.

mode cbreak
Les caractères saisis par l'utilisateur sont immédiatement disponibles pour l'application et les malédictions n'effectuent pas de traitement spécial sur le caractère d'effacement ou le caractère de suppression. Une application peut sélectionner le mode cbreak pour effectuer sa propre édition de ligne, mais pour laisser le caractère d'abandon être utilisé pour abandonner la tâche. Ce mode produit le même effet que le mode non canonique, le traitement d'entrée Case B (avec MIN défini sur 1 et ICRNL effacé). L'état des drapeaux ISIG et IXON n'est pas modifié lors de l'entrée dans ce mode.
Mode demi-retard
L'effet est identique à cbreak, à ceci près que les fonctions d'entrée attendent qu'un caractère soit disponible ou qu'un intervalle défini par l'application s'écoule, selon la première éventualité. Ce mode produit le même effet que le mode non canonique, le traitement d'entrée Case C (avec TIME défini sur la valeur spécifiée par l'application). L'état des drapeaux ISIG et IXON n'est pas modifié lors de l'entrée dans ce mode.
Mode brut
Le mode brut permet à l'application de contrôler au maximum l'entrée du terminal. L'application voit chaque caractère tel qu'il est saisi. Cela a le même effet que le mode non canonique, le traitement d'entrée Case D. Les drapeaux ISIG et IXON sont effacés lors de l'entrée dans ce mode.

Les paramètres de l'interface de terminal sont enregistrés lorsque le processus appelle les sous-routines initscr ou newterm pour initialiser les curses et les restaure lorsque la sous-routine endwin est appelée. Le mode d'entrée initial pour les opérations curses n'est pas spécifié sauf si l'implémentation prend en charge la conformité curses améliorée, dans laquelle le mode d'entrée initial est le mode cbreak .

Le comportement de la clé BREAK dépend des autres bits du pilote d'affichage qui ne sont pas définis par des malédictions.

Mode de retard

Les modes de délai mutuellement exclusifs suivants spécifient la vitesse à laquelle certaines fonctions curses reviennent à l'application lorsqu'il n'y a pas d'entrée de terminal en attente lorsque la fonction est appelée:
Retard Descriptif
Aucun délai La fonction échoue.
Retard L'application attend que l'implémentation transmette du texte à l'application. Si le mode cbreak ou le mode brut est défini, il est suivi d'un caractère. Sinon, il est placé après le premier caractère de retour à la ligne, le caractère de fin de ligne ou le caractère de fin de fichier.

L'effet du mode Pas de retard sur le traitement des touches de fonction n'est pas spécifié.

Traitement en mode Echo

Le mode écho détermine si les caractères saisis sont des échos à l'écran. L'effet du mode écho est analogue à l'effet de l'indicateur d'écho dans le champ de mode local de la structure termios associée au terminal connecté à la fenêtre. Cependant, les malédictions effacent toujours l'indicateur d'écho lorsqu'elles sont appelées, pour empêcher le système d'exploitation d'effectuer des échos. La méthode d'échos de caractères n'est pas identique à la méthode d'échos de caractères du système d'exploitation, car les malédictions effectuent un traitement supplémentaire de l'entrée du terminal.

En mode écho, les malédictions effectuent leurs propres échos. Tout caractère d'entrée visible est stocké dans la fenêtre en cours ou spécifiée par la fonction d'entrée que l'application a appelée, à la position du curseur de cette fenêtre, comme si la sous-routine addch avait été appelée, avec tous les effets conséquents tels que le déplacement du curseur et le retour à la ligne.

S'il n'est pas en mode écho, tout échos d'entrée doit être effectué par l'application. Les applications effectuent souvent leurs propres échos dans une zone contrôlée de l'écran, ou n'échos pas du tout, de sorte qu'elles désactivent le mode d'écho.

Il n'est peut-être pas possible de désactiver le traitement d'écho pour les terminaux synchrones et asynchrones du réseau car le traitement d'écho est effectué directement par les terminaux. Les applications qui s'exécutent sur de tels terminaux doivent savoir que tous les caractères saisis s'afficheront à l'écran à l'endroit où le curseur est positionné.

Les éléments suivants font partie de la famille de sous-programmes de traitement d'écho:
Sous-routine Descriptif
cbreak ou nocbreak Place le terminal dans le mode CBREAK ou le sort du mode CBREAK
sortie_retard Définit le délai de sortie en millisecondes
echo ou noecho Contrôle l'affichage des caractères saisis à l'écran
moitiés de délai Renvoie ERR si aucune entrée n'a été saisie après un blocage pendant une durée spécifiée
nl ou nonl Détermine si les curses traduisent une nouvelle ligne en un retour chariot et un saut de ligne en sortie, et convertit un retour en une nouvelle ligne en entrée
brut ou noraw Met le terminal en mode ou hors mode

La sous-routine cbreak exécute un sous-ensemble des fonctions exécutées par la sous-routine raw . En mode cbreak, les caractères saisis par l'utilisateur sont immédiatement disponibles pour le programme et le traitement des caractères d'effacement ou de suppression n'est pas effectué. Contrairement au mode RAW, les caractères d'interruption et de flux sont traités. Sinon, le pilote tty met en mémoire tampon les caractères saisis jusqu'à ce qu'une nouvelle ligne ou un retour chariot soit entré.

Remarque: Le mode CBREAK désactive la conversion par le pilote tty.

La sous-routine delay_output définit le délai de sortie sur le nombre de millisecondes spécifié. N'utilisez pas cette sous-routine de manière excessive car elle utilise des caractères de remplissage au lieu d'une pause du processeur.

La sous-routine echo place le terminal en mode écho. En mode écho, curses écrit les caractères saisis par l'utilisateur sur le terminal à la position du curseur physique. La sous-routine noecho sort le terminal du mode écho.

Les sous-routines nl et nonl , respectivement, contrôlent si curses convertit les nouvelles lignes en retours chariot et sauts de ligne en sortie, et si les malédictions traduisent les retours chariot en nouvelles lignes en entrée. Au départ, ces traductions ont lieu. En désactivant ces traductions, la bibliothèque de sous-programmes curses a plus de contrôle sur la fonction de saut de ligne, ce qui accélère le déplacement du curseur.

La sous-routine nocbreak sort le terminal du mode cbreak.

La sous-routine raw place le terminal en mode brut. En mode brut, les caractères saisis par l'utilisateur sont immédiatement disponibles pour le programme. En outre, les caractères d'interruption, de fermeture, de suspension et de contrôle de flux sont transmis sans interprétation au lieu de générer un signal comme ils le font en mode cbreak. La sous-routine noraw sort le terminal du mode brut.

Utilisation des fichiers terminfo et termcap

Lorsque curses est initialisé, il vérifie la variable d'environnement TERM pour identifier le type de terminal. Ensuite, les malédictions recherche une définition expliquant les capacités du terminal. Ces informations sont généralement conservées dans un répertoire local spécifié par la variable d'environnement TERMINFO ou dans le répertoire /usr/share/lib/terminfo . Tous les programmes curses vérifient d'abord si la variable d'environnement TERMINFO est définie. Si cette variable n'est pas définie, le répertoire /usr/share/lib/terminfo est vérifié.

Par exemple, si la variable TERM est définie survt100et que la variable TERMINFO est définie sur le fichier /usr/mark/myterms , effectue des vérifications pour le fichier /usr/mark/myterms/v/vt100 . Si ce fichier n'existe pas, curses vérifie le fichier /usr/share/lib/terminfo/v/vt100 .

De plus, les variables d'environnement LINES et COLUMNS peuvent être définies pour remplacer la description du terminal.

Ecriture de programmes utilisant les sous-routines terminfo

Utilisez les sous-routines terminfo lorsque votre programme doit traiter directement avec la base de données terminfo. Par exemple, utilisez ces sous-routines pour programmer des touches de fonction. Dans tous les autres cas, les sous-routines de malédiction sont plus appropriées et leur utilisation est recommandée.

Initialisation des terminaux

Votre programme doit commencer par appeler la sous-routine setupterm . Normalement, cette sous-routine est appelée indirectement par un appel à la sous-routine initscr ou newterm . La sous-routine setupterm lit les variables dépendantes du terminal définies dans la base de données terminfo . La base de données terminfo inclut des variables booléennes, numériques et de chaîne. Toutes ces variables terminfo utilisent les valeurs définies pour le terminal spécifié. Après avoir lu la base de données, la sous-routine setupterm initialise la variable cur_term avec la définition du terminal. Lorsque vous utilisez plusieurs terminaux, vous pouvez utiliser la sous-routine set_curterm pour définir la variable cur_term sur un terminal spécifique.

Une autre sous-routine, restartterm, est similaire à la sous-routine setupterm . Cependant, il est appelé après la restauration de la mémoire à un état précédent. Par exemple, vous pouvez appeler la sous-routine restartterm après un appel à la sous-routine scr_restore . La sous-routine restartterm suppose que les options d'entrée et de sortie sont les mêmes que lors de l'enregistrement de la mémoire, mais que le type de terminal et le débit en bauds peuvent être différents.

La sous-routine del_curterm libère l'espace contenant les informations de capacité pour un terminal spécifié.

fichiers d'en-tête

Incluez les fichiers curses.h et term.h dans votre programme dans l'ordre suivant:

#include <curses.h>
#include <term.h>

Ces fichiers contiennent les définitions des chaînes, des nombres et des indicateurs de la base de données terminfo .

Gestion des capacités du terminal

Transmettez toutes les chaînes paramétrées via la sous-routine tparm pour les instancier. Utilisez la sous-routine tputs ou putp pour imprimer toutes les chaînes terminfo et la sortie de la sous-routine tparm .

Sous-routine Descriptif
putp Fournit un raccourci vers la sous-routine tputs
paramétre_tparm Instancie une chaîne avec des paramètres
tputs Applique les informations de remplissage à la chaîne donnée et les génère

Utilisez les sous-routines suivantes pour obtenir et transmettre des fonctions de terminal:

Sous-routine Descriptif
indicateur de tigetflag Renvoie la valeur d'une fonction booléenne spécifiée. Si la capacité n'est pas booléenne, la valeur -1 est renvoyée.
num_tigetm Renvoie la valeur d'une capacité numérique spécifiée. Si la capacité n'est pas numérique, un -2 est renvoyé.
tigetstr Renvoie la valeur d'une fonction de chaîne spécifiée. Si la capacité spécifiée n'est pas une chaîne de caractères, le sous-programme tigetstr renvoie la valeur(char *) -1.

Sortie du programme

Lorsque votre programme se ferme, restaurez les modes tty à leur état d'origine. Pour ce faire, appelez la sous-routine reset_shell_mode . Si votre programme utilise l'adressage de curseur, il doit générer la chaîne enter_ca_mode au démarrage et la chaîne exit_ca_mode lorsqu'il se ferme.

Les programmes qui utilisent des échappements de shell doivent appeler la sous-routine reset_shell_mode et générer la chaîne exit_ca_mode avant d'appeler le shell. Après le retour de l'interpréteur de commandes, le programme doit générer la chaîne enter_ca_mode et appeler la sous-routine reset_prog_mode . Ce processus diffère des opérations curses standard, qui appellent la sous-routine endwin à la sortie.

Sous-routines d'écran de bas niveau

Utilisez les sous-routines suivantes pour les manipulations d'écran de bas niveau:

Sous-routine Descriptif
escroquerie Supprime une seule ligne du stdscr
vidage mémoire Vide le contenu de l'écran virtuel dans un fichier spécifié
scr_init Initialise les structures de données curses à partir d'un fichier spécifié
rétablisse_opération Restaure l'écran virtuel dans le contenu d'un fichier précédemment vidé

Sous-routines termcap

Si votre programme utilise le fichier termcap pour les informations de terminal, les sous-routines termcap sont incluses comme aide à la conversion. Les paramètres sont les mêmes pour les sous-routines termcap . Curses émule les sous-routines à l'aide de la base de données terminfo . Les sous-routines termcap suivantes sont fournies:

Sous-routine Descriptif
tgetent Emule la sous-routine setupterm .
indicateur tgetflag Renvoie l'entrée booléenne pour un identificateur termcap.
num_tgett Renvoie l'entrée numérique d'un identificateur termcap.
tgetstr Renvoie l'entrée de chaîne pour un identificateur termcap.
tgoto Duplique la sous-routine tparm . La sortie de la sous-routine tgoto doit être transmise à la sous-routine tputs .

Conversion des descriptions termcap en descriptions terminfo

La commande captoinfo convertit les descriptions termcap en descriptions terminfo . L'exemple suivant illustre le fonctionnement de la commande captoinfo :
captoinfo /usr/lib/libtermcap/termcap.src

Cette commande convertit le fichier /usr/lib/libtermcap/termcap.src en source terminfo . La commande captoinfo écrit la sortie dans la sortie standard et conserve les commentaires et autres informations dans le fichier.

Manipulation des ATS

Les fonctions suivantes permettent de sauvegarder et de restaurer l'état des modes de terminal:

Fonctions Descriptif
savetty Sauvegarde l'état des modes tty.
réinitialisation Restaure l'état des modes tty lors de leur dernier appel de la sous-routine savetty .

Terminaux asynchrones synchrones et en réseau

Les terminaux synchrones, synchrones en réseau (NWA) ou non standard directement connectés sont souvent utilisés dans un environnement mainframe et communiquent avec l'hôte en mode bloc. C'est-à-dire que l'utilisateur entre des caractères sur le terminal, puis appuie sur une touche spéciale pour initier la transmission des caractères à l'hôte.

Remarque: Bien qu'il soit possible d'envoyer des blocs de taille arbitraire à l'hôte, il n'est pas possible ou souhaitable de transmettre un caractère avec une seule touche. Cela peut entraîner de graves problèmes pour une application qui utilise une entrée à caractère unique.

Sortie

L'interface curses peut être utilisée pour toutes les opérations relatives à la sortie sur le terminal, à l'exception peut-être que sur certains terminaux, la routine refresh peut avoir à redessiner l'intégralité du contenu de l'écran afin d'effectuer une mise à jour.

S'il est en outre nécessaire de nettoyer l'écran avant chaque opération de ce type, le résultat pourrait être indésirable.

Entrée

En raison de la nature du fonctionnement des terminaux synchrones (mode block-mode) et NWA, il peut ne pas être possible de prendre en charge tout ou partie des fonctions d'entrée des malédictions. En particulier, notez les points suivants:
  • Il se peut que l'entrée d'un seul caractère ne soit pas possible. Il peut être nécessaire d'appuyer sur une touche spéciale pour que tous les caractères saisis sur le terminal soient transmis à l'hôte.
  • Il est parfois impossible de désactiver l'écho. L'écho de caractère peut être effectué directement par le terminal. Sur les terminaux qui se comportent de cette façon, toute application malédiction qui effectue des entrées doit être consciente que tous les caractères saisis apparaîtront à l'écran au point où le curseur est positionné. Cela ne correspond pas nécessairement à la position du curseur dans la fenêtre.