====== 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 [[gui:ncurses:lib:initscr()]]. Möchte man den NCurses-Modus beenden, z.B. wenn man das Programm verlässt, so ruft man die Funktion [[gui:ncurses:lib: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 [[gui:ncurses:lib:refresh()]] kann der NCurses-Modus wieder hergestellt werden, wenn er im Verlauf des Programms übergangsweise abgeschaltet wurde. Die Funktion [[gui:ncurses:lib: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. [[c:lib:stdio:printf()]] oder [[c:lib:stdio:scanf()]] sind also tabu, wenn sie nach [[c:lib:stdio:stdin]] oder [[c:lib:stdio:stdout]] schreiben. Auch [[c:lib:stdio: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. [[c:lib:stdio:fprintf()]] ist also in Ordnung, wenn man sich nicht auf [[c:lib:stdio:stdout]] schreibt. Für Ein- und Ausgaben auf den Bildschirm bietet NCurses einen ganzen Satz eigener Funktionen an, als einfachste dient dabei [[lib:addstr()]], die einen [[glossary:cstring|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 [[gui:ncurses:lib: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 [[gui:ncurses:lib: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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9| |Zeile 1|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |Zeile 2|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |Zeile 3|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |...||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||