필자가 제작한 무선키보드 드라이버들은 먼저 /etc 디렉토리 밑에서 설정파일을 찾습니다. 예를들어 pwkxwin 드라이버라면 /etc/pwkrc 를 찾습니다. 만일 설정파일을 찾지못한 경우에는 자체내장된 기본설정대로 동작합니다. 기본설정은 데비안 우디 리눅스를 기준하였습니다.
사용하는 Xwindow 시스템에 따라 각 키에 정의된 내용이 다를수 있습니다. 대부분의 시스템은 PC 101 키보드를 기준으로 키를 정의하기 때문에 알파벳이나 숫자키등은 항상 같은 값을 가지게 됩니다만 특수한 문자들이나 개별 키보드 특유의 키는 시스템마다 다른 값으로 설정될 수 있습니다. 드라이버는 시작시에 자동으로 무선키보드상의 표준적인 키들에 대한 Xwindow 시스템의 키정의를 읽어들입니다.
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 와 uwkrc 도 거의 비슷합니다.
"#" 기호는 주석을 의미합니다.
auto_off_time 에 정한 시간동안 입력이 없으면 드라이버를 자동 종료시킵니다. 0 으로 설정할 경우 auto off 기능은 동작하지 않습니다.
rate_of_typing_repetition 은 정확한 명칭이 typematic rate 라는 것으로서, 반복해서 찍히는 속도를 조절합니다. 팜무선키보드의 경우는 속도가 좀 느립니다.
delay_before_repetition 은 정확한 명칭이 typematic delay 라는 것으로서, 키를 눌렀을 때 반복을 시작하기까지의 시간간격입니다. 우리가 키보드에서 어떤 키를 눌렀을 때 누르자마자 바로 키가 연달아 반복되지는 않습니다. 누른 채로 잠시있어야 비로소 반복해서 찍히기 시작합니다. 이때의 잠시를 의미합니다.
위의 키보드 반복에 관한 두가지 값은 0 과 같은 너무 엉뚱한 값으로 설정하시면 오동작을 일으킬 수 있습니다. 개인적인 프로젝트인 관계로 사용자의 잘못된 설정에 대한 오류처리루틴이 약하기 때문에(제대로 하려면 너무 귀찮아서요) 그렇습니다.
이제부터의 설명은 버전 0.4 이하의 드라이버에서 사용하던 설정파일에 대한 설명입니다. v1.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 키와의 조합시 보내야 할 키의 명칭입니다.