2017-01-25 1 views
-1

터미널 상호 작용을 허용해야하는 C 프로그램에서 작업하고 있습니다. 백 스페이스 키를 올바로 작동 시키려고 노력하는 데 며칠 동안 노력했습니다.VT100 이스케이프 코드 C에서 이상한 행동 커서 이동 프로그램

내 프로그램에서 터미널에서 입력을 폴링합니다. I 입력을 검출 할 때, I는 눌려진 키가 백 스페이스가 있었다면 확인 :

if((letter == 8 || letter == 127) && cursorPosition >= 1) 

cursorPosition 터미널의 커서의 현재 위치를 유지한다. 사용자가 내 프롬프트 (>)를 삭제할 수 없는지 확인하기 위해이 검사를 수행합니다. 이 코드는 내가 운영체제의 일부이기 때문에

serial_print("\033[1D"); 
serial_print("\033[K"); 

serial_print 날에 의해 정의 된 함수입니다 : 검사가 통과되면

다음, 나는 다시 커서를 이동하고 문자를 제거하려면 다음 코드를 사용 쓰기 및 실행 qemu. 나는 터미널에 입출력을 위해 시리얼 포트를 사용하기 때문에 c printf에 접근 할 수 없다. 이 함수는 이미 올바르게 작동하는 것으로 알려져 있습니다.

본질적으로 생각한 첫 번째 줄은 커서를 한 열 왼쪽으로 이동시키고 두 번째 줄은 커서 오른쪽으로 모든 내용을 지워야한다는 것입니다.

3 개 이상의 문자가 터미널의 행에 입력 될 때까지 제대로 작동합니다. 나는 하나 개의 문자가있는 경우

는 : 1 을 다음 백 스페이스를 누르면, 내가 얻을 : 두 개의 문자를 입력했을 때 나는 또한 제대로 작동

. 나는 세 문자가있는 경우 그러나 : 123456 백 스페이스 6 번을 누른 후 : 123456454

나는 6 개 문자가있는 경우 123

: 123 다음 백 스페이스를 세 번 눌러,이 같은 라인 모습입니다

터미널이 이스케이프 시퀀스를 해석하는 방식이 현재 줄에 몇 개의 문자가 있는지에 따라 달라지는 것 같아서 혼란 스럽습니다. 내 Mac에서 VirtualBox로 Ubuntu 16.04를 실행하고 qemu를 사용하여 우분투 터미널에 쓰고있는 OS를 실행합니다. 정보가 다를 경우.

아무도이 문제를 일으킬 수있는 아이디어가 있습니까? 더 자세한 정보가 필요하거나 잘못 입력 한 경우 알려 주시기 바랍니다.

+0

버퍼 저장/인쇄 코드 란 무엇입니까? 즉, 화면을 올바로 조작 할 수 있지만 저장 버퍼가 아닌 것은 가능합니까? – usr2564301

+1

문제를 시연하는 (짧은) 프로그램이 없다면 아무 것도 언급 할 사항이 없습니다. –

답변

0

'cursorPosition'에 문제가있을 수 있습니다. 이것을 시도하십시오 :

if (letter == 8 || letter == 127) { 
    if (cursorPosition >= 1) { 
     serial_print("\033[1D"); 
     serial_print("\033[K"); 
     --cursorPosition; 
    } 
} else if (letter >= 32 && letter <= 126) { 
    serial_print_char (letter); 
    ++cursorPosition; 
}