Terminals mit Flügeln verstehen

Die Funktionalität Ihres Programms ist teilweise durch die Funktionalität des Terminals eingeschränkt, auf dem es ausgeführt wird.

Dieser Abschnitt enthält Informationen zur Initialisierung von Terminals und zur Identifizierung ihrer Funktionalität.

Mehrere Terminals bearbeiten

Mit Curses können Sie ein oder mehrere Terminals für Eingabe und Ausgabe verwenden. Mit den Terminalsubroutinen können Sie neue Terminals einrichten, die Ein-und Ausgabeverarbeitung wechseln und Terminalfunktionen abrufen.

Sie können Curses in einer einzigen Standardanzeige mit der Subroutine initscr starten. Wenn Ihre Anwendung Ausgaben an mehrere Terminals sendet, verwenden Sie die Subroutine newterm . Rufen Sie für jedes Terminal die Subroutine newterm auf. Verwenden Sie auch die Subroutine newterm , wenn Ihre Anwendung einen Hinweis auf Fehlerbedingungen wünscht, sodass sie weiterhin im zeilenorientierten Modus ausgeführt werden kann, wenn das Terminal kein anzeigenorientiertes Programm unterstützen kann.

Nach Abschluss muss ein Programm die Subroutine endwin für jedes verwendete Terminal aufrufen. Wenn Sie die Subroutine newterm mehrmals für dasselbe Terminal aufrufen, muss das erste Terminal, auf das verwiesen wird, das letzte sein, für das Sie die Subroutine endwin aufrufen.

Die Subroutine set_term schaltet die Ein-und Ausgabeverarbeitung zwischen verschiedenen Terminals um.

Terminalfunktionen bestimmen

Curses stellt die folgenden Subroutinen bereit, mit denen Sie die Funktionalität eines Terminals ermitteln können:
Subroutine Beschreibung
has_ic Bestimmt, ob ein Terminal über die Funktion zum Einfügen von Zeichen verfügt
has_il Bestimmt, ob ein Terminal über die Funktion zum Einfügen von Zeilen verfügt
Langname Gibt den ausführlichen Namen des Terminals zurück.

Die Subroutine longname gibt einen Zeiger auf einen statischen Bereich mit einer ausführlichen Beschreibung des aktuellen Terminals zurück. Dieser statische Bereich wird erst nach dem Aufruf der Subroutine initscr oder newterm definiert. Wenn Sie die Subroutine longname mit mehreren Terminals verwenden möchten, überschreibt jeder Aufruf der Subroutine newterm diesen Bereich. Aufrufe der Subroutine set_term stellen den Wert nicht wieder her. Speichern Sie stattdessen diesen Bereich zwischen Aufrufen der Subroutine newterm .

Die Subroutine has_ic gibt TRUE zurück, wenn das Terminal über Einfüge-und Löschzeichenfunktionalität verfügt.

Die Subroutine has_il gibt TRUE zurück, wenn das Terminal über Einfüge-und Löschzeilenfunktionen verfügt oder die Funktionen mithilfe von Bildlaufbereichen simulieren kann. Verwenden Sie die Subroutine has_il , um zu prüfen, ob es sinnvoll ist, das physische Blättern mithilfe der Subroutinen scrollok und idlok zu aktivieren.

Ein-und Ausgabemodi für Terminals festlegen

Die Subroutinen, die die Eingabe und Ausgabe steuern, bestimmen, wie Ihre Anwendung Daten abruft und Benutzern anzeigt.

Eingabemodi

Spezielle Eingabezeichen umfassen die Flusssteuerzeichen, das Unterbrechungszeichen, das Löschzeichen und das Abbruchzeichen. Die folgenden sich gegenseitig ausschließenden Curses-Modi lassen die Anwendung die Wirkung der Eingabezeichen steuern:

Aufbereiteter Modus
Mit diesem Modus wird eine normale zeitbezogene Verarbeitung erreicht, bei der alle Sonderzeichen außerhalb der Anwendung verarbeitet werden, wodurch dieselbe Wirkung wie bei der kanonischen Eingabeverarbeitung erzielt wird. Der Status der ISIG-und IXON-Flags wird beim Aufrufen dieses Modus durch den Aufruf von nocbreak () nicht geändert. und werden beim Eintritt in diesen Modus durch Aufruf von noraw () gesetzt.

Die Implementierung unterstützt das Löschen und Beenden von Zeichen aus allen unterstützten Ländereinstellungen, unabhängig von der Zeichenbreite.

cbreak, Modus
Vom Benutzer eingegebene Zeichen stehen der Anwendung sofort zur Verfügung und Curses führen keine besondere Verarbeitung für das Löschzeichen oder das Abbruchzeichen durch. Eine Anwendung kann den Modus cbreak auswählen, um eine eigene Zeilenbearbeitung durchzuführen, aber das Abbruchzeichen verwenden, um die Task abzubrechen. Dieser Modus erzielt denselben Effekt wie der nicht kanonische Modus, die Eingabeverarbeitung für Fall B (wobei MIN auf 1 gesetzt und ICRNL gelöscht ist). Der Status der ISIG-und IXON-Flags wird beim Aufrufen dieses Modus nicht geändert.
Halbverzögerungsmodus
Der Effekt ist derselbe wie bei cbreak, mit der Ausnahme, dass Eingabefunktionen warten, bis ein Zeichen verfügbar ist oder ein von der Anwendung definiertes Intervall abläuft, je nachdem, was zuerst eintritt. Dieser Modus hat denselben Effekt wie der nicht kanonische Modus, die Eingabeverarbeitung von Fall C (wobei TIME auf den von der Anwendung angegebenen Wert gesetzt ist). Der Status der ISIG-und IXON-Flags wird beim Aufrufen dieses Modus nicht geändert.
Rohmodus
Der Rohmodus gibt der Anwendung maximale Steuerung über Terminaleingabe. Die Anwendung sieht jedes Zeichen so, wie es eingegeben wird. Dadurch wird der gleiche Effekt erzielt wie beim nicht kanonischen Modus, der Eingabeverarbeitung von Fall D. Die ISIG-und IXON-Flags werden beim Eintritt in diesen Modus gelöscht.

Die Terminalschnittstelleneinstellungen werden aufgezeichnet, wenn der Prozess die Subroutinen initscr oder newterm aufruft, um Curses zu initialisieren, und stellt diese Einstellungen wieder her, wenn die Subroutine endwin aufgerufen wird. Der Anfangseingabemodus für Curses-Operationen ist nicht angegeben, es sei denn, die Implementierung unterstützt die Konformität mit erweiterten Curses. Der Anfangseingabemodus ist der Modus cbreak .

Das Verhalten der BREAK-Taste hängt von anderen Bits im Anzeigetreiber ab, die nicht durch Curses festgelegt sind.

Verzögerungsmodus

Die folgenden sich gegenseitig ausschließenden Verzögerungsmodi geben an, wie schnell bestimmte Curses-Funktionen an die Anwendung zurückgegeben werden, wenn keine Terminaleingabe wartet, wenn die Funktion aufgerufen wird:
Verzögerung Beschreibung
Keine Verzögerung Die Funktion schlägt fehl.
Verzögerung Die Anwendung wartet, bis die Implementierung Text an die Anwendung übergibt. Wenn der cbreak-Modus oder der Raw-Modus festgelegt ist, folgt dieser nach einem Zeichen. Andernfalls folgt dies dem ersten Zeilenvorschubzeichen, dem Zeilenendezeichen oder dem Dateiendezeichen.

Die Auswirkung des Modus 'Keine Verzögerung' auf die Funktionstastenverarbeitung ist nicht angegeben.

Echomodusverarbeitung

Der Echomodus bestimmt, ob Curses eingegebene Zeichen an die Anzeige zurückmeldet. Der Effekt des Echomodus entspricht dem Effekt des Echoflags im Feld für den lokalen Modus der termios -Struktur, die dem mit dem Fenster verbundenen Endgerät zugeordnet ist. Curses löscht jedoch immer das Echo-Flag, wenn sie aufgerufen werden, um zu verhindern, dass das Betriebssystem Echos ausführt. Die Methode zum Zurückmelden von Zeichen ist nicht identisch mit der Methode des Betriebssystems zum Zurückmelden von Zeichen, da Curses eine zusätzliche Verarbeitung der Terminaleingabe durchführt.

Im Echomodus führt curses ein eigenes Echo durch. Jedes sichtbare Eingabezeichen wird im aktuellen oder angegebenen Fenster von der Eingabefunktion gespeichert, die die Anwendung an der Cursorposition dieses Fensters aufgerufen hat, als ob die Subroutine addch aufgerufen wurde, mit allen Folgeeffekten wie Cursorbewegung und Umbruch.

Wenn der Echomodus nicht aktiviert ist, muss jedes Echo der Eingabe von der Anwendung ausgeführt werden. Anwendungen führen häufig eigene Echos in einem gesteuerten Bereich der Anzeige aus oder melden gar nicht, sodass sie den Echomodus inaktivieren.

Möglicherweise ist es nicht möglich, die Echoverarbeitung für synchrone und asynchrone Netzwerkterminals zu inaktivieren, da die Echoverarbeitung direkt von den Terminals erfolgt. Anwendungen, die auf solchen Terminals ausgeführt werden, sollten sich bewusst sein, dass alle eingegebenen Zeichen an der Stelle auf dem Bildschirm angezeigt werden, an der sich der Cursor befindet.

Die folgenden Elemente sind Teil der Echoverarbeitungsfamilie von Subroutinen:
Subroutine Beschreibung
cbreak oder nocbreak Versetzt das Terminal in den CBREAK-Modus oder nimmt es aus dem CBREAK-Modus heraus
verzögerungsausgabe Legt die Ausgabeverzögerung in Millisekunden fest.
echo oder noecho Steuert die Rückmeldung von eingegebenen Zeichen an die Anzeige
Halbverzögerung Gibt ERR zurück, wenn nach der Blockierung für einen angegebenen Zeitraum keine Eingabe eingegeben wurde.
nl oder nonl Legt fest, ob Curses bei der Ausgabe eine neue Zeile in einen Rücklauf und einen Zeilenvorschub umsetzt und bei der Eingabe eine Rückkehr in eine neue Zeile umsetzt.
raw oder noraw Versetzt das Terminal in den oder aus dem Modus

Die Subroutine cbreak führt eine Untergruppe der Funktionen aus, die von der Subroutine raw ausgeführt werden. Im Modus cbreak stehen vom Benutzer eingegebene Zeichen dem Programm sofort zur Verfügung, und die Verarbeitung von Zeichen zum Löschen oder Beenden wird nicht ausgeführt. Im Gegensatz zum RAW-Modus werden Interrupt-und Flusszeichen bearbeitet. Andernfalls puffert der TTY-Treiber die eingegebenen Zeichen, bis eine neue Zeile oder ein Zeilenumbruch eingegeben wird.

Anmerkung: Der Modus CBREAK inaktiviert die Umsetzung durch den TTY-Treiber.

Die Subroutine delay_output setzt die Ausgabeverzögerung auf die angegebene Anzahl Millisekunden. Verwenden Sie diese Subroutine nicht übermäßig, da sie Füllzeichen anstelle einer Prozessorpause verwendet.

Die Subroutine echo versetzt das Terminal in den Echomodus. Im Echomodus schreibt Curses Zeichen, die vom Benutzer eingegeben wurden, an die Position des physischen Cursors an das Terminal. Die Subroutine noecho nimmt das Terminal aus dem Echomodus.

Die Subroutinen nl und nonl steuern, ob Curses neue Zeilen in Wagenrückläufe und Zeilenvorschübe bei der Ausgabe umsetzt. und ob Curses Zeilenumbrüche in neue Zeilen bei der Eingabe umsetzt. Anfangs finden diese Übersetzungen statt. Durch die Inaktivierung dieser Umsetzungen hat die Curses-Subroutinenbibliothek mehr Kontrolle über die Zeilenvorschubfunktion, was zu einer schnelleren Cursorbewegung führt.

Die Subroutine nocbreak nimmt das Terminal aus dem Modus cbreak.

Die Subroutine raw versetzt das Terminal in den unformatierten Modus. Im Rohmodus stehen dem Programm vom Benutzer eingegebene Zeichen sofort zur Verfügung. Außerdem werden die Unterbrechungs-, Abbruch-, Aussetzungs-und Flusssteuerzeichen nicht interpretiert, anstatt ein Signal zu generieren, wie dies im Cbreak-Modus der Fall ist. Die Subroutine noraw nimmt das Terminal aus dem unformatierten Modus.

Dateien terminfo und termcap verwenden

Bei der Initialisierung von Curses wird die Umgebungsvariable TERM überprüft, um den Terminaltyp anzugeben. Anschließend sucht Curses nach einer Definition, die die Funktionalität des Terminals erläutert. Diese Informationen werden normalerweise in einem lokalen Verzeichnis gespeichert, das über die Umgebungsvariable TERMINFO angegeben wird, oder im Verzeichnis /usr/share/lib/terminfo . Alle Curses-Programme prüfen zuerst, ob die Umgebungsvariable TERMINFO definiert ist. Wenn diese Variable nicht definiert ist, wird das Verzeichnis /usr/share/lib/terminfo überprüft.

Wenn die Variable TERM beispielsweise aufvt100Und die Variable TERMINFO ist auf die Datei /usr/mark/myterms gesetzt. Curses sucht nach der Datei /usr/mark/myterms/v/vt100 . Wenn diese Datei nicht vorhanden ist, überprüft curses die Datei /usr/share/lib/terminfo/v/vt100 .

Darüber hinaus können die Umgebungsvariablen LINES und COLUMNS festgelegt werden, um die Terminalbeschreibung zu überschreiben.

Programme schreiben, die die terminfo-Subroutinen verwenden

Verwenden Sie die terminfo -Subroutinen, wenn Ihr Programm direkt mit der terminfo-Datenbankarbeiten muss. Verwenden Sie beispielsweise diese Subroutinen, um Funktionstasten zu programmieren. In allen anderen Fällen sind Curses-Subroutinen besser geeignet und ihre Verwendung wird empfohlen.

Terminals initialisieren

Ihr Programm sollte mit dem Aufruf der Subroutine setupterm beginnen. Normalerweise wird diese Subroutine indirekt durch einen Aufruf der Subroutine initscr oder newterm aufgerufen. Die Subroutine setupterm liest die terminalabhängigen Variablen, die in der terminfo -Datenbank definiert sind. Die terminfo -Datenbank enthält boolesche, numerische und Zeichenfolgevariablen. Alle diese terminfo -Variablen verwenden die für das angegebene Terminal definierten Werte. Nach dem Lesen der Datenbank initialisiert die Subroutine setupterm die Variable cur_term mit der Terminaldefinition. Wenn Sie mit mehreren Terminals arbeiten, können Sie die Subroutine set_curterm verwenden, um die Variable cur_term auf ein bestimmtes Terminal festzulegen.

Eine weitere Subroutine, restartterm, ähnelt der Subroutine setupterm . Sie wird jedoch aufgerufen, nachdem der Speicher in einem früheren Zustand wiederhergestellt wurde. Sie würden beispielsweise die Subroutine restartterm nach einem Aufruf der Subroutine scr_restore aufrufen. Die Subroutine restartterm geht davon aus, dass die Eingabe-und Ausgabeoptionen mit denen beim Speichern des Speichers identisch sind, aber dass der Terminaltyp und die Baudrate unterschiedlich sein können.

Die Subroutine del_curterm gibt den Speicherbereich frei, der die Funktionsinformationen für ein angegebenes Terminal enthält.

Headerdateien

Schließen Sie die Dateien curses.h und term.h in Ihrem Programm in der folgenden Reihenfolge ein:

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

Diese Dateien enthalten die Definitionen für die Zeichenfolgen, Zahlen und Flags in der terminfo -Datenbank.

Handhabung von Terminalfunktionen

Übergeben Sie alle parametrisierten Zeichenfolgen über die Subroutine tparm , um sie zu instanziieren. Verwenden Sie die Subroutine tputs oder putp , um alle terminfo -Zeichenfolgen und die Ausgabe der Subroutine tparm auszugeben.

Subroutine Beschreibung
Putp Stellt eine Verknüpfung zur Subroutine tputs bereit.
tparm Instanziiert eine Zeichenfolge mit Parametern
tputs Wendet Auffüllinformationen auf die angegebene Zeichenfolge an und gibt sie aus

Verwenden Sie die folgenden Subroutinen, um Terminalfunktionen abzurufen und zu übergeben:

Subroutine Beschreibung
tigetflag Gibt den Wert einer angegebenen booleschen Funktion zurück Wenn die Fähigkeit nicht boolesch ist, wird -1 zurückgegeben.
tigetnum Gibt den Wert einer angegebenen numerischen Funktion zurück. Ist die Fähigkeit nicht numerisch, wird ein -2 zurückgegeben.
tigetzeichenfolge Gibt den Wert einer angegebenen Zeichenfolgefunktion zurück. Wenn die angegebene Fähigkeit keine Zeichenkette ist, gibt das Unterprogramm tigetstr den Wert(char *) -1 zurück.

Programm beenden

Wenn Ihr Programm beendet wird, stellen Sie die TTY-Modi in ihrem ursprünglichen Zustand wieder her. Rufen Sie dazu die Subroutine reset_shell_mode auf. Wenn Ihr Programm Cursoradressierung verwendet, sollte es die Zeichenfolge enter_ca_mode beim Start und die Zeichenfolge exit_ca_mode ausgeben, wenn es beendet wird.

Programme, die Shell-Escapes verwenden, müssen die Subroutine reset_shell_mode aufrufen und die Zeichenfolge exit_ca_mode ausgeben, bevor sie die Shell aufrufen. Nach der Rückkehr von der Shell sollte das Programm die Zeichenfolge enter_ca_mode ausgeben und die Subroutine reset_prog_mode aufrufen. Dieser Prozess unterscheidet sich von Standardcurses-Operationen, die die Subroutine endwin beim Exit aufrufen.

Low-Level-Anzeigensubroutinen

Verwenden Sie die folgenden Subroutinen für Low-Level-Anzeigenbearbeitungen:

Subroutine Beschreibung
Ripofflinie Entfernt eine einzelne Zeile aus stdscr
scr-speicherauszug Erstellt einen Speicherauszug des Inhalts des virtuellen Bildschirms in einer angegebenen Datei
scr_init Initialisiert die Curses-Datenstrukturen aus einer angegebenen Datei
scr_restore Stellt den virtuellen Bildschirm mit dem Inhalt einer zuvor erstellten Datei wieder her.

termcap-Subroutinen

Wenn Ihr Programm die termcap -Datei für Terminalinformationen verwendet, werden die termcap -Subroutinen als Konvertierungshilfe eingeschlossen. Die Parameter sind für die termcap -Subroutinen identisch. Curses emuliert die Subroutinen unter Verwendung der terminfo -Datenbank. Die folgenden termcap -Subroutinen werden bereitgestellt:

Subroutine Beschreibung
Getent Emuliert die Subroutine setupterm .
getflag Gibt den booleschen Eintrag für eine Termcap-ID zurück.
getnum Gibt den numerischen Eintrag für eine Termcap-ID zurück
tgetstr Gibt den Zeichenfolgeeintrag für eine Termcap-ID zurück.
tgoto Dupliziert die Subroutine tparm . Die Ausgabe der Subroutine tgoto sollte an die Subroutine tputs übergeben werden.

termcap-Beschreibungen in terminfo-Beschreibungen konvertieren

Der Befehl captoinfo konvertiert termcap -Beschreibungen in terminfo -Beschreibungen. Das folgende Beispiel veranschaulicht die Funktionsweise des Befehls captoinfo :
captoinfo /usr/lib/libtermcap/termcap.src

Dieser Befehl konvertiert die Datei /usr/lib/libtermcap/termcap.src in die terminfo -Quelle. Der Befehl captoinfo schreibt die Ausgabe in die Standardausgabe und behält Kommentare und andere Informationen in der Datei bei.

TTYs bearbeiten

Die folgenden Funktionen sichern und stellen den Status von Terminalmodi wieder her:

Funktionen Beschreibung
savetty Speichert den Status der TTY-Modi.
Zurücksetzung Stellt den Status der TTY-Modi auf den Stand zurück, den sie beim letzten Aufruf der Subroutine savetty hatten.

Synchrone und vernetzte asynchrone Terminals

Synchrone, vernetzte synchrone (NWA) oder vom Standard abweichende direkt verbundene asynchrone Terminals werden häufig in einer Mainframeumgebung verwendet und kommunizieren im Blockmodus mit dem Host. Das heißt, der Benutzer gibt Zeichen am Terminal ein und drückt dann eine spezielle Taste, um die Übertragung der Zeichen an den Host einzuleiten.

Anmerkung: Es ist zwar möglich, Blöcke beliebiger Größe an den Host zu senden, es ist jedoch nicht möglich oder wünschenswert, dass ein Zeichen mit nur einem einzigen Tastenanschlag übertragen wird. Dies kann zu schwerwiegenden Problemen für eine Anwendung führen, die Eingaben mit einem einzelnen Zeichen verwendet.

Ausgabe

Die Curses-Schnittstelle kann für alle Operationen verwendet werden, die sich auf die Ausgabe an das Terminal beziehen, mit der Ausnahme, dass die Routine refresh auf einigen Terminals möglicherweise den gesamten Anzeigeninhalt erneut zeichnen muss, um eine Aktualisierung durchzuführen.

Wenn es zusätzlich erforderlich ist, das Sieb vor jeder solchen Operation zu löschen könnte das Ergebnis unerwünscht sein.

Eingabe

Aufgrund der Art des Betriebs von synchronen (Blockmodus) und NWA-Terminals ist es möglicherweise nicht möglich, alle oder eine der Curses-Eingabefunktionen zu unterstützen. Beachten Sie insbesondere die folgenden Punkte:
  • Eine Einzelzeicheneingabe ist möglicherweise nicht möglich. Möglicherweise muss eine Sondertaste gedrückt werden, damit alle am Terminal eingegebenen Zeichen an den Host übertragen werden.
  • Es ist manchmal nicht möglich, das Echo zu inaktivieren. Zeichenecho kann direkt vom Terminal ausgeführt werden. Auf Terminals, die sich auf diese Weise verhalten, sollten alle Curses-Anwendungen, die Eingaben vornehmen, beachten, dass alle eingegebenen Zeichen an der Stelle auf dem Bildschirm angezeigt werden, an der sich der Cursor befindet. Dies entspricht nicht unbedingt der Position des Cursors im Fenster.