Seitenleiste

Community

GUIs

Einstieg

Plattformübergreifend

Konsolenbasiert

Der NCurses Modus

NCurses übernimmt in gewisser Weise die Kontrolle über die Textkonsole und legt ein NCurses Fenster über die Bildfläche der gesamten Konsole. Dieses Haupt-Fenster wird in der globalen Variable stdscr gespeichert und nach der Initialisierung zunächst leer. Weiterhin existiert eine globale Variable curscr, die den derzeit aktiven Screen beschreibt.

Ein solches Fenster wird nun bestückt mit Ausgaben, die es zu leisten hat, zum Beispiel einem Text. Um in den NCurses-Modus zu wechseln, initialisiert man NCurses mit der Funktion initscr(). Möchte man den NCurses-Modus beenden, z.B. wenn man das Programm verlässt, so ruft man die Funktion initscr() und die Konsole wird in den Zustand zurückgesetzt, die sie hatte, als initscr() gerufen wurde. Es wird also auch der Text vor Programmstart wieder hergestellt. Mit refresh() kann der NCurses-Modus wieder hergestellt werden, wenn er im Verlauf des Programms übergangsweise abgeschaltet wurde. Die Funktion isendwin() kann verwendet werden, um herauszufinden, ob man sich im NCurses-Modus befindet.

Ein- und Ausgaben

Da NCurses die Kontrolle über die Konsole übernimmt, sollten keine Funktionen mehr zur Ein- und Ausgabe verwendet werden, die direkt von der Konsole lesen. printf() oder scanf() sind also tabu, wenn sie nach stdin oder stdout schreiben. Auch stderr sollte nicht verwendet werden, sofern man es nicht zuvor in eine Datei umgelenkt hat. Die Ein- und Ausgabe auf andere Geräte, wie z.B. das Dateisystem sind davon nicht betroffen. fprintf() ist also in Ordnung, wenn man sich nicht auf stdout schreibt.

Für Ein- und Ausgaben auf den Bildschirm bietet NCurses einen ganzen Satz eigener Funktionen an, als einfachste dient dabei addstr(), die einen nullterminierten String auf den curscr einträgt. Damit werden die Buchstaben auf das Fenster wie auf einer Bitmap eingetragen und das Fenster kann nun nach Belieben sichtbar oder unsichtbar geschaltet werden, ohne dass man die Texte neu positionieren muss. Um die Ausgabe wirklich zu aktualisieren, muss diese Bitmap aus Buchstaben anschließend mit der Funktion refresh() auf die Konsole kopiert werden.

Größe der Ausgabe

Das Terminal, auf dem die Ausgabe stattfindet, hat nur eine gewisse Größe. In den guten alten Tagen hatte ein Terminal in der Regel 80 Spalten bei 23 Zeilen. Heutzutage ist die Konsole meist ein Fenster, dessen Größe man anpassen kann und auch die Text-Konsole bei Linux-Systemen ist häufig mit viel mehr Zeilen und Spalten versehen.

Um sich zu orientieren, wie groß die Ausgabe ist, kann man mit der Funktion getyx() die größe eines Fensters abfragen. Fragt man das Hauptfenster stdscr ab, kennt man die Größe der Konsole.

Das Koordinatensystem

Das Koordinatensystem wird von links nach rechts und von oben nach unten aufgebaut. Oben links ist also die Zeile 1 und die Spalte 1. Hier muss in NCurses etwas aufgepasst werden, da den NCurses-Funktionen zuerst die y-Koordinate (Zeile) und dann die x-Korrdinate (Spalte) übergeben werden.

Konsolenfenster
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Zeile 1
Zeile 2
Zeile 3