Seitenleiste

Community

GUIs

Einstieg

Plattformübergreifend

Konsolenbasiert

Fenster aktualisieren

NCurses arbeitet mit Fenstern, die Zeichen und Attribute (Farben/Schriftstil) in eigenen Datenstrukturen speichern. Wenn man diese Datenstrukturen verändert, z.B. mit mvaddstr(), so passiert auf dem Bildschirm noch nichts. Die Datenstrukturen, die NCurses anlegt, sind eine Art Zwischenpuffer, in dem alle Änderungen eingepflegt werden, bis der Benutzer sagt, dass er alles so geändert hat, wie er sich das vorstellt und die Daten jetzt an das Terminal gesendet werden können.

Fensterinhalt aktualisieren

Hierfür gibt es die Funktionen refresh() und natürlich die dazugehörige Window-Variante wrefresh().

Die Refresh-Funktionen rufen die beiden Funktionen wnoutrefresh() und doupdate(). wnoutrefresh kopiert dabei alle veränderten Zeichen in einen virtuellen Screen. Diese veränderten Zeichen werden anschließend mit doupdate() an das Terminal gesendet. Wenn mehrere Fenster aktualisiert werden sollen, so ist es besser erst alle Änderungen der zu aktuallisierenden Fenster mit wnoutrefresh() in den virtuellen Screen zu kopieren um dann alle Änderungen mit einem einzigen doupdate() an das Terminal zu schicken.

Touch

Auch wenn ein Fenster aktualisiert werden soll, so lohnt sich das erst, wenn auch wirklich eine Veränderung stattgefunden hat. Hierfür wird sich gemerkt, ob das Fenster „berührt“ wurde, also ob es überhaupt eine Veränderung in der Datenstruktur gegeben hat, die man einem Terminal mitteilen müsste.

Diese Information wird zeilenweise gespeichert und kann mit der Funktion touchline(), bzw. wtouchln() gesetzt werden und mit is_linetouched() abgefragt werden. Man kann auch gleich ein ganzes Fenster für verändert erklären: touchwin(). Dies ignoriert jegliche Versuche, die Übertragung zu optimierung, kann aber erforderlich werden, wenn man ein Fenster in den Vordergrund holen möchte und damit ein anderes Fenster überzeichnen möchte.

Hat man eine Änderung gemacht und diese auch vor dem Senden wieder zurückgesetzt, so ist es möglich das Touchflag zurückzunehmen, allerdings nur für das komplette Fenster: untouchwin(). Hier ist entsprechend Vorsicht geboten.