воскресенье, 23 января 2011 г.

мультимедийные клавиши с кодами >255

Как известно, иксы поддерживают коды клавиш от 8 до 255.
Но есть клавы с кодами и 600+, которые, естественно, не работают - и никакие xev&ko их не видят.
Решением стал патч для evdev:
Этот патч позволяет переназначить коды клавиш так, чтобы они попали в поддерживаемый иксами диапазон 8-255.

В Gentoo процесс лечения evdev будет выглядеть так
ebuild /usr/portage/x11-drivers/xf86-input-evdev/xf86-input-evdev-2.6.0.ebuild prepare
cd /var/tmp/portage/x11-drivers/xf86-input-evdev-2.6.0/work/xf86-input-evdev-2.6.0/
patch -p1 < /путь/до/evdev-over-255-2.6.0.patch 
ebuild /usr/portage/x11-drivers/xf86-input-evdev/xf86-input-evdev-2.6.0.ebuild merge 
либо воспользоваться автопатчером из это статьи
Также, т.к. xev не видит коды свыше 255, пришлось поставить т.н. evtest. Пакеты есть во многих дистрах - Fedora, Debian, Arch...для генты не нашёл - потому нарисовал ебилд если нет пакета - можно собрать и руками
mkdir evtest
cd evtest/
wget http://beagleboard.googlecode.com/files/evtest.c
gcc -o evtest evtest.c
Теперь надо найти клаву
megabaks@desktop ~/evtest USA $ ls -l /dev/input/by-id/
итого 0
lrwxrwxrwx 1 root 0 9 Янв 23 03:30 usb-A4Tech_USB_Mouse-event-mouse -> ../event4
lrwxrwxrwx 1 root 0 9 Янв 23 03:30 usb-A4Tech_USB_Mouse-mouse -> ../mouse0
lrwxrwxrwx 1 root 0 9 Янв 23 19:29 usb-KYE_4D_device_Ergomedia-event-if01 -> ../event3
lrwxrwxrwx 1 root 0 9 Янв 23 19:29 usb-KYE_4D_device_Ergomedia-event-kbd -> ../event2
megabaks@desktop ~/evtest USA $
Моя клава здесь - это /dev/input/event2 и /dev/input/event3
Теперь собственно выясняем коды капризных кнопок
./evtest /dev/input/event3
Получим после нажатия кнопок что-то типа
Event: time 1295853582.360298, type 4 (Misc), code 4 (ScanCode), value c022d
Event: time 1295853582.360305, type 1 (Key), code 418 (?), value 1
Event: time 1295853582.360307, -------------- Report Sync ------------
Event: time 1295853582.464293, type 4 (Misc), code 4 (ScanCode), value c022d
Event: time 1295853582.464297, type 1 (Key), code 418 (?), value 0
Event: time 1295853582.464298, -------------- Report Sync ------------
Event: time 1295853583.712333, type 4 (Misc), code 4 (ScanCode), value c022e
Event: time 1295853583.712338, type 1 (Key), code 419 (?), value 1
Event: time 1295853583.712339, -------------- Report Sync ------------
Event: time 1295853583.864339, type 4 (Misc), code 4 (ScanCode), value c022e
Event: time 1295853583.864344, type 1 (Key), code 419 (?), value 0
Event: time 1295853583.864346, -------------- Report Sync ------------
это 2 кнопки, обозначенные как Zoom(+ и -)
Но так как зум мне не нужен, решил сделать из них скролл. Теперь надо дать этим кнопкам соответствующие имена и, естественно, коды. Смотрим что же у нас есть
xmodmap -pke
Находим подходящие кнопки
keycode 162 = XF86ScrollUp NoSymbol XF86ScrollUp
keycode 186 = XF86ScrollDown NoSymbol XF86ScrollDown
Теперь собственно и настраиваем кнопки - для этого создаём файл /etc/X11/xorg.conf.d/10-keyboard.conf примерно вот такого содержания
Section "ServerLayout"
Identifier      "Layout0"
Screen      0  "Screen0" 0 0
InputDevice     "Keyboard1" "SendCoreEvents"
EndSection

Section "InputDevice"
Identifier  "Keyboard1"
Driver      "evdev"
Option      "Device" "/dev/input/event3"
Option      "event_key_remap" "418=162 419=186 423=101 425=156 421=157"
EndSection
думаю тут всё понятно.
Теперь осталось только перезапустить иксы/перезагрузить_комп и убедиться, что "мёртвые" кнопки ожили. для этого воспользуемся уже xev в выхлопе которого, при нажатии ранее не работающих кнопок, увидим что-то типа этого
KeyPress event, serial 34, synthetic NO, window 0x2a00001,
root 0x15a, subw 0x0, time 101283197, (208,531), root:(211,535),
state 0x10, keycode 162 (keysym 0x1008ff78, XF86ScrollUp), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x2a00001,
root 0x15a, subw 0x0, time 101283341, (208,531), root:(211,535),
state 0x10, keycode 162 (keysym 0x1008ff78, XF86ScrollUp), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False

KeyPress event, serial 34, synthetic NO, window 0x2a00001,
root 0x15a, subw 0x0, time 101285053, (208,531), root:(211,535),
state 0x10, keycode 186 (keysym 0x1008ff79, XF86ScrollDown), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x2a00001,
root 0x15a, subw 0x0, time 101285197, (208,531), root:(211,535),
state 0x10, keycode 186 (keysym 0x1008ff79, XF86ScrollDown), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
Теперь можно вешать на них желаемые действия...короче, пользоваться