필자가 제작한 무선키보드 드라이버들은 먼저 /etc 디렉토리 밑에서 설정파일을 찾습니다. 예를들어 pwkxwin 드라이버라면 /etc/pwkrc 를 찾습니다. 만일 설정파일을 찾지못한 경우에는 자체내장된 기본설정대로 동작합니다. 기본설정은 데비안 우디 리눅스를 기준하였습니다.
사용하는 Xwindow 시스템에 따라 각 키에 정의된 내용이 다를수 있습니다. 대부분의 시스템은 PC 101 키보드를 기준으로 키를 정의하기 때문에 알파벳이나 숫자키등은 항상 같은 값을 가지게 됩니다만 특수한 문자들이나 개별 키보드 특유의 키는 시스템마다 다른 값으로 설정될 수 있습니다. 아래에 설정파일을 이용해 키코드값을 정의하는 방법을 설명하니, 자신의 용도에 맞게 설정파일을 수정해서 사용하시기 바랍니다.
Xwindow 는 최대 255개의 키에 대해 고유의 값을 부여하고 있습니다. 그 내용은 Xwindow 의 터미널에서 xmodmap -pke 명령으로 확인할 수 있습니다. 다음은 필자의 데비안 시스템에서 실행한 예의 일부입니다.
... keycode 45 k K ... keycode 50 Shift_L ... keycode 98 Up ...
이 Xwindow 시스템은 자판의 k 키에 키코드 45 를 부여하고 있음을 알수 있습니다. 대문자 K 는 쉬프트키와 함께 자판의 k 키가 눌리면 대문자 K 가 출력됨을 나타냅니다. 위의 예를 보면 왼쪽 쉬프트키와 윗화살표(Up) 키에는 쉬프트된 상태에 대한 키할당이 없음을 알수 있습니다.
만일 자판의 k 키를 눌렀을 때 k 대신 x 가 찍히도록 xwindow 를 설정하고 싶다면 다음 방법으로 Xwindow 의 설정을 바꾸어줍니다(이상한 사람이군요. 여러분은 절대 따라하지 마세요).
xmodmap -e "keycode 45 = x K"
어떤 키(k)와 그 키의 쉬프트상태(K)의 위치적 관계는 거의 모든 키보드가 표준 pc101 키보드를 따르기 때문에 굳이 이런 식으로 변경해야 할 경우는 몹시 드뭅니다. 당연히 j 위에는 J 가 있고 세미콜론(;) 위에는 콜론(:)이 있는 것 아니겠어요? 자기 컴퓨터 키보드의 자판을 한번 보세요.
그런데, 희한하게도 팜 무선키보드에 바로 그런 예외가 있습니다. 보통의 자판에서 물음표(question) 은 슬래쉬(/) 키 위에 있습니다. 그런데 팜무선키보드의 자판상에는 물음표키가 윗화살표키(Up) 위에 떡하니 인쇄되어 있습니다. 그래서 우리는 팜무선키보드에서 물음표키를 입력하려면 팜무선의 자판에는 인쇄되어있지 않지만 xmodmap 의 정의에 따라 여전히 쉬프트 슬래쉬를 눌러야하는 겁니다. 그렇게 불편한 것은 싫다, 난 죽어도 팜 무선키보드 자판에 인쇄된대로 물음표키를 입력하겠다고 하신다면, 가령 데비안 우디의 Xwindow 시스템인 경우 키 할당을 다음과 같이 바꿔주어야 합니다. 98 이라는 값은 시스템의 xmodmap 에 따라 다를수 있습니다.
xmodmap -e "keycode 98 = Up question"
이제 설정파일의 내용에 대해 pwkrc 를 기준으로 설명합니다. pktrc 도 거의 비슷합니다.
"#" 기호는 주석을 의미합니다. 키를 정의한 숫자 테이블 아래로는 더이상 주석도 달지 말아주세요.
auto_off_time 에 정한 시간동안 입력이 없으면 드라이버를 자동 종료시킵니다. 0 으로 설정할 경우 auto off 기능은 동작하지 않습니다.
rate_of_typing_repetition 은 정확한 명칭이 typematic rate 라는 것으로서, 반복해서 찍히는 속도를 조절합니다. 팜무선키보드의 경우는 속도가 좀 느립니다.
delay_before_repetition 은 정확한 명칭이 typematic delay 라는 것으로서, 키를 눌렀을 때 반복을 시작하기까지의 시간간격입니다. 우리가 키보드에서 어떤 키를 눌렀을 때 누르자마자 바로 키가 연달아 반복되지는 않습니다. 누른 채로 잠시있어야 비로소 반복해서 찍히기 시작합니다. 이때의 잠시를 의미합니다.
위의 키보드 반복에 관한 두가지 값은 0 과 같은 너무 엉뚱한 값으로 설정하시면 오동작을 일으킬 수 있습니다. 개인적인 프로젝트인 관계로 사용자의 잘못된 설정에 대한 오류처리루틴이 약하기 때문에(제대로 하려면 너무 귀찮아서요) 그렇습니다.
포켓탑과 팜무선키보드는 따로 숫자키가 없습니다. 키보드 특유의 기능키와 일반 키를 함께 눌러 입력합니다. 예를 들어 1 을 입력하려면 팜무선키보드의 경우 왼쪽 Fn 키를 누른채 q 키를 눌러야 합니다. 포켓탑의 경우는 Num 키와 q 를 눌러야지요. 다음은 pwkrc 파일의 마지막 부분인 키정의 부분의 일부입니다.
... 0x09 24 10 50:10:0 # Q q:Q 1 exclam ...
첫열 0x09 는 팜 무선키보드에서 q 키가 눌렸을 때 적외선을 통해 전달되는 한바이트 값입니다.
두번째 열 24 는 필자의 프로그램이 0x09 를 받았을 때 Xwindow 측으로 보내는 키코드 값입니다. 필자의 Xwindow 시스템은 q 키에 대한 키코드 값으로 24 를 할당하고 있습니다. 이는 xmodmap 명령으로 확인할수 있습니다.
세번째 열은 10 입니다. 조금 설명해보지요. 팜무선키보드 자판상에서 1 은 q 키위에 하늘색으로 인쇄되어 있습니다. Xwindow 는 글쇠 "1" 에 키코드값 10 을 할당하고 있기 때문에 필자의 드라이버는 왼쪽 lfn 과의 조합을 감시하고 있다가 0x09 값이 들어오면, "아, 지금 lfn 이 눌려있는 상태인데 0x09 가 들어왔으니 주인님이 '1' 을 입력하시려는구나" 라고 판단하고는 Xwindow 측에 "1" 에 해당하는 키코드값인 10 을 보내주는 겁니다.
네번째 컬럼은 조금 특이하게 50:10:0 으로 되어있습니다. 팜무선키보드에서 느낌표(!, exclamation)는 녹색으로 q 키위에 인쇄되어 있습니다. 느낌표를 입력하려면 오른쪽 fn 키를 누른채 q 키를 누르라는 뜻이지요. 일반자판에서라면 느낌표는 바로 "1" 키위에 존재하니까 "Shift"-"1" 두 키를 함께 눌러 입력했을 것입니다. 그런데 팜무선키보드에는 따로 "1" 키가 없습니다. 이 경우, 필자의 드라이버는 rfn 키와의 조합을 감시하고 있다가 0x09 값이 들어오면, "아, 지금 rfn 이 눌려있는 상태인데 0x09 가 들어왔으니 주인님이 느낌표 '!' 를 입력하시려는구나" 라고 판단하고는 Xwindow 측에 순서대로 "Shift_L", "1" 의 키코드를 보내줍니다. 왜냐구요? 일반자판(정확히는 Xwindow 시스템의 xmodmap 에 정의된 내용)에서는 "1" 키 위에 "!" 키가 있기 때문입니다. 이러면 Xwindow 측에서는 "Shift" 키가 눌린 후 "1" 이 눌렸다고 받아들이게 되니까, "아, '1' 위에 '!' 가 있으니 내가 ! 을 출력해야겠구나" 판단하는 겁니다. 위의 50:10:0 에서 50 은 xmodmap 에 정의된 "Shift_L" 키의 키코드고 10 은 "1" 키의 키코드입니다. 마지막 0 은 필자의 프로그램 내부적으로 필요한 값으로 키코드열의 끝을 인식하기 위한 값입니다.
나머지 "#" 이하의 부분은 주석으로서, 앞의 항목 각각에 대한 명칭입니다. 첫번째는 하드웨어상의 키에 대한 명칭, 두번째는 Xmodmap 이 부여하는 명칭과 그 쉬프트상태에 대한 명칭, 세번째는 lfn 키와의 조합인 경우 Xwindow 측으로 보내야할 키의 명칭, 네번째는 rfn 키와의 조합시 보내야 할 키의 명칭입니다.