HOWTO: Настройка мультимедийных клавиш на клавиатуре

Изображение пользователя Gremlin.

Автор: Гурьянов Дмитрий

Итак, Вы наконец-то добрались до клавиатуры. Конечно, зря что-ли производители стараются, делают по 20-30 дополнительных клавиш. Хочется, чтобы они работали. Под windows они, конечно же выпускают драйвера, различные модные програмки, а под линукс - ничего. Но не надо расстраиваться, в линуксе с этим делом намного лучше, чем в windows, так, например для моих двух клав - sven slim internet 330 и mitsumi internet keyboard - под виндой не было нормального ПО. А в линуксе для всех клавиатур это настраивается абсолютно одинаково. А действия на эти клавиши можно повесить с помощью оболочки, которую используете (во всех по-разному настраивается).

Весь смысл настройки клавиатуры в следующем: чтобы оконная система могда нормально использовать клавишу, для нее (для клавиши ) должно быть установлено соответствие ее скэн-кода с кодом Х-сервера, а для кодов Х-сервера заданы символьные имена, в файле /usr/X11R6/include/X11/XF86keysym.h находится куча символьных обозначений для мультимедийных клавиш. Лучше выбрать будущие имена для клавиш оттуда, хотя можно также посмотреть файл /usr/X11R6/include/X11/keysymdef.h. Таким образом нам надо привязать наши клавиши к символьным именам.

Ладно, приступим к настройке.
Во-первых, надо определить скэн-коды всех мультимедийных клавиш и записать их куда-нибудь (ну, или запомнить :)). Сделать это можно с помощью прогрммы xev, которая отлавливает все сообщения от оконной сисемы и выводит информацию на терминал. При нажатии клавиш должно выводиться что-то вроде этого:

KeyPress event, serial 30, synthetic NO, window 0x2400001,
root 0xb6, subw 0x0, time 16490621, (425,88), root:(475,114),
state 0x0, keycode 232 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x2400001,
root 0xb6, subw 0x0, time 16490688, (425,88), root:(475,114),
state 0x0, keycode 232 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:

KeyPress event, serial 30, synthetic NO, window 0x3000001,
root 0xb6, subw 0x0, time 17760217, (325,439), root:(375,465),
state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
XLookupString gives 1 bytes: (1b) "
XmbLookupString gives 1 bytes: (1b) "
XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x3000001,
root 0xb6, subw 0x0, time 17760346, (325,439), root:(375,465),
state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
XLookupString gives 1 bytes: (1b) "

Это я нажал сначала неизвестную X-серверу клавишу E-mail, а потом Escape. Нам нужен keycode. За ним в скобках идет сначала код клавиши для X-сервера, а затем символьное обозначение клавиши. Видно, что для Escape есть и код X-сервера и символьное обозначение.

Теперь,собственно, займемся настройкой привязки скэн-кодов. Сейчас нужно определить еще одну вещь - символьные имена скэн-кодов. Дело в том, что джля каждого скэн-кода задано имя, и в файле где мы будем описывать наши клавиши надо будет указывать именно эти имена, а не сами скэн-коды. Открываем файл /usr/X11R6/lib/X11/xkb/keycodes/xfree86, ищем там наши скэн-коды и узнаем их имена. Например для клавиши E-Mail на клаве Genius KB-0138 видим: = 236.

Теперь займемся добавлением новой модели клавиатуры.
Редактируем файлы xorg, xorg.lst и xorg.xml, ну, или xfree86 и xfree86.lst, если у Вас xfree в /usr/X11R6/lib/xkb/rules. Добавим нашу клавиатуру к группе inet. В файле xorg добавим имя нашей клавиатуры в конец списка клавиатур группы inet :

! $inetkbds = airkey acpi scorpius azonaRF2300 \
brother \
btc5113rf btc5126t btc9000 btc9000a btc9001ah btc5090\
cherryblue cherrybluea \
chicony chicony9885 \
compaqeak8 compaqik7 compaqik13 compaqik18 armada presario ipaq \
dell inspiron dtk2000 \
dexxa diamond genius geniuscomfy2 \
ennyah_dkb1008 \
hpi6 hp2501 hp2505 hp5181 hpxe3gc hpxe3gf hpxe4xxx hpzt11xx \
hp500fa hp5xx hp5185 \
honeywell_euroboard \
rapidaccess rapidaccess2 rapidaccess2a \
ltcd logiaccess logicdp logicdpa logicink logiciink \
logiinkse logiinkseusb logiik itouch \
mx1998 mx2500 mx2750 \
microsoftinet microsoftpro microsoftprooem microsoftprose \
microsoftoffice microsoftmult \
oretec \
propeller \
qtronix \
samsung4500 samsung4510 \
sk1300 sk2500 sk6200 sk7100 \
sven symplon toshiba_s3000 trust trustda yahoo genius138
В xorg.lst добавим имя и описание клавиатуры

...
toshiba_s3000 Toshiba Satellite S3000
trust Trust Wireless Keyboard Classic
trustda Trust Direct Access Keyboard
yahoo Yahoo! Internet Keyboard
genius138 Genius Internet Keyboard

// The entries here should be ordered as follows:
...

В xorg.xml тоже описание, на всякий случай (аналогично остальным моделям), хотя можно это и пропустить.

Теперь надо указать соответствия между именами скэн-кодов и именами клавих в иксах, это можно сделать в файле /usr/X11R6/lib/X11/xkb/symbols/inet, так как мы добавили клавиатуру в группу inet. Там в конце файла пишем что-то вроде этого:

partial alphanumeric_keys
xkb_symbols "genius138" {
name[Group1]= "Genius Internet Keyboard";

key { [ XF86Mail ] };
key { [ XF86Stop ] };
key { [ XF86Refresh ] };
key { [ XF86Back ] };
key { [ XF86WWW ] };
key { [ XF86Forward ] };
key { [ XF86Search ] };
key { [ XF86Favorites ] };
key { [ XF86Sleep ] };
New Action
};

Теперь нужно сказать Х-серверу, что клава у нас модели genius138 (для моего случая ). Открываем файл /etx/X11/xorg.conf или /etc/X11/XF86Config. Ищем место, где описывается клавиатура, и в качестве модели указываем нашу клавиатуру, вместо pc104 (или что там у Вас раньше стояло :)):

Section "InputDevice"
Identifier "Keyboard1"
Driver "keyboard"
Option "AutoRepeat" "250 30"
Option "XkbRules" "xfree86"
Option "XkbModel" "genius138"
Option "XkbLayout" "us,ru(winkeys)"
Option "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll,altwin:menu"
EndSection
На этом настройка Х-сервера закончена. Осталось его перезапустить, например комбинацией клавивиш Alt-Ctrl-BackSpace ;). Запускаем опять утилиту xev, смотрим, что получилось:

KeyPress event, serial 30, synthetic NO, window 0x2a00001,
root 0xb6, subw 0x0, time 521517, (92,-18), root:(142,8),
state 0x0,keycode 236 (keysym 0x1008ff19, XF86Mail), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x2a00001,
root 0xb6, subw 0x0, time 521647, (92,-18), root:(142,8),
state 0x0, keycode 236 (keysym 0x1008ff19, XF86Mail), same_screen YES,
XLookupString gives 0 bytes:

KeyPress event, serial 30, synthetic NO, window 0x2a00001,
root 0xb6, subw 0x0, time 522087, (92,-18), root:(142,8),
state 0x0, keycode 232 (keysym 0x1008ff28, XF86Stop), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x2a00001,
root 0xb6, subw 0x0, time 522155, (92,-18), root:(142,8),
state 0x0, keycode 232 (keysym 0x1008ff28, XF86Stop), same_screen YES,
XLookupString gives 0 bytes:

Если вместо имени клавиши опять стоит No_Symbol, то значит что-то тут не так. Если у Вас KDE, то можете запустить Control Center->Regional & Accessibility->Keyboard Layouts, найти свою клавиатуру в списке Keyboard Model и порадоваться своей работой :)

Теперь можно заняться настройкой оболочки. В KDE запускайте Control Center идите в раздел Regional & Accessibility->KHotKeys. Во fluxbox'е это можно сделать в файле ~/.fluxbox/keys.
На этом настройка закончена.

Помогите

Помогите плиз.Вообщем такая проблема у меня ноут Acer Aspire 3690
поставил Xev, сканирует все клавиши кроме дополнительных как будто их
вовсе нету в чем может быть дело ((?????

http://www.opensquad.com/arti

http://www.opensquad.com/article7.html

    Update : I tried acerhk kernel module, it succeed in (de)activating wifi device but special multimedia keys are not returned to kernel (neither in xev ...) maybe I’ve to wait the new release of acerhk, because the 5680 series can’t be forced... May work with more tries .....


гуглите внимательней (:

Нажать

Нажать кнопочку, которая неопределяется, посмотреть лог ядра (dmesg |tail), там будет что-нибудь типа:
Mar 26 23:48:02 [kernel] atkbd.c: Unknown key pressed (translated set 2, code 0xda on isa0060/serio0).
Mar 26 23:48:02 [kernel] atkbd.c: Use 'setkeycodes e05a keycode' to make it known.
Mar 26 23:48:02 [kernel] atkbd.c: Unknown key released (translated set 2, code 0xda on isa0060/serio0).

Соответственно чтобы кнопочка заработала, нужно написать:
setkeycodes e05a keycode

keycode я выбирал следующим образом:
dumpkeys |grep ^keycode
из этого списка выбрать любые незанятые значения (пустые или nul). Добавить команды в /etc/conf.d/local.start. У меня это выглядит так:
# Keycodes for Logitech Office Pro keyboard
# setkeycodes e05a
setkeycodes e05a 85 # F-Lock
setkeycodes e012 89 # WebCam
setkeycodes e064 90 # KB_)
# weird F-keys
setkeycodes e03b 128 # F1
setkeycodes e03c 129 # F2
setkeycodes e03d 130 # F3
setkeycodes e03e 131 # F4
setkeycodes e03f 132 # F5
setkeycodes e040 133 # F6
setkeycodes e041 134 # F7
setkeycodes e042 135 # F8
setkeycodes e043 136 # F9
setkeycodes e044 137 # F10
setkeycodes e057 138 # F11
setkeycodes e058 139 # F12

дальше в иксах настраивать как написано в статье, или просто в ~/.Xmodmap добавить:
keycode 237=XF86AudioMedia
keycode 162=XF86AudioPlay
keycode 160=XF86AudioMute
...

(keycode в иксах и в ядре различаются)