5 Stimmen

ncurses zur externen Shell und zurück mit Tasten durcheinander bringen

Ich habe diese ncurses-Anwendung, die das Standardrezept für vorübergehend aus ncurses auszusteigen, einen externen Editor/Shell/was auch immer, und dann zurück zu ncurses, wenn es fertig ist.

Das funktioniert fast, außer dass die ersten paar Tastendrücke, die ncurses danach bekommt, offensichtlich gefälscht sind; ncurses denkt, ^[ und A werden gesehen gesehen, wenn ich zweimal den Pfeil nach oben drücke.

Hat jemand dieses Verhalten schon einmal beobachtet und kennt den Zauberspruch zur Behebung ist? Wenn es irgendwie hilft, ist dies die Ruby ncurses Bibliothek.

1voto

Edward Z. Yang Punkte 25634

Nachdem ich ein wenig herumgewühlt hatte, fand ich eine Cargo-Culting-Lösung: Ich rief explizit keypad(1) auf, nachdem ich die Shell auf stdscr verlassen hatte. Ich habe keine Ahnung, warum das funktioniert, aber es funktioniert. Ich werde die Antwort eines anderen als ja markieren, wenn er/sie erklären kann, warum. Die derzeitige Theorie besagt, dass das Tastenfeld eine Art internen Puffer berührt und diesen löscht.

Streichen Sie das:

NCURSES\_EXPORT(int)
keypad(WINDOW \*win, bool flag)
{
    T((T\_CALLED("keypad(%p,%d)"), win, flag));

    if (win) {
        win->\_use\_keypad = flag;
        returnCode(\_nc\_keypad(SP, flag));
    } else
        returnCode(ERR);
}

0voto

Gabe Punkte 1041

Ja, das stimmt. Ohne Keypad wird ncurses keine Escape-Codes für Sie verarbeiten. Aus der Keypad Man Page:

   The keypad option enables the keypad of the user's  terminal.   If  en-
   abled (bf is TRUE), the user can press a function key (such as an arrow
   key) and wgetch returns a single value representing the  function  key,
   as in KEY_LEFT.  If disabled (bf is FALSE), curses does not treat func-
   tion keys specially and the program has to  interpret  the  escape  se-
   quences  itself.   If the keypad in the terminal can be turned on (made
   to transmit) and off (made to work locally),  turning  on  this  option
   causes  the terminal keypad to be turned on when wgetch is called.  The
   default value for keypad is false.

Oft ist das erste, was ich in einem ncurses-Programm mache, der Aufruf von keypad(stdscr, true), um eine schöne Tastaturbelegung zu ermöglichen.

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X