Erste raw-input von Konsole mit C oder C++
/* Initialize new terminal i/o settings */
static struct termios old, new1;
void initTermios(int echo) {
tcgetattr(0, &old); /* grab old terminal i/o settings */
new1 = old; /* make new settings same as old settings */
new1.c_lflag &= ~ICANON; /* disable buffered i/o */
new1.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */
tcsetattr(0, TCSANOW, &new1); /* use these new terminal i/o settings now */
}
/* Restore old terminal i/o settings */
void resetTermios(void) {
tcsetattr(0, TCSANOW, &old);
}
Wie bekomme ich die Pfeil-Schlüssel, die als Eingabe (möglicherweise als ein einzelnes Zeichen), den aktuellen code funktioniert gut für alle anderen Dinge, die ich brauche... Bitte keine Lösung mit ncurses
new1.c_lflag &= echo ? ECHO : ~ECHO
ist das wirklich Arbeit? Ich denke, es sollte mehr entlang den Linien vonnew1.c_lflag = echo ? new1.c_lflag | ECHO : new1.c_lflag & ~ECHO
- es funktioniert perfekt, give it a shot
- Fiktik hat völlig Recht, sieht aus wie Sie nur ausgeschaltet echo und nie getestet einschalten.
- tut mir Leid, dass ich nie wirklich getestet für echo, my bad
- Danke an alle, landete um was ich hatte... habe 3 char als input ausgewählt, bestimmt die Richtung (Pfeil)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht tun dies in standard-C++/C, müssen Sie die nicht-Standard-conio.h-Datei und die getch () - Erweiterung. Dann können Sie den Aufruf getch() zweimal, um den Schlüssel-code für die Pfeile
Haben Sie versucht, die
read
Funktion?Dieser funktioniert bei mir mit cygwin-g++, nicht linux praktisch zu testen:
Als @Fiktik festgestellt, dass der echo-setup fehlerhaft ist, aber ich bin mit dem code in der Frage ohne änderungen.
Gibt es ein tolles tutorial über das schreiben von text-Editoren für Unix-terminals, mit raw-Eingabe, syntax-Einfärbung, etc., die verwendet nur die standard-C-Bibliothek und der standard-Header zur Verfügung, die auf Unix-ähnlichen Systemen:
https://viewsourcecode.org/snaptoken/kilo/02.enteringRawMode.html
Dieses Kapitel tutorial erklärt, wie wechseln-terminal-Eingang zu den raw-Modus und verarbeiten es mit standard-IO-Funktionen aus C (
read()
& Zeug). Dann können Sie die Dinge handhaben, wie cursor-Bewegungen, scrollen, Farben etc. schreiben Sie die Ausgabe mit bestimmte escape-Sequenzen, der VT100-terminal. Finden Sie mehr in diesem tutorial, einschließlich der links zu den Dokumentationen erforderlich sind, und Beispiel-Quellcodes. Es gibt auch ein GitHub-repository mit all der Beispiele aus dem tutorial, sowie das Endprodukt, basierend auf der Kilo-editor geschrieben von antirez.Als Lektüre für die spezielle Tasten, wie die Pfeiltasten, Home ,End, PgUp, PgDown, etc., versuchen Sie, die Ausgabe der raw-Zeichen, die Sie von der Eingabe und drücken Sie einfach die Tasten, die Sie wollen, um zu sehen, welche codes, die Sie anzeigen zu können. Für die Pfeil-Tasten, zum Beispiel, Sie in der Regel anzeigen, um die escape-Sequenzen
<ESC>[A
durch<ESC>[D
, wo<ESC>
ist die spezielle steuerzeichen mit dem ASCII-code27
dezimal-oder0x1B
hexadezimal. Das sind die VT100-terminal-escape-codes, die anweisen, das terminal zu bewegen den cursor um ein Zeichen in eine dieser vier Richtungen. Mehr über den Umgang mit diesen Tastenkombinationen in das nächste Kapitel des oben genannten tutorial:https://viewsourcecode.org/snaptoken/kilo/03.rawInputAndOutput.html
Als ein einzelnes Zeichen ist das nicht möglich (die Eingabe ist eine Sequenz von Zeichen). Was Sie kann tun ist, machen es so Aussehen wie ein einzelnes Zeichen von der Umsetzung Ihrer eigenen input-Funktion. So etwas wie:
Also nach der Implementierung, die Sie verwenden können
get_key_press
zu handeln, wie es ist immer ein einzelnes Zeichen.Obwohl diese Arbeit bereits für Sie erledigt anderswo; warum die Abneigung gegen
ncurses
?