다음 이전 차례

2. 키보드 개요

사용자가 키보드를 누르면 키보드 콘트롤러는 커널 키보드 드라이버로 스캔코드를 보내게 된다. 코드값을 바꿀 수 있는 키보드도 있지만 보통은 각 키에 고정되어 할당된 스캔코드가 있다. X가 실행되어 있는 경우처럼 시스템이 스캔모드에 있을 때는 커널 키보드 드라이버가 하는 일이라곤 그냥 스캔코드를 전달받아 어플리케이션 프로그램에 전달해주는 것 뿐이다. 스캔모드가 아닌 경우에는 키가 눌리거나 풀리는 각각의 이벤트에 따라 스탠코드의 조합을 분석하여 키코드를 만든다. (하나의 키가 눌려도 최대 6개의 스캔코드가 발생할 수 있다.) 이렇게 만들어진 키코드가 (예를 들어 showkey와 같은 프로그램에서 사용되는) 키코드 모드에서는 어플리케이션 프로그램에 전달된다. 키코드 모드도 아닌 경우에는 이 키코드를 keymap에서 찾아보고, 여기서 발견된 문자나 문자열을 어플리케이션에 전달하거나 해당되는 동작을 수행한다. (예를 들어보자. a 키를 눌렀다 떼면 키보드는 스캔코드 0x1e와 0x9e를 발생시킨다. 이것은 키코드 30과 158로 변환되어 아스키 코드 즉, latin-1 코드 `a'에 해당하는 0141로 전달된다. Delete키의 경우에는 스캔코드 0xe0 0x53 0xe0 0xd3가 발생하고 이것은 키코드 111과 239로 변환되어 4-심볼 시퀀스인 ESC [ 3 ~로 전달된다. 물론 이것은 US 키보드에 디폴트 키맵의 경우에 해당되는 이야기다. 하나의 동작에 대응하는 키 조합의 예로는 Ctrl-Alt-Del이 있다.)

스캔코드와 키코드간의 변환은 setkeycodes 유틸리티를 사용하면 된다. 아마도 이 기능이 필요한 사람은 극히 드물 것이다. 키코드를 문자, 문자열, 동작 등 키맵으로 변환하는 것은 loadkeyssetmetamode 유틸리티를 사용하면 된다. 더 자세한 내용은 getkeycodes(8), setkeycodes(8), dumpkeys(1), loadkeys(1), setmetamode(1)를 참조할 것. dumpkeys의 화일 출력 형식과 loadkeys를 사용한 화일 읽기는 keytables(5)에 설명되어 있다.

위에서 `어플리케이션으로 보낸다'라고 말한 것의 정확한 의미는 터미널 드라이버로 보낸다는 뜻이다. 즉, 이 이후의 처리 과정은 시리얼 라인을 통해 오가는 텍스트와 똑같다. 이 처리 과정에 대한 세부 사항은 stty 프로그램으로 설정한다.


다음 이전 차례