Настройка мультимедийных клавиш на клавиатуре
Автор: Гурьянов Дмитрий
Зачечания и предложения пишите сюда с пометкой в теме '{node 97}'.
Итак, Вы наконец-то добрались до клавиатуры. Конечно, зря что-ли производители стараются, делают по 20-30 дополнительных клавиш. Хочется, чтобы они работали. Под windows они, конечно же выпускают драйвера, различные модные програмки, а под линукс - ничего. Но не надо расстраиваться, в линуксе с этим делом намного лучше, чем в windows, так, например для моих двух клав - sven slim internet 330 и mitsumi internet keyboard - под виндой не было нормального ПО. А в линуксе для всех клавиатур это настраивается абсолютно одинаково. А действия на эти клавиши можно повесить с помощью оболочки, которую используете (во всех по-разному настраивается).
Весь смысл настройки клавиатуры в следующем: чтобы оконная система могда нормально использовать клавишу, для нее (для клавиши ) должно быть установлено соответствие ее скэн-кода с кодом Х-сервера, а для кодов Х-сервера заданы символьные имена, в файле /usr/X11R6/include/X11/XF86keysym.h
находится куча символьных обозначений для мультимедийных клавиш. Лучше выбрать будущие имена для клавиш оттуда, хотя можно также посмотреть файл /usr/X11R6/include/X11/keysymdef.h
. Таким образом нам надо привязать наши клавиши к символьным именам.
Ладно, приступим к настройке.
Во-первых, надо определить скэн-коды всех мультимедийных клавиш и записать их куда-нибудь (ну, или запомнить :)). Сделать это можно с помощью прогрммы xev
, которая отлавливает все сообщения от оконной сисемы и выводит информацию на терминал. При нажатии клавиш должно выводиться что-то вроде этого:
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 видим:
.
Теперь займемся добавлением новой модели клавиатуры.
Редактируем файлы xorg
, xorg.lst
и xorg.xml
, ну, или xfree86
и xfree86.lst
, если у Вас xfree в /usr/X11R6/lib/xkb/rules
. Добавим нашу клавиатуру к группе inet. В файле xorg добавим имя нашей клавиатуры в конец списка клавиатур группы inet :
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. Там в конце файла пишем что-то вроде этого:
xkb_symbols "genius138" {
name[Group1]= "Genius Internet Keyboard";
key
key
key
key
key
key
key
key
key
New Action
};
Теперь нужно сказать Х-серверу, что клава у нас модели genius138 (для моего случая ). Открываем файл /etx/X11/xorg.conf
или /etc/X11/XF86Config
. Ищем место, где описывается клавиатура, и в качестве модели указываем нашу клавиатуру, вместо pc104
(или что там у Вас раньше стояло :)):
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, смотрим, что получилось:
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
.
На этом настройка закончена.