2017-11-27 16 views
0

Ich teste ein ncurses-Programm, das unter ncurses5 ausgeführt wurde, aber kürzlich unter curses6 in einer neuen Umgebung (putty/xterm/virtualbox) kompiliert wurde und keine Funktionsschlüssel erkennen kann. Die Pfeiltasten funktionieren gut, aber nur die, die eine Escape-Sequenz verwenden, scheinen fehlzuschlagen.Ncurses Funktionstasten gibt nur escape zurück

Drücken von F1 gibt "c = 27" zurück. Ich benutze Putty und versuchte verschiedene Einstellungen mit TERM auf xterm eingestellt. Außerhalb von Flüchen gibt F1 \ EOP wie erwartet zurück, und ich verwende TERM = xterm, das scheinbar den Funktionsschlüssel in termcap definiert. Ich verstehe, dass die Routine keypad() die getch/wgetch-Routinen veranlassen soll, den numerischen Schlüssel äquivalent zu 265 KEY_F (1) zurückzugeben, aber ich kann nichts außer 27 mit verschiedenen Kombinationen von break, raw, notimeout usw. erhalten.

Antwort

1

Sowohl putty als auch xterm haben mehrere Optionen für ihre Funktionstasten. Die Standardkonfigurationen für jeden unterscheiden, die Sie

infocmp putty xterm 

mit sehen und es scheint, dass kf1 (F1) eine von vielen Unterschiede ist, zB (Kitt auf der linken Seite, xterm auf der rechten Seite):

kent: NULL, '\EOM'. 
    kf1: '\E[11~', '\EOP'. 
    kf13: '\E[25~', '\E[1;2P'. 
    kf14: '\E[26~', '\E[1;2Q'. 
    kf15: '\E[28~', '\E[1;2R'. 
    kf16: '\E[29~', '\E[1;2S'. 
    kf17: '\E[31~', '\E[15;2~'. 
    kf18: '\E[32~', '\E[17;2~'. 
    kf19: '\E[33~', '\E[18;2~'. 
    kf2: '\E[12~', '\EOQ'. 
    kf20: '\E[34~', '\E[19;2~'. 
    kf21: NULL, '\E[20;2~'. 
    kf22: NULL, '\E[21;2~'. 
    kf23: NULL, '\E[23;2~'. 
    kf24: NULL, '\E[24;2~'. 

(Einige Kopien von Ncurses Terminal-Datenbank sind minimal, aber es gibt eine vollständige Datenbank, die die putty Beschreibung enthält).

Wenn die Terminal-Datenbank den Schlüssel nicht wie konfiguriert anzeigt, erkennt Ncurses ihn nicht und Sie sehen das Escape-Zeichen.

+0

Ja, ich habe die Xterm-Einstellungen überprüft und überprüft, ob meine Funktionstasten die richtige Escape-Sequenz zurückgeben. Der TERM wird ebenfalls auf xterm gesetzt. Das Problem ist, dass ncurses immer noch nur das erste Zeichen (ESC) liest, obwohl ich die keypad() -Routine verwende, die wgetchar() anweisen soll, einen numerischen Wert von 265 anstelle der tatsächlichen Escape-Sequenz zurückzugeben, aber nicht . – AJJ

+0

Es ist wahrscheinlich kein Fehler in Ncurses, aber S/O ist nicht gut für den Dialog geeignet. Versuchen Sie [bug-ncurses] (https://invisible-island.net/ncurses/ncurses.faq.html#how_to_report). –

0

Doh! Ich fand schließlich einen alias "alias cmd = 'TERM = Linux cmd'" in einer alten .bashrc Datei, so dass mein TERM nur für die Dauer des Befehls auf Linux gesetzt wurde. Dummes einfaches Problem, das stundenlanges Debugging erforderte, um es herauszufinden. Lektion gelernt.

Verwandte Themen