PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VT100-Probleme: Ein einzelnes Char lesen?



schoppenhauer
02-02-2007, 13:39
Hallo.

Ich Experimentiere gerade mit VT100 und Ähnlichem rum, und hab ne ganz tolle Spezifikation gefunden unter http://www.cs.utk.edu/~shuford/terminal/vt100_codes_news.txt (nur, falls es jemanden interessiert).

Jetzt hab ich aber ein Problem...

Ich versuch grad einen Device Status Report zu erhalten (Nur zum Test)... Und das ganze Klappt auch schon relativ gut mit dem folgenden code:


#include <stdio.h>

int main (void) {
printf("\33[1x");
while (1) {
char *c;

fread (c, 1, 1, stdin);
// = getchar ();
// = getc (stdin);
// = fgetc (stdin);
if (*c == '\33') printf("<ESC>");
else { printf("%c", *c); }
}

printf("\n");
}

Wie man aber unschwer sieht, hab ich es schon mit fgetc, getchar, getc, etc., versucht... Also das Programm macht im Grunde das Folgende: Es sendet den Befehl, der in der Spezifikation DECREQTPARM heißt, an den VT-Emulator... Und liest dann (in ner Endlosschleife zwar, aber egal, es geht auch nicht, wenn ich die Anzahl der Chars beschränke) vom Stdin. Und das tolle und unerwartete ist: Ja, zumindest xterm antwortet sogar... Aber das einzige Problem ist: Das Programm setzt voraus, dass ich enter drücke. Anscheinend funktioniert getchar und das ganze andere Zeugs nicht, bevor man nicht enter drückt.

Wenn ich enter drücke ist die Ausgabe "<ESC>[3;1;1;128;128;1;0x". Was das genau heißt, weiß ich zwar atm nicht (weils nicht in der Spezifikation steht), aber das ist ein anderes Problem. Ich will die Chars auch lesen können, ohne dass ich extra enter drücken muss... Gibts da eine Möglichkeit?

Es wäre generell mal interessant zu wissen, wie man Character auch von der Tastatur direkt einliest, ohne dass enter gedrückt werden muss.

Aber keine ahnung, vielleicht hab ich in der Spezifikation ja irgendwas übersehen.

Bin jedenfalls über jede Hilfe (die verschieden von "wozu willst du das? benutz doch ncurses für sowas." ist) dankbar.

rais
04-02-2007, 18:08
Moin moin,


Wenn ich enter drücke ist die Ausgabe "<ESC>[3;1;1;128;128;1;0x". Was das genau heißt, weiß ich zwar atm nicht (weils nicht in der Spezifikation steht), aber das ist ein anderes Problem.

Eine Beschreibung findest Du unter DECREPTPARM (Report Terminal Parameters), obwohl {sol} und {xspd}/{rspd} inzwischen wohl etwas anders aussehen:
http://vt100.net/docs/vt100-ug/chapter3.html
hmm, xspd/rspd wird hier mit 128 auch nicht erwähnt, aber dann sind die Rechner heutzutage ja auch n Tuck fixer, als zur Zeit der VT100-Einführung;-)

Ich will die Chars auch lesen können, ohne dass ich extra enter drücken muss... Gibts da eine Möglichkeit?

kA, bei mir läuft's auch ohne enter (so meine enter-Taste denn nicht prellt :D), aber dann hab' ich's ja auch nur unter Linux getestet. Du könntest mal über ``man xterm´´ schauen, inwieweit sich der Eingabepuffer bei Dir reduzieren lässt (so er denn eine Rolle spielt). Morgen kann ich das Teil auch noch mal auf ner sun testen (nee, so'n Teil hab' ich nicht zuhause;-))... oder auf welcher Maschine bzw. unter welchem Betriebssystem versuchst Du Dich da gerade?
MfG,

schoppenhauer
07-02-2007, 10:46
Moin moin,

Eine Beschreibung findest Du unter DECREPTPARM (Report Terminal Parameters), obwohl {sol} und {xspd}/{rspd} inzwischen wohl etwas anders aussehen:
http://vt100.net/docs/vt100-ug/chapter3.html
hmm, xspd/rspd wird hier mit 128 auch nicht erwähnt, aber dann sind die Rechner heutzutage ja auch n Tuck fixer, als zur Zeit der VT100-Einführung;-)Ja. Also ich hab mich nur gewundert, dass da halt Werte rauskommen, die nicht in der Liste standen... Aber das ist ja nicht das Problem.


kA, bei mir läuft's auch ohne enter (so meine enter-Taste denn nicht prellt :D), aber dann hab' ich's ja auch nur unter Linux getestet. Du könntest mal über ``man xterm´´ schauen, inwieweit sich der Eingabepuffer bei Dir reduzieren lässt (so er denn eine Rolle spielt). Morgen kann ich das Teil auch noch mal auf ner sun testen (nee, so'n Teil hab' ich nicht zuhause;-))... oder auf welcher Maschine bzw. unter welchem Betriebssystem versuchst Du Dich da gerade?
MfG,Also ich habs unter Linux (Debian Etch), irgendsoeinem Solaris-Viech, der Cygwin Bash Shell und dem XTerm von Cygwin probiert... Es geht nicht. Ich hab inzwischen gelesen, dass scheinbar die ganzen Eingabemethoden (weil es ja jetzt sooo viele tolle GUI-Widget-Toolkits gibt, dass gescheite eingabemethoden vom stdin ja sooo abwegig sind) wie getch() und bla auf ner hoeheren, bereits gepufferten Ebene stattfinden, die ein \n brauchen und so, weil das die Sache ja so dermassen vereinfacht... So ein schmarrn, wie ich finde - ich meine, bei sscanf versteh ich das, aber bei getch() macht das einfach keinen sinn... Jedenfalls hab ich jetzt mal ein paar beispielcodes, die irgendwie ellenlange Systemaufrufe machen, um dieses tolle "feature" zu umgehen... Dabei werden bereits Libs genutzt, die das Terminal ansteuern koennen (ncurses) - was ich nicht will... ausserdem benutze ich nicht gerne code, den ich nicht verstehe...
Hauptnachteil ist vor allem, dass man die Programme nicht mit C-c abbrechen kann... Also und ich kann aber auch C-c nicht abfangen irgendwie, ich krieg keine Eingabe, wenn ich C-c druecke... Ich HASSE die Programme, die man nicht mit C-c oder wenigstens C-d killen kann... Und werde bestimmt kein solches selber proggen... Das ist mE eine Unsitte, genau wie Fenster, die man nicht mit dem Schliessbutton schliessen kann, bzw. die dann zu nem Tray icon werden oder irgendwelche Prozesse weiterlaufen lassen...

Es /muss/ doch irgendwie in sinnvoller und einfacher Weise moeglich sein, einfach ein Char von der Tastatur, bzw. dem Terminal, zu lesen... Ich meine, immerhin sollte das so ziemlich eines der Elementarsten Dinge sein, die ein Computer, der in irgendeiner Weise eine Tastatur hat, erledigen kann... Schon die alten Rechenmaschinen in den 70ern haben auf Eingaben reagiert :p .

Kann man vielleicht das Terminal irgendwie dazu Veranlassen, ein \n zu senden? Ich hab keinen gesehen, aber vielleicht gibts ja den Befehl "sende mir dieses und jenes byte" oder so.