2016-12-13 12 views
1

Ich replizieren ein Irssi interface für ein Schülerprojekt. Ich möchte NCurses für die Textschnittstelle verwenden und readline bessere Text-Bearbeitungsfunktionen beim Schreiben von Nachrichten bieten.Readline & NCurses, behandeln spezielle Tasten und Tastenkombinationen

Diese question, answer und project lieferte mir einen guten Ausgangspunkt.

Mein Problem ist, dass ich möchte eine Eingabe/Ereignisschleife wie diese haben:

int ch; 
while (exit_condition) { 
    ch = wgetch(window); 
    switch (ch) { 
    case ERR: continue; 
    case KEY_F(1): /* do something */ break; 
    case KEY_UP: /* do something else */ break; 
    default: forward_to_readline(ch); break; 
    } 
} 

Aber um KEY_F(n) oder KEY_UP ich keypad(window, TRUE) aktivieren müssen übereinstimmen, die die Eingabe wird ändern und es machen unbrauchbar für readline.

Aus dem Handbuch:

Wenn Tastatur TRUE ist, und eine Funktionstaste gedrückt wird, wird das Token für die Funktionstaste anstelle der rohen Zeichen zurückgegeben.

Wenn ein Zeichen, das der Anfang einer Funktionstaste sein könnte, ist empfangen (was, auf modernen Terminals, bedeutet ein Escape-Zeichen), flurs setzt einen Timer. Wenn der Rest der Sequenz nicht innerhalb der angegebenen Zeit in kommt, wird das Zeichen durchlaufen; Andernfalls wird der Wert des Funktionstastenwerts zurückgegeben. Aus diesem Grund gibt es viele Terminals eine Verzögerung zwischen der Zeit, die ein Benutzer drückt die Escape-Taste und das Escape wird an das Programm zurückgegeben.

Hier sind meine Gedanken:

  • Gibt es eine Funktion, die Wirkung von keypad zu umkehren?
  • Sollte ich das Verhalten von keypad selbst implementieren? Ich denke, ich muss das auch tun, wenn ich Events wie Shift + Up einfangen will. Ich wäre froh, Beispiele dafür zu haben.
  • Kann mir die Tastenkombination readline geben, wenn ich es NCurses bilden nicht erhalten können? vielleicht mit Key Binding Callbacs (relevant ?)?

Vielen Dank für Ihre Zeit!

Antwort

2

, dass mehrere Fragen ist. Kurz:

  • die Umkehrung der keypad Funktion ist durch den Aufruf, dass für ein bestimmtes Fenster mit dem Parameter auf FALSE.
  • einige Anwendungen implementieren ihre eigene Version von keypad/wgetch, aber (da Sie das Timeout mit Ncurses 'ESCDELAY) steuern können, gibt es nicht viel Gewinn dort, es sei denn, Sie wollten portabel, sagen wir, zu Solaris Flüche.
  • würden Sie keine Verbesserung mit Verschiebung erhalten + bis, zum Beispiel (das ist eine Terminal-abhängige Escape-Sequenz)
  • Readline- an der Fähigkeit sieht nicht nach oben in der Terminal-Datenbank der Liste shift + (Es ist nicht in der Untergruppe von Termcap, die es kennt). Was es für Sie tun könnte, ist eine Zeichenfolge mit einer Readline-Funktion zu verknüpfen.
+0

Vielen Dank! Ich schätze, es könnte keine bessere Person geben, um meine Fragen zu beantworten. Ich werde mit der Readline-Funktion gehen. Was ich mit der umgekehrten Tastatur meinte, ist, dass ich bei einem Token für eine Funktionstaste die Reihenfolge der Escape-Codes am Ursprung des Tokens abrufen konnte. –