2017-11-27 39 views
0

ncurses5에서 실행 중이지만 최근에 새로운 환경 (putty/xterm/virtualbox)에서 curses6으로 컴파일 된 ncurses 프로그램을 테스트 중이며 모든 기능 키를 인식 할 수 없습니다. 화살표 키는 제대로 작동하지만 이스케이프 시퀀스를 사용하는 키만 실패하는 것처럼 보입니다.ncurses 기능 키만 이스케이프를 반환합니다.

chtype c; 
initscr(); 
start_color(); 
noecho(); 
cbreak(); 
intrflush(stdscr, TRUE); 
keypad(stdscr, TRUE); 
c=getch(); 
printf("c=%d\n", (int)c); 

F1을 누르면 "c = 27"이 반환됩니다. 나는 퍼티를 사용 중이며 TERM이 xterm으로 설정된 다양한 설정을 시도했다. 저주 외부에서 F1은 예상대로 \ EOP를 반환하고 termcap에 함수 키를 적절하게 정의하는 것으로 보이는 TERM = xterm을 사용하고 있습니다. Keypad() 루틴은 getch/wgetch 루틴이 265 KEY_F (1)에 해당하는 숫자 키를 리턴한다고 가정하지만 break, raw, notimeout 등의 다양한 조합으로 27 개를 얻을 수는 없다는 것을 이해합니다.

답변

1

putty와 xterm은 둘 다 기능 키를위한 몇 가지 옵션을 가지고 있습니다. 각각의 기본 구성은

infocmp putty xterm 

를 사용하여 볼 수있는, 다른과는 kf1 (F1)은, 예를 들어, (퍼티 왼쪽, 오른쪽 xterm 등) 많은 차이점 중 하나 인 것 같다 :

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~'. 

(일부 ncurses의 터미널 데이터베이스 복사본은 이 최소이지만 putty 설명이 포함 된 전체 데이터베이스가 있습니다.)

구성한대로 터미널 데이터베이스에 키가 표시되지 않으면 ncurses가 키를 인식하지 못해 이스케이프 문자가 표시됩니다.

+0

예, xterm 설정을 확인하고 기능 키가 올바른 이스케이프 시퀀스를 반환하는지 확인했습니다. TERM은 퍼티에서도 xterm으로 설정됩니다. 문제는 wgetchar()에 실제 escape 시퀀스 대신 265의 숫자 값을 반환한다고 알려주는 keypad() 루틴을 사용하더라도 ncurses가 첫 번째 char (ESC) 만 읽는 것입니다. . – AJJ

+0

아마도 ncurses의 버그는 아니지만 S/O는 대화 상자에 적합하지 않습니다. [bug-ncurses] (https://invisible-island.net/ncurses/ncurses.faq.html#how_to_report)를 시도하십시오. –

0

Doh! 마침내 별칭 "alias cmd = 'TERM = Linux cmd'가 이전 .bashrc 파일에 있음을 알았 기 때문에 명령이 실행되는 동안 내 TERM이 Linux로 설정되었습니다. 알아 내야 할 디버깅을 몇 시간 동안 수행해야하는 어리석은 간단한 문제. 수업은 배웠다.