Es sollte also Java sein. Diese objektorientierte Ausgeburt einer Lehrbuchsprache, die, hochgehypt in den 90ern, an keiner Uni mehr fehlen darf. Ausgerechnet Java. Das mir, der ich es liebe, dem Benutzer jeden Wunsch nicht erst nach einem Enter sondern gleich nach der ersten sanften Berührung der Taste von den Fingern abzulesen.
Einzelnes Zeichen. Klingt simpel.
Ist es aber nicht. Dass Java mit Stream arbeitet war mir bewusst. Leider stellte sich ziemlich schnell heraus, dass diese Idee, so simpel, rudimentär und banal sie mir am Anfang schien nicht mit Java-Bordmitteln zu lösen war. Ein System.in.read() liefert zwar ein einzelnes Zeichen. Aber das erst, wenn der Benutzer sich ob mangelnder Reaktion des Programmes genötigt sieht, mit einem Enter nachzuhelfen - also genau das zu tun, was ich ihm abzunehmen gedachte.
Was nun? Es gab mehrere Moeglichkeiten: Zu einen koennte man dem Programm einen Launcher voranstellen, der die Benutzereingabe annimmt und alle Tastendrücke gefolgt von \n an das Java-Programm weiterleitet. Dies ist eine funktionierende Methode, die lediglich Kenntinis der Funktion popen voraussetzt. Allerdings eine zugegebenermaßen nicht sehr schöne Maßnahme. Andere Möglichkeit: Einfach die Tastendrücke mittelt der großen Werkzeugkiste awt abfangen. Klingt nach Bordmitteln. Allerdings erschien es mir noch mehr Überhang, wenn ich ein komplettes GUI-Toolkit mit mir herumschleppen muss und meine Programme dann zur Strafe auch noch nur dann funktionieren, wenn ueberhaupt eine Graphische Benutzeroberfläche zur Verfügung steht1. Also auch keine Lösung. Eine auf den ersten Blick abwegige Möglichkeit ist es, einen Telnetserver zu schreiben. Dies hat aber in der Praxis tatsächlich Vorteile: Das Programm ist automatisch netzwerkfähig bzüglich der Eingabe und auch die abgedrehtesten Betriebssysteme habe auf diesem Weg eine Standard-Konsole: Die VT100-Emulation der meisten Telnet-Implementationen sollte sich zu 90% überschneiden. Der Nachteil ist nicht zu verschweigen: Ein Netzwerk-UI erfordert ein Programm, dass gegebenenfalls auch mit mehreren gleichzeitig zugreifenden Benutzern klarkommt (klarkommen muss).. Was eine doch erhebliche Anforderung ist. Die nächste Möglichkeit wäre gewesen, eine sog. "native Klasse" zu schreiben, soll heissen, der kritische Teil (das Abfangen eines Zeichens) wird in C++ erledigt und die entsprechende Klasse von Java geladen. Allein: Das dazu nötige Procedere schreckte mich ab. Ebenso, dass für jede Plattform eine eigene Native Klasse geschrieben werden müßte.
Irgendwann (ein paar Wochen später) begann ich, mir die Frage zu stellen, wo eigentlich diese Notwendigkeit eines Zeilenumbruches herkommt. Die Antwort überraschte mich: Es ist die Konsole und nicht die Java-Umgebung! Der Java-Strom liefert in der Tat den Tastendruck, sobald er ihn selbst bekommt. Ich hatte es also mit einem viel mächtigeren Problem zu tun, wie es schien. Was es bedeutet, hinter Konsolen und deren Erzeugnissen hinterherzurennen habe ich bereits erfahren dürfen; mein Mut sank entsprechend ab. Aber ich verfehlte mit meiner Mutlosigkeit das Problem: Noch hatte ich ja gar keine unsinnigen Tastencodes - ich wollte ja gerade erst solche jagen gehen. Aber - da das Problem ein Konsolensolches ist, muss es eine einfache Lösung geben können. Dann muss man nur die Konsole verstellen.... und das war auch die Lösung. Sagen wir der Konsole doch einfach "Alles, was du bekommst, gibst du direkt und ungepuffert weiter!". Dieser Ansatz ist simpel. Und leicht umzusetzen noch dazu2: Es bedarf lediglich des Befehls stty -icanon min 1. Damit sage ich genau jenes der Konsole.
Und das funktioniert wirklich. Wenn jener Befehl vor dem Java-Programm gestartet wurde, erhielt ich brav einzelne Tastendrücke.
Nun die Grätschenfrage: Auf welchen Systeme und auf welchen Konsolen funktioniert das? Die Antwort ist ebenso schön wie überraschend simpel: Auf allen POSIX-konformen Konsolen. Damit sollte die UNIX-und LINUX-Welt so ziemlich abgedeckt sein, jedes System wird mindestens eine Konsole besitzen, die diesem Anspruch gerecht wird.

Es bleibt noch die Frage, wie man das automatische Echo loswird, dass bei Sonderzeichen äßerst häßlich ausssieht und bei normalen Tasten nicht gewünascht sein kann (z.B. bei Passworteingaben). Auch dieses Problem läßt sich recht einfach lösen: stty -echo schaltet das automatische Echo der Konsole ab. Dies mittels stty echo wieder einzuschalten sollte allerdings nicht vergessen werden, da sich die Konsolenbedienung ansonsten recht schwer gestaltet.

Und was ist mit Windows?
Nichts. Windows ist mir (bezueglich dieser Problematik pragmatischerweise einstweilen) egal. Solange Windows keine POSIX-konformen Konsolen3 mtbringt, hat es Pech gehabt. Wer von Standards4 abweicht muss damit rechnen, dass er nicht unterstützt wird. Windows-Benutzer mögen solange einen Login auf einem POSIX-System haben, auf dem sie sich per Telnet einloggen können (einen ssh-Client befindet man bei Microsoft offensichtlich noch immer eines Windows-Nutzers unwürdig5, als Alternative bleibt PuTTY).


Fussnoten:

Stichworte:


Impressum