2016-05-31 14 views
0

Ich bin derzeit auf eine komplette Schale in C. gebaut ArbeitsFang Pfeiltasten TermCaps

Ich möchte eine Bash Geschichte und Navigation mit Pfeiltasten durch meine doppelt verkettete Liste implementieren, aber ich habe einige Probleme mit TermCaps und richtig Einrichtung read() Funktion.

Hier ist, wie ich meinen Terminal einrichten:

static int  set_terminal_mode(t_shell *shell, const int mode) 
{ 
    char   *term_name; 

    if (mode == 0) 
    { 
     if ((term_name = getenv("TERM")) == NULL) 
     return (-1); 
     ioctl(0, TCGETS, &shell->term); 
     shell->term.c_lflag &= ~ICANON; 
     shell->term.c_cc[VMIN] = 1; 
     shell->term.c_cc[VTIME] = 0;           
     ioctl(0, TCGETS, &shell->term_save); 
     ioctl(0, TCSETS, &shell->term); 
    } 
    if (mode == 1) 
    ioctl(0, TCSETS, &shell->term_save); 
    return (0); 
} 

ich fangen kann, wenn nach links oder rechts-Taste gedrückt wird und dann \r ich die Zeile löschen (was wirklich nicht funktioniert), aber die Haupt Problem ist, dass ich die Return-Taste nicht mehr benutzen kann (nur Anzeige ^?) Wie kann ich das beheben?

Antwort

0

Diese Linie

 shell->term.c_lflag &= ~ICANON; 

dreht kanonische Modus aus, der according to POSIX mehrere Dinge tut einschließlich der Zeilenpuffer Abschalten, die eine besondere Behandlung der Wagenrücklauf beinhaltet:

in nicht Kanonische Modus-Eingabeverarbeitung, Eingabebytes werden nicht zu Zeilen zusammengesetzt, und Lösch- und Kill-Verarbeitung soll nicht auftreten.

und

CR
Sonderzeichen am Eingang, der, wenn die ICANON-Flag erkannt wird, wird festgelegt; es ist das Wagenrücklaufzeichen. Wenn ICANON und ICRNL gesetzt und IGNCR nicht gesetzt ist, wird dieser Charakter in eine NL übersetzt werden, und hat die gleiche Wirkung wie ein NL Charakter haben.

Wenn Sie einzelne Bytes (für Cursor-Tasten) lesen möchten, werden Sie Single-Byte-Steuerzeichen wie Wagenrücklauf (CR) und Zeilenvorschub (bezeichnet als NL oder Newline) behandeln müssen .

By the way, scheint Ihr Beispiel die gespeicherten/geänderten Einstellungen umgekehrt zu haben: Der Anruf

 ioctl(0, TCSETS, &shell->term_save); 

in

 ioctl(0, TCGETS, &shell->term_save); 

gespeichert Terminaleinstellungen verwendet, die, nachdem Sie bereits das Terminal geändert haben, ist die Einstellungen.