X의 "하위 레이어"에서 키보드 재매핑

X의 "하위 레이어"에서 키보드 재매핑

키맵은 OSI 모델과 유사한 흐름을 갖고 있지만 잘 정의되어 있지는 않습니다. 나는 현재 내가 원하는 것보다 더 높은 수준에서 다시 매핑하고 있습니다. 분명히 레이어 1은 물리적 키보드에 해당하고 레이어 7은 애플리케이션에 해당하지만 다른 레이어가 몇 개나 있는지, 어디에 해당하는지 잘 모르겠습니다.

프로그래밍 가능한 전용 물리적 키보드가 있는 데스크탑이었다면 설정이 되었을 것입니다. 하지만 아쉽게도 노트북이므로 내장 키보드를 사용하는 동안 리매핑을 유지해야 합니다.

FWIW, [Tilde/Esc], [Caps/LCtrl], [Back{space,slash}] 키 쌍을 교체하고 있습니다. 저는 Dvorak도 사용하지만 OS에서는 표준 방식으로 구성되어 있습니다.

현재 X에서 변경 사항을 적용하기 위해 /usr/share/X11/xkb/keycodes/evdev를 수정하고 있습니다(그리고 콘솔용 사용자 정의 레이아웃 파일을 생성하지만 여기서는 관련이 없습니다). 이것이 "레이어 스택"의 어디에 속하는지 잘 모르겠습니다.

문제:내 키맵이 웹 VNC 클라이언트를 사용하는 Proxmox 콘솔 세션으로 변환되지 않습니다. (레이아웃도 적용되지 않지만 예상되는 것입니다.) 문제는 분명히 VNC 클라이언트가 evdev remap이 아직 적용되지 않은 하위 레이어에서 키보드를 연결하고 있다는 것입니다.

Windows에서는 KeyTweak이라는 유틸리티를 사용하여 기본적으로 "Layer 3"인 것처럼 보이는 레지스트리에 대한 스캔 코드 맵을 생성합니다. 나는 분명히 "레이어 2"에 키보드를 연결하는 게임을 해본 적이 있지만 대부분의 게임에서 타이핑이 거의 없기 때문에 그것은 거의 문제가 되지 않습니다.

결론적으로, 가상의 OSI 키보드 모델에서 evdev가 어디에 속하는지 잘 모르겠지만 하위 레이어에서 어떻게 다시 매핑할 수 있습니까? 어떤 이유로든 리맵을 교체할 필요가 없으므로 이 변경 사항은 기본적으로 영구적일 수 있습니다. BIOS에서 할 수 있다면 그렇게 할 것입니다.

답변1

대답은 udev로 밝혀졌습니다. 기본적으로 따라했어요이 게시물, 그러나 요점은 다음과 같습니다.

  • 설치하다evtest
  • 실행 evtest하고 다시 매핑하려는 키를 눌러 확인하세요.둘 다스캔코드와 키코드.
  • 아래 내용과 /etc/udev/hwdb.d/같은 이름 으로 새 파일을 만듭니다.70-keyremap.hwdb
    • 번호가 파일의 순서라고 가정하지만 기반으로 삼을 기존 파일이 없었기 때문에 그보다 더 높은 번호가 필요할 수 있다는 전제 조건이 무엇인지 잘 모르겠습니다. 사실 hwdb.dTumbleweed에는 해당 디렉토리가 존재하지 않아서 만들어야 했지만 여전히 작동했습니다.
  • 달리다 systemd-hwdb update.
  • 재부팅

_

# This is from the brokkr.net post I linked above
# Format can be found on [https://wiki.archlinux.org/title/Map_scancodes_to_keycodes].

$ cat 70-keymap.hwdb
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_01=41     # Remap Tilde to Esc
 KEYBOARD_KEY_29=01     # Remap Esc to Tilde (evtest showed "1" but when I put that without the leading zero, it was interpreted as the literal [1] key.)
 KEYBOARD_KEY_3A=29     # Remap Caps to LCtrl
 KEYBOARD_KEY_1D=58     # Remap LCtrl to Caps
 KEYBOARD_KEY_0E=43     # Remap Backspace to Backslash
 KEYBOARD_KEY_2B=14     # Remap Backslash to Backspace

업데이트: 위의 방법은 내 노트북에서는 훌륭하게 작동했지만, 도킹했을 때 외부 키보드는 여전히 기본 키맵을 사용하고 있었습니다. 이는 내부 키보드가 여전히 AT 스캔 코드( atkbd장치 문자열에서)를 사용하는 PS/2를 사용하여 통신하기 때문이지만 USB는 완전히 다릅니다. 결국 USB 보드에서 스캔 코드를 가져와 다른 지도를 작성하기 위해 evtest를 다시 실행해야 했습니다. 결과 파일은 다음과 같습니다.

evdev:atkbd:dmi:*
 KEYBOARD_KEY_01=41
 KEYBOARD_KEY_29=01
 KEYBOARD_KEY_3A=29
 KEYBOARD_KEY_1D=58
 KEYBOARD_KEY_0E=43
 KEYBOARD_KEY_2B=14

evdev:input:b0003v*
 KEYBOARD_KEY_70029=41
 KEYBOARD_KEY_70035=01
 KEYBOARD_KEY_70039=29
 KEYBOARD_KEY_700e0=58
 KEYBOARD_KEY_7002a=43
 KEYBOARD_KEY_70031=14

관련 정보