현재 그래픽 태블릿의 버튼을 키코드로 선택하려고 합니다. 추가 마우스 버튼보다는 키보드 단축키를 지원하는 프로그램이 더 많기 때문에(예를 들어 Krita는 왼쪽 클릭과 오른쪽 클릭만 지원하는 것 같습니다), 태블릿 버튼을 키코드로 처리하여 바로가기 키를 사용할 수 있게 하고 싶습니다. 프로그램에서 할당됩니다.
내가 지금까지 무엇을 했는지
/etc/udev/hwdb.d/90-huion.hwdb
태블릿의 스캔 코드를 키 코드에 매핑하기 위해 udev hwdb 파일( )을 만들었습니다 .
내 hwdb 파일은 다음과 같습니다.
evdev:input:b0003v256Cp006Ee0111*
KEYBOARD_KEY_90001=a
KEYBOARD_KEY_90002=a
KEYBOARD_KEY_90003=a
KEYBOARD_KEY_90004=a
KEYBOARD_KEY_90005=a
KEYBOARD_KEY_90006=a
KEYBOARD_KEY_90007=a
KEYBOARD_KEY_90008=a
KEYBOARD_KEY_90009=a
KEYBOARD_KEY_9000a=a
MANUAL_OVERRIDE=1
검색 부분에서는 여기에서 찾은 event23 값을 사용합니다.
cat /sys/class/input/event23/device/id/bustype > 0003 cat /sys/class/input/event23/device/id/product > 006e cat /sys/class/input/event23/device/id/vendor > 256c cat /sys/class/input/event23/device/id/version > 0111
콜론(HID 256c:006e Pad)이 있기 때문에 장치 이름을 기반으로 매핑할 수 없으며 콜론을 구분 기호로 사용하는 hwdb 파일에서는 해당 이름이 잘 작동하지 않는 것 같습니다.
로드 hwdb.bin
하고 다시 로드하고 udev 규칙을 (다시) 트리거했습니다.
sudo systemd-hwdb update
sudo udevadmin trigger
sudo udevadm control --reload
또한 hwdb를 이전 버전으로 업데이트해 보았지만
sudo udevadm hwdb --update
아무런 차이가 없습니다. 또한 태블릿을 분리했다가 다시 연결해 보았습니다.
를 사용하면 udevadm info
내 파일이 사용되고 있음을 알 수 있습니다(따라서 이 MANUAL_OVERRIDE=1
섹션에서는 아무 작업도 수행하지 않습니다).
udevadm info
산출:
P: /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.0/0003:256C:006E.0004/input/input23/event23
N: input/event23
L: 0
S: input/by-id/usb-256c_006e-event-mouse
S: input/by-path/pci-0000:00:14.0-usb-0:2.1.1:1.0-event-mouse
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.1/1-2.1.1/1-2.1.1:1.0/0003:256C:006E.0004/input/input23/event23
E: DEVNAME=/dev/input/event23
E: MAJOR=13
E: MINOR=87
E: SUBSYSTEM=input
E: USEC_INITIALIZED=5852671
E: KEYBOARD_KEY_90001=a
E: KEYBOARD_KEY_90002=a
E: KEYBOARD_KEY_90003=a
E: KEYBOARD_KEY_90004=a
E: KEYBOARD_KEY_90005=a
E: KEYBOARD_KEY_90006=a
E: KEYBOARD_KEY_90007=a
E: KEYBOARD_KEY_90008=a
E: KEYBOARD_KEY_90009=a
E: KEYBOARD_KEY_9000a=a
E: MANUAL_OVERRIDE=1
E: ID_INPUT=1
E: ID_INPUT_TABLET=1
E: ID_INPUT_KEY=1
E: ID_VENDOR=256c
E: ID_VENDOR_ENC=256c
E: ID_VENDOR_ID=256c
E: ID_MODEL=006e
E: ID_MODEL_ENC=006e
E: ID_MODEL_ID=006e
E: ID_REVISION=3000
E: ID_SERIAL=256c_006e
E: ID_TYPE=hid
E: ID_BUS=usb
E: ID_USB_INTERFACES=:030102:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=usbhid
E: ID_PATH=pci-0000:00:14.0-usb-0:2.1.1:1.0
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_2_1_1_1_0
E: ID_INPUT_TABLET_PAD=1
E: LIBINPUT_DEVICE_GROUP=3/256c/6e:usb-0000:00:14.0-2.1
E: DEVLINKS=/dev/input/by-id/usb-256c_006e-event-mouse /dev/input/by-path/pci-0000:00:14.0-usb-0:2.1.1:1.0-event-mouse
E: TAGS=:power-switch:aaaaaaaaaa
디버그
시험
내가 아는 한, 이것이 태블릿 버튼을 매핑하는 데 필요한 전부이며 (대부분) 유망해 보입니다 evtest
.
Testing ... (interrupt to exit)
Event: time 1589801905.094479, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90001
Event: time 1589801905.094479, type 1 (EV_KEY), code 30 (KEY_A), value 1
Event: time 1589801905.094479, -------------- SYN_REPORT ------------
Event: time 1589801905.252456, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90001
Event: time 1589801905.252456, type 1 (EV_KEY), code 30 (KEY_A), value 0
Event: time 1589801905.252456, -------------- SYN_REPORT ------------
Event: time 1589801906.960440, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
Event: time 1589801906.960440, type 1 (EV_KEY), code 30 (KEY_A), value 1
...
Event: time 1589801913.582373, -------------- SYN_REPORT ------------
Event: time 1589801913.936376, type 4 (EV_MSC), code 4 (MSC_SCAN), value 9000a
Event: time 1589801913.936376, type 1 (EV_KEY), code 30 (KEY_A), value 1
Event: time 1589801913.936376, -------------- SYN_REPORT ------------
Event: time 1589801914.086370, type 4 (EV_MSC), code 4 (MSC_SCAN), value 9000a
Event: time 1589801914.086370, type 1 (EV_KEY), code 30 (KEY_A), value 0
Event: time 1589801914.086370, -------------- SYN_REPORT ------------
Event: time 1589801914.992371, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90001
Event: time 1589801914.992371, type 1 (EV_KEY), code 304 (BTN_SOUTH), value 1
Event: time 1589801914.992371, -------------- SYN_REPORT ------------
Event: time 1589801915.154366, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90001
Event: time 1589801915.154366, type 1 (EV_KEY), code 304 (BTN_SOUTH), value 0
Event: time 1589801915.154366, -------------- SYN_REPORT ------------
Event: time 1589801915.358379, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
Event: time 1589801915.358379, type 1 (EV_KEY), code 305 (BTN_EAST), value 1
Event: time 1589801915.358379, -------------- SYN_REPORT ------------
Event: time 1589801915.446357, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
Event: time 1589801915.446357, type 1 (EV_KEY), code 305 (BTN_EAST), value 0
Event: time 1589801915.446357, -------------- SYN_REPORT ------------
매핑되지 않은 것처럼 보이는 마지막 두 개의 버튼(BTN_SOUTH 및 BTN_EAST)을 제외하고(아마도 매핑된 버튼과 동일한 스캔 코드를 갖기 때문일 것입니다) 다른 모든 버튼은 올바르게 보고됩니다 code 30 (KEY_A)
(이 버튼이 왜 있는지 아는 경우). d 알고 싶습니다. 두 버튼이 매핑되지 않았지만 지금은 그것에 집중하고 싶지 않습니다.)
셰프
xev
올바르게 매핑되지 않은 것 같은 두 개의 버튼 만 사용하면 xev
해당 두 버튼에 대한 콘솔 출력은 다음과 같습니다.
ButtonPress event, serial 34, synthetic NO, window 0x3a00001,
root 0x6bd, subw 0x0, time 8912753, (1,806), root:(971,821),
state 0x0, button 15, same_screen YES
ButtonRelease event, serial 34, synthetic NO, window 0x3a00001,
root 0x6bd, subw 0x0, time 8912953, (1,806), root:(971,821),
state 0x0, button 15, same_screen YES
ButtonPress event, serial 34, synthetic NO, window 0x3a00001,
root 0x6bd, subw 0x0, time 8913377, (1,806), root:(971,821),
state 0x0, button 16, same_screen YES
ButtonRelease event, serial 34, synthetic NO, window 0x3a00001,
root 0x6bd, subw 0x0, time 8913581, (1,806), root:(971,821),
state 0x0, button 16, same_screen YES
hwdb가 변경되기 전에는 버튼이 1-3 및 8-16 버튼으로 선택되었지만(매핑되지 않은 버튼 15 및 16은 출력에서 각각 BTN_SOUTH 및 BTN_EAST 버튼이었습니다 evtest
) 이제는 xev
대부분이 표시되지 않습니다(매핑되지 않은 매핑만 해당) 15 및 16).
정보
이것을 사용하면 sudo dmesg --follow
알 수 없는 키 누름처럼 보이는 이벤트가 표시되지 않습니다.
에버루메뉴
evemu-describe
hwdb 변경 전 출력:
# EVEMU 1.3
# Kernel: 5.7.0-1-MANJARO
# DMI: dmi:bvnAmericanMegatrendsInc.:bvr1205:bd05/11/2018:svnSystemmanufacturer:pnSystemProductName:pvrSystemVersion:rvnASUSTeKCOMPUTERINC.:rnPRIMEZ270-P:rvrRevX.0x:cvnDefaultstring:ct3:cvrDefaultstring:
# Input device name: "HID 256c:006e Pad"
# Input device ID: bus 0x03 vendor 0x256c product 0x6e version 0x111
# Supported events:
# Event type 0 (EV_SYN)
# Event code 0 (SYN_REPORT)
# Event code 1 (SYN_CONFIG)
# Event code 2 (SYN_MT_REPORT)
# Event code 3 (SYN_DROPPED)
# Event code 4 ((null))
# Event code 5 ((null))
# Event code 6 ((null))
# Event code 7 ((null))
# Event code 8 ((null))
# Event code 9 ((null))
# Event code 10 ((null))
# Event code 11 ((null))
# Event code 12 ((null))
# Event code 13 ((null))
# Event code 14 ((null))
# Event code 15 (SYN_MAX)
# Event type 1 (EV_KEY)
# Event code 256 (BTN_0)
# Event code 257 (BTN_1)
# Event code 258 (BTN_2)
# Event code 259 (BTN_3)
# Event code 260 (BTN_4)
# Event code 261 (BTN_5)
# Event code 262 (BTN_6)
# Event code 263 (BTN_7)
# Event code 264 (BTN_8)
# Event code 265 (BTN_9)
# Event code 304 (BTN_SOUTH)
# Event code 305 (BTN_EAST)
# Event code 306 (BTN_C)
# Event code 331 (BTN_STYLUS)
# Event type 3 (EV_ABS)
# Event code 0 (ABS_X)
# Value 0
# Min 0
# Max 1
# Fuzz 0
# Flat 0
# Resolution 0
# Event code 1 (ABS_Y)
# Value 0
# Min 0
# Max 1
# Fuzz 0
# Flat 0
# Resolution 0
# Event type 4 (EV_MSC)
# Event code 4 (MSC_SCAN)
# Properties:
N: HID 256c:006e Pad
I: 0003 256c 006e 0111
...
후에:
# EVEMU 1.3
# Kernel: 5.7.0-1-MANJARO
# DMI: dmi:bvnAmericanMegatrendsInc.:bvr1205:bd05/11/2018:svnSystemmanufacturer:pnSystemProductName:pvrSystemVersion:rvnASUSTeKCOMPUTERINC.:rnPRIMEZ270-P:rvrRevX.0x:cvnDefaultstring:ct3:cvrDefaultstring:
# Input device name: "HID 256c:006e Pad"
# Input device ID: bus 0x03 vendor 0x256c product 0x6e version 0x111
# Supported events:
# Event type 0 (EV_SYN)
# Event code 0 (SYN_REPORT)
# Event code 1 (SYN_CONFIG)
# Event code 2 (SYN_MT_REPORT)
# Event code 3 (SYN_DROPPED)
# Event code 4 ((null))
# Event code 5 ((null))
# Event code 6 ((null))
# Event code 7 ((null))
# Event code 8 ((null))
# Event code 9 ((null))
# Event code 10 ((null))
# Event code 11 ((null))
# Event code 12 ((null))
# Event code 13 ((null))
# Event code 14 ((null))
# Event code 15 (SYN_MAX)
# Event type 1 (EV_KEY)
# Event code 30 (KEY_A)
# Event code 256 (BTN_0)
# Event code 304 (BTN_SOUTH)
# Event code 305 (BTN_EAST)
# Event code 306 (BTN_C)
# Event code 331 (BTN_STYLUS)
# Event type 3 (EV_ABS)
# Event code 0 (ABS_X)
# Value 0
# Min 0
# Max 1
# Fuzz 0
# Flat 0
# Resolution 0
# Event code 1 (ABS_Y)
# Value 0
# Min 0
# Max 1
# Fuzz 0
# Flat 0
# Resolution 0
# Event type 4 (EV_MSC)
# Event code 4 (MSC_SCAN)
# Properties:
N: HID 256c:006e Pad
I: 0003 256c 006e 0111
...
다양한 기기를 사용해 보세요
내가 뭔가 잘못하고 있는지 확인하기 위해 USB 마우스로 매우 유사한 것을 시도했습니다(왼쪽 클릭이므로 스캔 코드 90001을 매핑하지 않았습니다). 마우스를 선택 xev
하고 마우스 오른쪽 버튼을 클릭하거나 스크롤하면 예상한 문자 "a"가 표시됩니다(따라서 질문에 잘못된 문자 a가 표시되는 이유는 바로 이것이기 때문입니다). xev
키보드와 마우스 출력을 비교했습니다 .
KeyPress event, serial 34, synthetic NO, window 0x3a00001,
root 0x6bd, subw 0x0, time 4209087, (-1,721), root:(969,736),
state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (61) "a"
XmbLookupString gives 1 bytes: (61) "a"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x3a00001,
root 0x6bd, subw 0x0, time 4209151, (-1,721), root:(969,736),
state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (61) "a"
XFilterEvent returns: False
마우스가 있는 Xev("a"에 매핑된 버튼)
MappingNotify event, serial 34, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 248
KeyPress event, serial 34, synthetic NO, window 0x3a00001,
root 0x6bd, subw 0x0, time 4211519, (-1,721), root:(969,736),
state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (61) "a"
XmbLookupString gives 1 bytes: (61) "a"
XFilterEvent returns: False
KeyRelease event, serial 35, synthetic NO, window 0x3a00001,
root 0x6bd, subw 0x0, time 4211679, (-1,721), root:(969,736),
state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (61) "a"
XFilterEvent returns: False
장치
문제의 태블릿은 내가 설치한 "Huion New 1060Plus"이며 digimend-kernel-drivers-dkms-git
내 태블릿이 evdev 드라이버를 사용하고 있다고 생각했습니다(대체 wacom 드라이버를 설치하지 않았지만 및에서 사용 했기 때문에 xf86-input-wacom
설치했습니다 ). 버튼 문제 외에도 펜 압력을 포함하여 태블릿이 제대로 작동합니다.libwacom
libinput
gnome-settings-daemon
사용 지침
나는 주로 다음 출처의 지침을 따릅니다.