키보드 키를 강제로 다시 매핑하는 방법을 찾으려고합니다.
xmodmap과 setxkbmap을 사용해 보았지만 특정 응용 프로그램에서는 작동하지 않습니다. 이러한 명령은 Xtho의 다른 일반 창 / 응용 프로그램에서 작동합니다.
응용 프로그램이 키보드 원시 데이터를 읽고 X 입력을 무시하고 있다고 생각합니까?
그렇다면 xmodmap과 setxkbmap을 사용하지 않고 키를 다시 매핑하는 방법은 무엇입니까? 일부 소프트웨어를 사용하여 수행 할 수있는 경우
또한 xkeycaps, xkbcomp를 시도했지만 X에서 실행되므로로드 키를 시도하지 않았습니다.
내가 발견 여기에 내가 시도 할 수 있다는 것을 setkeycodes
, “커널 키 코드를 할당 한 후 버튼으로 Xorg에서 작업을해야하기 때문에” 그러나 나는 또한 발견 “당신은 USB 키보드에서 ‘setkeycodes’를 사용할 수 없습니다” 내 경우 (나는 경우에 관심이 있다고, 누군가 내가 어댑터를 사용할 수 있다고 생각하기 때문에 ps2에서 작동하게합니다.)
이것은 유망한 “스캔 코드를 키 코드로 매핑”하는 것처럼 보이지만 몇 가지 테스트 후에도 아무런 변화가 없었습니다.
vt1에서 키 코드 “36”( “j”키)를 showkey
발견 했으며 스캔 코드 “7e”(키패드 “.”) vt1showkey --scancodes
$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..
Obs. : 다음과 함께 작동하지 않았습니다. KEYBOARD_KEY_7e=j
키를 찾는 다른 방법 (@ vinc17) :
evtest /dev/input/by-id/...
또는
input-kbd 3
( ls -l /dev/input/by-id/*
ex. event3에서 찾은 id 색인을 넣음)
추신 : * 당신이 직접 테스트에 관심이 있다면, 응용 프로그램의 관련 스레드는 다음과 같습니다 : http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ 내가 문제 동일 함 : 일부 키 (KP_Decimal, DownArrow, UpArrow, RightArrow)는 무시되고 “0x00″에 동일한 값을 갖는 것으로 간주됩니다.
답변
먼저 evtest
유틸리티를 사용하여 다시 매핑해야하는 키의 스캔 코드를 찾으십시오 . 다음과 같은 줄 MSC_SCAN
이 출력되어야합니다.
Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068
현재 키 코드를 제공하는 두 번째 코드가 이어집니다. MSC_SCAN
라인이 출력 되지 않으면 커널 드라이버 버그로 인한 것이지만 스캔 코드는 여전히 input-kbd
유틸리티 에서 찾을 수 있습니다 . 출력 evtest
에서 해당 라인을 쉽게 찾을 수 있도록 키 코드를 제공해야합니다 input-kbd
(예 :을 사용하여 grep
).
리 맵핑 할 키의 스캔 코드가 결정되면 /etc/udev/hwdb.d/98-custom-keyboard.hwdb
리매핑 을 포함 하는 파일을 작성하십시오 . 파일의 시작 부분에 /lib/udev/hwdb.d/60-keyboard.hwdb
정보가 있습니다. 내 경우 (작동)에는 다음이 있습니다.
evdev:input:b0003v05ACp0221*
KEYBOARD_KEY_70035=102nd # Left to z: backslash bar
KEYBOARD_KEY_70064=grave # Left to 1: grave notsign
KEYBOARD_KEY_70068=insert # F13: Insert
(udev 220 이전 keyboard:usb:v05ACp0221*
에는 첫 줄 을 사용해야 했습니다.)
evdev:
캐릭터 라인의 시작 부분에 있어야합니다. 공급 업체 및 제품 ID의 문자는 대문자 여야합니다. 각 KEYBOARD_KEY_
설정은 전에 정확히 하나의 공백을 가져야합니다 (참고 : 공백이없는 행은 오류 메시지를 표시하고 두 공백이있는 행 은 이전 udev 버전에서 자동으로 무시됩니다). KEYBOARD_KEY_
16 진수 (어떤 모두 같은 스캔 코드 뒤에 evtest
와 input-kbd
주고). 유효한 값은 evtest
출력 또는 출력 또는 파일 input-kbd
에서 얻을 수 있습니다 /usr/include/linux/input.h
. 예를 들어, 위에서 사용한 (제거 하고 소문자로 변환하여) KEY_102ND
줄 수 있습니다.102nd
KEY_
파일이 저장되면 다음을 입력하십시오.
udevadm hwdb --update
데이터베이스를 (다시) 빌드하려면 /etc/udev/hwdb.bin
(타임 스탬프를 확인할 수 있음). 그때,
udevadm trigger --sysname-match="event*"
새로운 설정을 고려합니다. 로 확인할 수 있습니다 evtest
.
2014 년에 릴리스 된 udev는에 불완전한 / 버기 정보가 /lib/udev/hwdb.d/60-keyboard.hwdb
있지만 최신 개발 버전 파일 및 / 또는 버그 보고서 및 설명서 및 간격 문제에 대한 토론을 볼 수 있습니다.
이것이 작동하지 않으면 udevd
with 의 로그 수준을 일시적으로 증가시킨 후 문제가 발견 될 수 있습니다 udevadm control
(자세한 내용은 udevadm (8) 매뉴얼 페이지 참조).
udev
204와 같은 이전 버전의 경우이 방법 이 여전히 작동합니다.