이벤트 장치에서 입력된 키를 캡처하여 매핑합니다. (터치패드 토글 키는 매핑되지 않습니다.)

이벤트 장치에서 입력된 키를 캡처하여 매핑합니다. (터치패드 토글 키는 매핑되지 않습니다.)

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. 내 노트북의 터치패드를 전환하도록 이 버튼을 매핑할 수 있는 방법이 있나요? 그렇다면 어떻게 해야 합니까?

답변1

커널이 이를 수신하지만 인식되지 않는다고 계속 불평하는 것으로 나타났습니다.

이 문제가 발생하거나 운영 체제에서 읽히지 않는 키를 매핑하려는 사람은 계속 읽어보세요.

터미널을 열고 실행하면 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

199에 매핑되도록 키코드를 요청했기 때문에 이것은 분명히 잘못된 것입니다 XF86TouchpadToggle. 다시 확인하여 실제로 매핑된 xmodmap -pke것을 발견 하고 오프셋 차이가 8이라는 것을 확인하여 명령을 다시 시도했지만 키가 도착하도록 매핑되었습니다 .keycode 207NoSymbolsetkeycodeskeycode 191

sudo setkeycodes e03e 191

이것은 매우 잘 작동합니다.

편집 - 제가 제공한 솔루션은 시작 시 작동해야 했지만 작동하지 않았습니다. 내일 알아내고 이 답변을 업데이트하겠습니다. 이제 시작 시 수동으로 실행할 수 있을 것 같습니다.

답변2

표면적으로 장치는 키보드(소프트웨어에서 "코어" 키보드와 별도로 식별됨)이지만 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. 그 중 하나는 옆에 숫자(예: 135)가 있는 "Device Enabled"라고 해야 합니다. 다음 스크립트는 터치패드를 전환합니다.

#!/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

관련 정보