키보드 하드 재매핑 키?

키보드 하드 재매핑 키?

키보드 키를 강제로 다시 매핑하는 방법을 찾으려고 합니다.
xmodmap과 setxkbmap을 사용해 보았지만 특정 응용 프로그램에서는 작동하지 않습니다. 이러한 명령은 X의 다른 일반 창/응용 프로그램에서 작동합니다.

응용 프로그램이 키보드 원시 데이터를 읽고 X 입력을 무시할 수 있다고 생각합니까?

그렇다면 xmodmap 및 setxkbmap을 사용하지 않고 어떻게 키를 다시 매핑합니까? 일부 소프트웨어를 사용하여 수행할 수 있는 경우.

xkeycaps, xkbcomp도 시도했지만 X에서 실행되기 때문에 loadkeys는 시도하지 않았습니다.

내가 찾은여기내가 시도 할 수 있습니다 setkeycodes,"커널 키코드를 할당한 후 xorg에서 버튼이 작동해야 하기 때문입니다.", 하지만 나도 찾았어"USB 키보드에서는 'setkeycodes'를 사용할 수 없습니다.", 그게 제 상황입니다. (어댑터를 사용할 수 있을 것 같아서 ps2에서 작동하게 하는 사람에게 관심이 있습니다.)

이건 유망해 보이는데"스캔 코드를 키 코드에 매핑", 그러나 여러 테스트 후에도 다음과 같이 아무것도 변경되지 않았습니다.
vt1에서 키코드 "36"(키 "j")을 찾았고 showkey
vt1에서 스캔코드 "7e"(키보드 ".")를 찾았습니다.showkey --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..

관찰: 다음에도 적용되지 않습니다.KEYBOARD_KEY_7e=j

키를 찾기 위한 몇 가지 대안(@vinc17 제공):
evtest /dev/input/by-id/... 또는 (
input-kbd 3ex.event3에서 찾은 ID를 인덱스에 넣습니다)ls -l /dev/input/by-id/*

PS.: *직접 테스트하고 싶다면 앱 관련 스레드는 다음과 같습니다. http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/내가 겪고 있는 문제는 동일합니다. 일부 키(KP_Decimal, DownArrow, UpArrow, RightArrow)는 무시되고 "0x00"에서 동일한 값을 갖는 것으로 간주됩니다.

답변1

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

keyboard:usb:v05ACp0221*(udev 220 이전에는 첫 번째 줄을 사용해야 했습니다 .)

문자열 evdev:은 줄의 시작 부분에 있어야 합니다. 공급업체 및 제품 ID의 문자는 대문자여야 합니다. 각 KEYBOARD_KEY_설정 앞에는 공백이 있어야 합니다. (참고: 공백이 없는 줄은 오류 메시지를 표시하고, 공백이 두 개 있는 줄은 오류 메시지를 표시합니다.)아무 말 않고이전 udev 버전은 무시됩니다. 그 뒤에는 16진수 스캔 코드가 옵니다(둘 다 와 KEYBOARD_KEY_같고 제공됨). 유효한 값은 출력이나 출력 또는 파일 에서도 얻을 수 있습니다 . 예를 들어 위에서 사용한 값이 제공됩니다 (제거 하고 소문자로 변환하여).evtestinput-kbdevtestinput-kbd/usr/include/linux/input.hKEY_102ND102ndKEY_

파일을 저장한 후 다음을 입력합니다.

udevadm hwdb --update

데이터베이스를 (재)구축합니다 /etc/udev/hwdb.bin(타임스탬프를 확인할 수 있습니다). 그 다음에,

udevadm trigger --sysname-match="event*"

새로운 설정이 고려됩니다. 를 이용하여 확인할 수 있습니다 evtest.

2014년 udev 릴리스에는 불완전하거나 버그가 있는 정보가 있었지만 /lib/udev/hwdb.d/60-keyboard.hwdb살펴볼 수 있습니다.이 파일의 최신 개발 버전그리고/또는내 버그 보고서 및 토론문서화 및 간격 문제에 관해.

그래도 작동하지 않으면 udevdudevadm(8)의 로그 수준을 일시적으로 높이면 문제가 드러날 수 있습니다 udevadm control(자세한 내용은 udevadm(8) 매뉴얼 페이지 참조).

udev204와 같은 이전 버전의 경우,이 방법여전히 작동해야합니다.

관련 정보