한글 106 키 키보드 / 대한민국 키배열의 xmodmap?

우분투의 한영, 한자 키 의 키코드가 어떻게 됩니까? xmodmap 에서 정해주는 걸로 아는 데 이게 두가지 버전이 있는 거 같습니다. 자세히 말해 121 = Hangul_Hanja 인지 123 = Hangul_Hanja 인지가 궁금합니다.

현재 제 환경은 윈도우 Vista x32 Home edition + VMWare 6.5 위에 Ubuntu 8.10을 깐 상태입니다. 키보드는 윈도우키, 메뉴키, 한글 한자 키 등이 다 달린 한글 106키, PS/2 방식의 키보드 입니다. 모델은 i-rocks KR-6220. 저가 제품 중 가장 널리 쓰이는 평범하고 보편적인 제품이죠.

처음 우분투 8.10을 설치하고 나서는 키보드 설정을 "Generic/일반 105키 (국제 버전) PC"로 하고 키배치를 "대한민국 101/104 키 호환"으로 하니까 한글 입력은 되는데 문제는 일반 한/영키나 한자 키는 전혀 안먹히고 그옆에 있는 오른쪽 ALT키가 한영키로, 오른쪽 Control키가 한자 키로 먹히는 겁니다.
그래서 xev 로 keycode 를 알아내려고 하니 한영키/한자키 모드 아무런 반응이 없더군요. 그 키를 눌러도 xev에 아무 반응이 없는 겁니다. 그래서 윈도우에서 다른 프로그램으로 스캔코드를 체크해보니 한영키는 0xf2, 한자키는 0xf1 이 나오더군요. 일반적인 한글 PS/2 키보드의 스캔코드이죠.

/usr/share/xmodmap/xmodmap.kr 을 보니

! KS 103(106) Keyboard on South Korea have two toggle keys
! in addition to us-101(us-104) keys.
! Hangul_Hanja : toggle between Korean alphabet and Chinease alphabet
! Hangul : toggle between Korean alphabet and English alphabet
keycode 121 = Hangul_Hanja
keycode 122 = Hangul

이라고 되어 있어서 다음 라인을 /etc/rc.local에 추가 하고 리붓 했습니다.

setkeycodes f2 122 # 한영키
setkeycodes f1 121 # 한자키

이렇게 하니 이제 한영/한자 키 자는 인식하는데 여전히 오른쪽 ALT도 한영키로 동작하더군요. 즉 한영키, 한자키가 각각 2개씩으로 늘어난 셈이죠.

그래서 키보드 설정을 "Generic/한글 106키"로 하고 키배치를 "대한민국"으로 바꾸니 이젠 오른쪽 ALT키, 오른쪽 Control 키는 원래 대로 각각 ALT키, 컨트롤 키로 먹히는 군요. 한영키도 제대로 되고… SCIM 도 정상으로 동작하고…

그런데 문제는 이렇게 하니 한자 키가 먹지를 않습니다. 한자키를 치면 ‘,’ 글자가 입력됩니다. 그래서 xev를 뛰우고 한자키를 쳐보니 KP_Separator 어쩌구 하며 전혀 엉뚱한 키 이름이 나오는 겁니다.

그래서 고민을 하고 웹을 뒤지다가

setkeycodes f2 122 # 한영키
setkeycodes f1 123 # 한자키 <— 121 이 123 으로 바뀌었음.

으로 해야한다는 글을 보았습니다. 그래서 그렇게 해보니 한자키가 제대로 먹히는 군요. 문제가 해결된 거죠.

그런데 제가 궁금한건 이 setkeycodes f1 123 의 123이 어디서 나온거냐는 거죠. 분명히 /usr/share/xmodmap/xmodmap.kr 에는 " keycode 121 = Hangul_Hanja "라고 되어 있는데 어째서 123 이 Hangul_Hanja로 매핑되냐는 겁니다.
제 Home directory를 뒤져봐도 .Xmodmaprc 등의 xmodmap 사용자 설정 파일 따위는 없는데 말이지요. 그러면 Xmodmap이 /usr/share/xmodmap/xmodmap.kr을 config 파일로 사용하고 있지 않다는 말인데 그럼 어느 파일을 현재의 system wide xmapmap 파일로 사용하는지 어디서 keycode 123 = Hangul_Hanja 로 되어 있는지 궁금합니다.

grep Hanja /usr/share/xmodmap/* 를 해봐도 xmodmap.kr: keycode 121 = Hangul_Hanja 밖에 나오지 않습니다. 도대체 123 은 어디서 나온겁니까?

윈도에서 키보드 키맵 코드는 xev 명령어로 확인할 수 있습니다.
이는 키보드 종류에 따라 다르므로, 직접 확인해보시는 것이 가장 좋습니다.

델 미니에 우분을 깔면서 어떤 키보드를 선택했는지 기억하지 않고 키맵 코드만 적어놓고 나중에 쓰려고 하니 안되더라구요. ㅎ
xev 사용법은 그냥 터미널에서 xev 라고 입력하시고, 키 코드값을 알려는 키를 누르면 터미널에 표시가 됩니다.

제 상황에서 xev의 결과입니다.

한영 키를 눌렀을 때 :

KeyPress event, serial 33, synthetic NO, window 0x3800001,
root 0x5d, subw 0x0, time 4289657, (180,406), root:(185,455),
state 0x100, keycode 130 (keysym 0xff31, Hangul), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

한자 키를 눌렀을 때:

KeyPress event, serial 33, synthetic NO, window 0x3800001,
root 0x5d, subw 0x0, time 4381096, (75,147), root:(80,196),
state 0x0, keycode 131 (keysym 0xff34, Hangul_Hanja), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

현재로는 한영키나 한자키나 모두 잘먹고 SCIM도 잘 동작 하고 있습니다만 위의 keycode 130 (한영키) keycode 131 (한자키) 를 어디에 어떻게 반영해야 하는지 모르겠습니다.
이 130, 131 이라는 숫자는 제가 setkeycodes 에서 사용한 121,122, 123 과도 관련이 없는 숫자 인거 같은데요? 물론 /usr/share/xmodmap/xmodmap.kr 에도 그런 숫자는 없구요. 저 130, 131 이라는 숫자가 어디서 나온 숫자입니까? 도대체 어느 파일에 그 숫자를 입력하는 겁니까?
현재 제 키보드는 Generic/"한글 106키보드" 키배열은 "대한민국" 입니다.

그리고 파이어폭스에서 한글을 쓰다보니 한영키를 눌러 한글-> 영어로 전환하는 순간 SCIM 에서 한/A로 표시되는 현재 모드 가 아주 빠르게 토글을 반복하는 현상이 있고 가끔 한영 전환이 잘안되는데 이것도 키보드 관련 문제일까요?

아래 내용 대로 해보십시요

gedit ~/.Xmodmap
안에 내용
keycode 131 = Hangul_Hanja
keycode 130 = Hangul
넣고 저장 후

엑스윈도 재 시작 하시면 Xmodmap 값을 불러오려는 메세지 창이 뜹니다. 선택하여 넘기고 예 하십시요

제가 질문 하고 있는건 어떻게 한글 키를 먹도록 해야 하느냐가 아닙니다. 이미 제 환경에선 한영키나 한자키는 제대로잘 동작하고 있습니다. 그러나 제가 궁금한건 각 파라미터 들의 관계나 그 파라미터가 어디서 결정 되는 가 하는 겁니다.

이문제를 토론한 KLDP의 글타래 http://kldp.org/node/52228 이 있는데 여기도 결정적으로 그 121,122, 123 니 130 이니 하는 keycode 파리미터가 어디서 나온 값인지, 어디서 바꿔 주는지 하는 그런 이야기는 없습니다.
0xf1, 0xf2 나 71, 72 라는 키보드 scancode 야 당연히 키보드의 하드웨어 타입/모델 에 따라 달라질수 있다는 건 이해가 가는데 나머지 122나 130 등의 keycode 값은 어디에선가 configuration 값으로 있거나 (예를 들어 키보드 모델/키배치 관련 configure file) 그게 아니라면 드라이버나 커널에 아예 박혀있는 값일 거라는 거죠.
그리고 제가 분명히 setkeycodes f2 122 라고 주었는데도 (한영키) xev를 해보면 keycode 값이 130 이라고 나옵니다. 이러니 이 122 라는 keycode 값이 어떻게 130 이라는 keycode 로 변환되었는지 하는 게 궁금하다는 거죠. 이건 위에서 말씀하신 ~/.Xmodmap 을 사용하지 않아도 키배치를 (한글 106키 키보드 /대한민국)으로 하면 자동으로 이렇게 나오는 거니 사용자가 지정해준 값은 아니지요.

제가 시험삼아 setkeycode f2 130 으로 해봤는데 이경우는 xev 에선 또다른 keycode 값이 나옵니다 (138 이 나옵니다) 그러니 이런 122-> 130, 130->138 로 매핑되는 룰이 어디에 정해져 있는 거냐가 궁금한겁니다. 그리고 제가 ~/.Xmodmap 을 사용 하지 않아도 keycode 130 = Hangul, keycode 131 = Hangul_Hanja로 이미 기본으로 세팅되어져 나오는 데 이게 어디서 세팅된 값인지 그게 궁금합니다. /usr/share/xmodmap/xmodmap.kr 은 아닌게 분명하고 (여기엔 keycode =121 이 Hangul_Hanja 로 되어 있습니다. 그런데 실제 현재 동작은 그렇게 하고 있지 않죠.) 어딘가 그와 유사한 파일이 있어서 keycode 122/123 또는 keycode 130/131 을 Hangul /Hangul_Hanja XKeySymbol로 매핑해주고 있을텐데 그게 어디서 정해지는 건지 알수가 없다는 거죠.

이 문제는 여러가지 문서로보아 배포본마다 또 심지어는 커널 버전마다 한글 키보드를 다루는 방법이 조금씩 다른 듯이 보이는 데 우분투 8.10의 경우는 어떻게 되는지 정확히 그 관계와 위치를 알고 싶은 겁니다.

요즘 키보드 레이아웃외에추가 정의한 키값은
hotkey-setup 데몬이 관장 하는 거로 아는데
/etc/init.d 에 hotkey-setup 데몬 스크립 살펴 보시기 바랍니다.