키보드 하드 리맵 키?


19

키보드 키를 강제로 다시 매핑하는 방법을 찾으려고합니다.
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"에 동일한 값을 갖는 것으로 간주됩니다.


업데이트 된 파일은 /etc/udev/hwdb.bin아니 어야합니다 /lib/udev/hwdb.bin. 그러나이 파일이 올바르게 업데이트되었지만 재부팅 후에도 작동하지 않습니다. 문서에 누락 된 내용이있을 수 있습니다. 이 약 bugs.freedesktop.org/show_bug.cgi?id=82311
vinc17

정말 흥미있는 @ vinc17, 다시 시도 할 수있게되면 설정 파일을 찾아서 모방하려고해야한다고 생각합니다.
물병 자리 힘

1
내 문제는 KEYBOARD_KEY_ 줄이 단일 공백 ​​대신 2 개의 공백으로 시작했기 때문에 발생했습니다 (이 문서화되어 있지 않으며 오류 메시지가 없습니다!). 나는 당신을 모르지만 USB 키보드를 showkey --scancodes사용하면 udev가 기대하는 스캔 코드를 제공하지 않습니다 (값이 다릅니다). 이 input-kbd유틸리티는 올바른 스캔 코드를 제공합니다.
vinc17

1
evtest유틸리티는 당신에게 올바른 스캔 코드를 제공해야합니다 : 키를 입력 한 후, 당신은이 선을 받아야하고, 첫 번째 형태의 무언가로 끝나야합니다 code 4 (MSC_SCAN), value xxx, xxx스캔 코드입니다. 그러나 내 키보드의 드라이버는 버그가 있으며 MSC_SCAN다시 매핑하려는 키에 대해서는 이 줄을 얻지 못했습니다 . 그래서 내가 input-kbd선택한 장치의 모든 스캔 코드를 나열하는을 사용했습니다 .
vinc17

1
답변에 자세한 정보를 게시했습니다. 이제 36 또는 7002c가 값으로 작동하는지 확실하지 않습니다. 키 코드 식별자가 필요하다고 생각합니다. 내 대답을 참조하십시오.
vinc17

답변:


17

먼저 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 진수 (어떤 모두 같은 스캔 코드 뒤에 evtestinput-kbd주고). 유효한 값은 evtest출력 또는 출력 또는 파일 input-kbd에서 얻을 수 있습니다 /usr/include/linux/input.h. 예를 들어, 위에서 사용한 (제거 하고 소문자로 변환하여) KEY_102ND줄 수 있습니다.102ndKEY_

파일이 저장되면 다음을 입력하십시오.

udevadm hwdb --update

데이터베이스를 (다시) 빌드하려면 /etc/udev/hwdb.bin(타임 스탬프를 확인할 수 있음). 그때,

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

새로운 설정을 고려합니다. 로 확인할 수 있습니다 evtest.

2014 년에 릴리스 된 udev는에 불완전한 / 버기 정보가 /lib/udev/hwdb.d/60-keyboard.hwdb있지만 최신 개발 버전 파일 및 / 또는 버그 보고서 및 설명서 및 간격 문제에 대한 토론을 볼 수 있습니다.

이것이 작동하지 않으면 udevdwith 의 로그 수준을 일시적으로 증가시킨 후 문제가 발견 될 수 있습니다 udevadm control(자세한 내용은 udevadm (8) 매뉴얼 페이지 참조).

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


나는 udevadm 명령을 실행하면 업데이트되는 파일은 /lib/udev/hwdb.bin내가 함께보고, bless그리고 KEYBOARD_KEY_70085그 끝에 나타납니다. 우분투 14.04가 이런 식으로 구성되어 있다고 생각합니다. 나는 노력했다 udevadm control --log-priority=debug. lsusb(045e : 0750) 기반으로 키보드는 ~와 비슷 keyboard:usb:v045ep0750*하지만 시도해 보았습니다 keyboard:usb:v*p*. 내 생각에 이것은 /etc/udev/hwdb.bin업데이트되어야하지만 존재하지도 않습니다.
물병 자리 힘

나는 읽으면서 여기 내가이 명령을 사용하는 것처럼 때문일 수 있습니다 udevadm hwdb --usr --update내가 아니었다에도 불구하고.
물병 자리 힘

udevadm hwdb --update복사 /lib/udev/hwdb.bin하여 /etc/udev/hwdb.bin실행 한 후 strace udevadm trigger --sysname-match="event*"파일을 hwdb.bin읽지 않은 것 같습니다 (이것과 같은 경우).
물병 자리 힘

1
@ AquariusPower 예, 우분투 관련 버그가있을 수 있습니다 (Debian을 사용하고 있습니다 / 불안정합니다). 수행 할 때 데이터베이스를 읽을 수 있는지 확인하려면 여기에서 내 테스트를udevadm trigger ... 참조 하십시오 . 를 실행하기 전에 udevadm trigger ...파일의 수정 시간이 업데이트되었는지 확인해야합니다. 그렇지 않으면 파일을 읽을 때 액세스 시간이 업데이트되지 않습니다.
vinc17

1
@AquariusPower udevadm --version: 215 (및 udev 패키지 버전 : 215-7). 덕분에 udevadm trigger ...AFAIK 설정을 제거하지 않는 한 재부팅하지 않아도됩니다. 그러나 재부팅을 시도하여 효과가 있는지 확인할 수 있습니다.
vinc17
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.