[unix] 이벤트 장치에서 키 입력 캡처 및 맵핑 (터치 패드 키가 맵핑 해제 됨)

Ubuntu 13.10이 설치된 Lenovo IdeaPad Yoga 13이 있습니다. 장치의 키보드에는 “터치 패드 토글”단추가 있습니다 ( F5). 키보드의 F*버튼이 반대로되어 있으므로 ( + F5를 눌러야 하며 실제로는 전환 키입니다).FnF5F5

버튼이 실제로 특정 장치와 같은 터치 패드가 아닌 키보드로 읽힌다는 것을 알았습니다 /dev/input/event3. 그래서 sudo input-events 3버튼을 사용하여 스캔 코드 190을 전송한다는 것을 알 수있었습니다.

출력 sudo lsinput:

/dev/input/event3
   bustype : BUS_I8042
   vendor  : 0x1
   product : 0x1
   version : 43907
   name    : "AT Translated Set 2 keyboard"
   phys    : "isa0060/serio0/input0"
   bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP

출력 sudo input-events 3:

23:13:03.849392: EV_MSC MSC_SCAN 190
23:13:03.849392: EV_SYN code=0 value=0
23:13:03.855413: EV_MSC MSC_SCAN 190
23:13:03.855413: EV_SYN code=0 value=0

를 제외한 다른 프로그램 (예 xev:)은 읽을 수없는 것 같습니다 input-events. 랩탑에서 터치 패드를 토글하도록이 버튼을 매핑 할 수있는 방법이 있습니까? 그렇다면 어떻게해야합니까?



답변

커널이 커널을 가져 왔지만 인식되지 않았다고 계속 불평했다.

이 문제가 있거나 OS에서 읽지 않은 키를 매핑하려는 사람은 계속 읽으십시오.

터미널을 열고 실행하십시오 dmesg | grep -A 1 -i setkeycodes. 이렇게하면 다음과 같은 여러 항목이 제공됩니다.

[    9.307463] atkbd serio0: Unknown key pressed (translated set 2, code 0xbe on isa0060/serio0).
[    9.307476] atkbd serio0: Use 'setkeycodes e03e <keycode>' to make it known.

우리가 관심이있는 것은 “setkeycodes”다음의 16 진수 값입니다 e03e. 이 경우이 값은 입니다. 이 중 여러 개가 있으면을 실행할 수 있습니다 tail -f /var/log/kern.log. 일단 당신이 찾고 있다면, 당신은 당신이 찾고있는 버튼을 누를 수 있으며, 이것은 당신에게 위와 같은 줄을 줄 것이고, 우리는 16 진수 값만 필요합니다. 이것을 기록하십시오.

이제 xmodmap -pke | less적절한 매핑을 실행 하십시오. 필자의 경우 터치 패드를 토글하기 위해 이것을 매핑해야 했으므로 다음 줄에 관심이 있습니다.

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

관심있는 것을 찾을 수 없다면 @Gilles 답변도 읽고 사용자 정의 매핑을 정의한 다음 계속 읽으십시오 (커널이 읽는 경우 xorg.conf에 추가 할 필요가 없습니다). 디)

이제 다음 명령을 실행 : sudo setkeycodes [hexadecimal] [keycode]그래서되었다 내 경우 : setkeycodes e03e 199.

이제 다음 줄을 사용하여 제대로 작동하는지 또는 올바른 매핑이 있는지 테스트 할 수 있습니다.

xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'

이 명령을 실행할 때 새로 열린 창 ( xev) 에 초점을 맞추고 콘솔 출력을 확인해야합니다. 내 경우에는 다음과 같이 읽습니다.

207 NoSymbol

keycode 요청한 것처럼 이것은 분명히 잘못 199되었으므로에 매핑되었습니다 XF86TouchpadToggle. xmodmap -pke다시 확인 하고 keycode 207실제로 매핑 된 NoSymbol것을 보았고 오프셋 차이가 8이라는 것을 알았으므로 setkeycodes명령을 다시 시도 했지만 키는에 매핑되었습니다 keycode 191.

sudo setkeycodes e03e 191

이것은 완벽하게 작동했습니다.

편집-시동 작업에 필요한 솔루션이 아닙니다. 나는 이것을 내일 알아 내고이 답변을 업데이트 할 것입니다. 지금은 수동으로 시작할 때 이것을 실행할 수 있다고 가정합니다.


답변

외관상 장치는 키보드 (소프트웨어에서 “코어”키보드와 분리 된 것으로 인식됨)이지만 X 서버가 인식하지 않습니다.

아래에 입력 섹션을 추가/etc/X11/xorg.conf.d 하십시오 . 즉, 디렉토리 /etc/X11/xorg.conf.d가 없으면 extra-keyboard-buttons디렉토리를 작성하고 해당 디렉토리에 파일 을 작성하십시오 .

Section "InputClass"
    Identifier "extra-keyboard-buttons"
    Driver "kbd"
    MatchProduct "AT Translated Set 2 keyboard"
EndSection

MatchProduct줄 에 대해 잘 모르겠습니다 . 그래도 작동하지 않으면 MatchXXX지시문을 사용하십시오 .

이 파일이 올바르게 설정되면 X 서버를 시작할 때이 키보드에서 이벤트를 처리해야 xev하며 다른 곳 에서 이벤트를 볼 수 있습니다 . 키 코드를 기록하고 (이 경우 X11 키 코드가 하드웨어 키 코드와 동일한 지 확실하지 않음) 키 심을 연관시킵니다. 당신은 그것을 .Xmodmap포함하는 홈 디렉토리에 있는 파일을 통해 그것을 할 수 있습니다

keycode 190 = XF86_Launch5

이제이 키를 사용하여 키보드 단축키정의 할 수 있습니다 .

터치 패드를 토글하려면 명령을 사용하십시오 xinput. 실행 xinput list입력 장치를 사용할 수있는 볼 터치 패드의 이름을주의하는 것이 (내가 전화 할게 Touchpad아래). xinput list-props Touchpad속성을 나열하기 위해 실행 합니다. 그중 하나는 옆에 숫자가있는“Device Enabled”라고합니다 (예 : 135). 다음 스크립트는 터치 패드를 토글합니다.

#!/bin/sh
device_name='Touchpad'
property=135
flipped_state=$(xinput list-props "$device_name" |
                awk "/\\($property\\)/ {print 1 - \$NF}")
xinput set-prop "$device_name" "$property" "$flipped_state"

이것을 파일에 저장 ~/bin/toggle-touchpad하고 실행 가능하게 만드십시오 ( chmod +x ~/bin/toggle-touchpad). 키에 바인딩하려면 xbindkeys를 설치 하고 다음 줄을 넣어 스크립트를 실행하도록 구성하십시오 ~/.xbindkeysrc.

"toggle-touchpad"
  XF86_Launch5


답변