[컴][리눅스] Ubuntu 에서 한/영 키 동작하게 만들기



Update

Ubuntu 14.04 에서는 단축키 설정이 더 간단해 졌다. 아래 글을 참고하자.




Ubuntu 에서 한/영 키 동작하게 만들기

settings >> language support
를 통해 "한국어" 를 설치하고 난 후에
keyboard input system 을 ibus >> log-out >> log-in >>  
ibus preference >> input method >> Korean 추가 >>
로 set 해주고 난 후 부터 한글을 사용할 수 있다.
그러나 한/영 키는 따로 mapping 이 필요하다.


일단 대체적으로 우리가 해야 할 일은 아래 두가지 이다.
  1. scancode 에 keycode 를 mapping
  2. 이 keycode 를 x-windows 에서 어떤 keycode 값을 갖는지 알아내고, 이 keycode 에 "한글 변화", "한자" 등의 기능을 mapping



먼저 우리가 입력하는 keyboard 의 key 가 어떻게 인식하는 지 살펴보자.

               kernel --------------------+      X window --------------+

input key ---> |   scan code --> key code |  --> | keycode --> function |

               +--------------------------+      +----------------------+

우리가 keyboard 를 누를 때 발생하는 event 는 scan code 가 되는데, 이 scan code 를 kernel 이 자신이 가지고 있는 key table 에서 찾아서 그에 해당하는 keycode 로 변환한다.

1-88(0x01-0x58) 범위의 keycode는 scancode와 같은 값을 갖도록 커널에 고정되어 있다.[ref. 1]
나머지 scancode(0x59-0x7f 와 0xe000 - 0xe07f)는 1-127 범위의 keycode 로 할당할 수 있다. [ref. 1]


 그런데 해당하는 key code 가 없으면, 에러를 발생시키는데, 이 에러를
/var/log/dmesg
또는
/var/log/messages
또는
/var/log/kern.log
에서 확인할 수 있다.
Jul 30 14:56:36 ubuntu kernel: [ 364.637846] atkbd serio0: Unknown key released (translated set 2, code 0x72 on isa0060/serio0).
Jul 30 14:56:36 ubuntu kernel: [ 364.637849] atkbd serio0: Use 'setkeycodes 72 ' to make it known.
Jul 30 14:56:36 ubuntu kernel: [ 364.945870] atkbd serio0: Unknown key pressed (translated set 2, code 0x71 on isa0060/serio0).
Jul 30 14:56:36 ubuntu kernel: [ 364.945876] atkbd serio0: Use 'setkeycodes 71 ' to make it known.

참고로, scancode 는 switchkey -s 라는 명령을 통해서 알아 볼 수 있다.

그리고 비어있는 key code 를 찾기 위해서는
xmodmap -pke | less
를 하면 된다.


setkeycodes

그래서 이제 scan code 와 keycode 를 연결 시켜주면 된다. 여기서 맞는 keycode 를 설정해 주면 좋다.
setkeycodes 72 122 # 한자키
setkeycodes 71 123 # 한영키
참고 : switchkey -s 로 얻은 "한자키", "한영키" 의 값은 0xf2, 0xf1 이 나온다. 하지만 위에서 72, 71 로 한 이유는 ref.1 에서 말하듯이 7bit 의 scancode 를 이용하기 때문에 결국 같은 결과가 나오는 듯 하다.

그러고 나서 x windows 에서 다시 key mapping 을 해줘야 한다.
xev 를 실행시키고, key 를 누르면 그에 해당하는 key 값이 나오는데, 그값이 x-windows 에서 keycode 이다. 이 keycode 는 setkeycodes 로 설정한 값과 다른 값이다. 그러므로 우리가 위에서 122 라고 설정했지만, xev 를 실행시켜서 나오는 x-windows 의 keycodes 는 122 가 아닌 다른 값이 나올 수 있다.

실제로 테스트 해보니, Ubuntu 의 Unity 에서는 130, 131 의 값이 나왔다. (이건 설치할 때 마다 다르다. 어쩔 때는 130 이 한글이고, 어떤 때는 131이 한글이다.)그런데 이 Ubuntu 에서 이미 130 에는 "Hangul_Hanja" 를 할당해 놓고, 131 에는 "Hangul"을 할당해 놓아서 아래의 추가적인 코드는 실행하지 않아도 한글이 제대로 동작했다.

xmodmap -e "keycode 130 = Hangul_Hanja"
xmodmap -e "keycode 131 = Hangul"

booting 시 동작

이제 그럼 booting 할 때 마다 우리는 setkeycodes 를 실행시켜 주면 된다. 이부분은 ref. 7 을 보면 된다. /etc/init.d/ 에 keyremap 이라는 새로운 파일을 하나 만들고,
sudo chmod +x /etc/init.d/keyremap
update-rc.d keyremap defaults
라는 명령으로 부팅시 마다 실행되게 설정해 주면 된다.


References

  1. Man Page/setkeycodes.8
  2. Exporting an X11 keymap to the linux kernel, Stackoverflow
  3. 리눅스 커널 2.6에서 한영키/한자키 등록하기
  4. Xorg.conf에서 한글키 설정
  5. Ubuntu 12.04 LTS Installation Guide (Part 1)
  6. 리눅스민트(우분투) 한영키 한자키 / 106 키보드 ALT키
  7. Configure unrecognized keys in Linux



댓글 1개:

  1. 와 정말 깔끔하게 정리해놓으셨네요!! 감사합니다!

    답글삭제