나는 Xubuntu를 사용하고 있습니다. 로그인하기 전에 키보드 레이아웃을 선택할 수 있습니다. xmodmap
일부 키를 다시 매핑하는 데 사용합니다 .
나는 두 가지에 관심이 있습니다:
- (a) 노트북을 열 때, (b) 시작하는 동안, (c) 시스템에 로그인할 때(이 세 단계) 및 시스템을 사용할 때(로그인) 키맵 상태가 어떻게 변경됩니까?
- 다양한 단계에서 화면에 어떤 기호가 표시되는지(및 어떤 제어 키가 전송되는지) 원인이 무엇입니까? 키를 누르면 키보드 드라이버에 신호(?)가 전송되고 어떤 기호가 표시될지 결정하는 의사 결정 프로세스(응용 프로그램 및 구성 파일)가 있어야 합니다. 이 질문에 대한 대답은 응용 프로그램 목록과 이러한 구성 파일의 경로입니다(저는 특히 Ubuntu(Debian 기반 시스템)에 관심이 있지만 다른 시스템에 대해 설명할 수 있지만 Ubuntu가 선호됩니다).
답변1
여기에는 KEYCODE를 KEYSYM으로 매핑하고 KEYSYM을 텍스트로 매핑하는 두 가지 레이어가 있습니다. AT 키보드 스캔 코드를 XT 스타일 KEYCODE로 매핑하거나 USB 키보드 HID 코드를 KEYCODE로 매핑해야 하는 커널을 세면 더 많은 레이어가 있습니다. KEYCODE는 운영 체제 커널이 X11 서버에 전달하는 8비트 부호 없는 정수입니다. Linux 및 Solaris와 같은 운영 체제에 따라 다를 수 있습니다. Linux에서 이러한 KEYCODE는 일반적으로 이전 XT PC 키보드에 사용된 것과 동일한 숫자입니다. AT, PS/2 또는 USB 키보드가 있는 최신 컴퓨터에서는 작업을 단순하게 유지하기 위해 해당 키보드를 이전 XT 코드에 키로 매핑하는 경우가 많습니다.
XT, AT, PS/2 또는 USB 등 원래 키보드 코드는 키보드의 물리적 위치를 나타냅니다. XT 키보드는 키를 누르거나 놓을 때 단일 8자리 숫자만 보냅니다. US/UK XT 키보드의 q 키는 숫자 16을 전송합니다. 프랑스어 키보드에서는 동일한 물리적 키에 a라는 레이블이 지정되어 있지만 여전히 16을 보냅니다. 운영 체제의 상위 계층은 이를 실제 의미로 지정합니다. XT 키보드에서 키를 놓으면 동일한 키코드에 128을 더한 값이 전송됩니다. 이 예에서는 q를 누르면 16이 전송되고, 떼면 숫자 142(16+128)가 전송됩니다. AT 키보드는 매우 긴 일련의 숫자인 스캔 코드를 사용합니다. 중요 릴리스에는 추가 코드가 추가됩니다. 예를 들어 일시 정지에 대한 스캔 코드는 E1, 1D, 45, E1, 9D, C5입니다. 대부분의 운영 체제(DOS, Windows, Linux, FreeBSD 및 BIOS 포함)는 스캔 코드를 더 간단한 XT 스타일 스캔 코드에 매핑합니다. 또한 HID 코드를 전송하는 USB 키보드와 같이 다른 코드를 사용하는 새로운 키보드를 더 쉽게 지원할 수 있습니다. 모든 코드는 X11 또는 애플리케이션이 이를 보기 전에 운영 체제에 의해 동일한 일관된 코드 세트로 매핑됩니다.
X11은 프로세스의 이 부분에 대해 알지 못하며 커널에서 KEYCODE를 가져오고 자체 매핑을 적용하여 해당 KEYCODE를 KEYSYM으로 변환합니다. Xmodmap이 매핑을 제어하기 위한 표준 도구입니다. 키맵의 동작 대부분은 구성 가능하지만 Num Lock, 모드 스위치, Caps Lock/Shift Lock과 같은 몇 가지 특수한 경우는 X11에 하드코딩되어 있습니다. Shift와 같은 다른 측면은 실제로 구성 가능합니다. 모드 스위치나 Num Lock 키와 달리 어떤 키든 Shift 키 역할을 하도록 매핑할 수 있습니다.
KEYCODE는 운영 체제 커널에서 보낸 물리적 키를 나타냅니다. 각 KEYCODE는 8개의 가능한 KEYSYM에 매핑될 수 있습니다. 레벨 1~4라고도 하는 4개의 레벨만 사용됩니다. 레벨 1은 활성화된 수정자가 없을 때 인쇄되는 KEYSYM을 지정합니다. 일반적으로 소문자와 숫자입니다. 수정자는 수정자가 활성화되어 있을 때(누르거나 켜짐) 다른 KEYCODE에 의해 생성된 KEYSYM을 수정하는 KEYCODE입니다. 수정자 키 코드도 Xmodmap을 통해 제어됩니다. 레벨 2는 Shift 수정자 키를 누를 때 전송될 KEYSYM을 지정합니다. 레벨 3은 모드 스위치 KEYSYM을 누르자마자 활성화됩니다. 레벨 4는 Shift 키와 모드 스위치가 모두 활성화되면 활성화됩니다.
KEYSYM이 생성되면 직접 해석이 가능하지만 대부분의 경우 텍스트로 변환됩니다. 모든 KEYSYM이 텍스트가 되는 것은 아니며 향후 KEYSYM에만 영향을 미칠 수 있습니다. 물론 텍스트 표현이 없지만 다른 문자를 구성하는 데 사용되는 많은 KEYSYM이 있는 Shift_L을 예로 들 수 있습니다. 내 시스템에 있는 목록은 다음과 같습니다 /usr/share/X11/locale/en_US.UTF-8/Compose
. 그러한 예 중 하나가 dead_acute KEYSYM입니다. 이 키를 누르면 다음 KEYSYM을 급격하게 강조된 문자로 변환하려고 시도합니다. 하나 있다표준 매핑KEYSYM을 유니코드로 변환하는 데 사용됩니다.
이제 이 모든 내용이 설명되었으므로 Xmodmap은 더 이상 사용되지 않으며 보다 정교한 XKB로 대체되었습니다. 이는 KEYCODE가 KEYSYM에 매핑되는 방식에 영향을 주지만 커널이 KEYCODE를 생성하는 방식에는 영향을 미치지 않으며 KEYSYM이 텍스트 또는 조합으로 변환되는 방식에도 영향을 미치지 않지만 여전히 동일합니다. Xmodmap 동작을 복원하기 위해 XKB를 비활성화할 수 있습니다. Xmodmap을 지원하기 위한 호환성 레이어도 있지만 완벽하게 호환되지 않아 문제가 발생할 수 있습니다. XKB 규칙은 /usr/share/X11/xkb/
더 복잡합니다. KEYCODE를 KEYSYM에 매핑하기 위해 키보드 레이아웃을 생성하는 방법에 대한 좋은 문서가 다른 곳에 있습니다.
Linux 콘솔의 경우에는 /usr/share/keymaps
명령에 저장되고 로드되는 자체 키보드 레이아웃이 있습니다 loadkeys
. BIOS 및 초기 부트로더 단계(GRUB2 포함)에서 키맵은 BIOS가 키를 매핑하기로 결정한 번호입니다.