Сегодня клавиатурой с дополнительными мультимедийными кнопками, уже ни кого не удивишь. На диске, который идет в комплекте в крайнем случае на сайте производителя, можно найти драйвера и всячекие полезные программы, но только для Windows. Попробуем разобраться как научить пингвина работать такими с дополнительными клавишами.
X-сервер в отличие от человека, который ориентируется по надписям на клавиатуре, в своей работе интересуется лишь скан-кодом нажатой клавиши. Причем Хсы сначала считывают таблицу кодов клавиш ядра, а затем уже код клавиши привязывается к собственной таблице кодов. Причем приходится отдельно настраивать реакцию на нажатие кнопок в консоли и в X-Window. Чтобы узнать код клавиши запускаем утилиту xev входящую в состав Х-сервера, появится окно Event Tester и последовательно нажимаем клавиши, запоминая выдаваемый код:
$ xev
…
KeyRelease event, serial 31, synthetic NO, window 0x3e00001,
root 0x67, subw 0x0, time 279734676, (311,611), root:(1104,687),
state 0x2000, keycode 236 (keysym 0x1008ff19, XF86Mail), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 31, synthetic NO, window 0x2600001,
root 0x67, subw 0x0, time 265877259, (883,334), root:(886,358),
state 0x0, keycode 161 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
Информации будет выдано много, так как будет отслеживаться каждое движение мышки при проходе над окном Event Tester. Клавишу описывает блок KeyRelease, в частности значение keycode как раз и являются скан-кодом который мы хотим узнать. В приведенном примере нажаты две клавиши. Клавише с кодом 236 соответствует код клавиши для X-сервера указанный в keysym, и символьное обозначение клавиши действие XF86Mail, которое в KDE запускает используемый по умолчанию почтовый клиент. Для клавиши с номером 161 код и действие не определены.
Возможна ситуация когда клавиша нажимается, но ее скан-код не выдается. Это означает, то что ядро не может найти скан-код привязанный нажатой клавише, такая ситуация сегодня возникает достаточно редко, но всяко в жизни бывает. В выводе «dmesg» должна быть такая строка:
Use ‘setkeycodes 0xec <keycode>’ to make it known.
То есть предлагается установить скан-код клавиши самостоятельно при помощи «setkeycodes», значение keycode выбрать очень просто. Нужно перевести полученную цифру в десятичное число (большинство калькуляторов это умеют) и добавить 128. В данном примере 0xec =236, то есть, получаем скан-код 364. Если есть сомнения список задействованных и незадействованных скан-кодов можно просмотреть, запустив в консоли утилиту «getkeycodes» или «dumpkeys». Например если вывод «getkeycodes | grep <код клавиши>» ничего не дал, значит этот код можно смело использовать.
Помочь узнать скан-код может и утилита ХKeycaps имеющая графический интерфейс (www.jwz.org/xkeycaps), которая является графическим фронтэндом к Xmodmap.
В консоли программа xev вполне естественно не работает. Здесь чтобы узнать скан-код выдаваемый ядром следует использовать утилиты «showkey», либо «getkeycodes»:
$ showkey
клавиатура была в режиме UNICODE
нажмите любую клавишу (программа завершится через 10 сек после последнего нажатия)…
0xe0 0x6c 0xe0 0xec
Первые две цифры соответствуют нажатой клавише, вторые когда она отпущена.
Настройка привязки скан-кодов в X-Window
Итак скан-коды у нас теперь есть нужно указать Х-серверу, что собственно он должен делать при нажатии этой клавиши, то есть присвоить ей символьное имя. Список символьных имен приведен в файле заголовков XF86keysym.h. По умолчанию заголовочные файлы Х-сервера в современных дистрибутивах не устанавливаются. Чтобы увидеть его в Ubuntu нужно установить пакет x11proto-core-dev, после чего данный файл увидишь в каталоге /usr/include/X11. Как вариант можно обратиться к CVS серверу X.Org (webcvs.freedesktop.org/xorg/proto/X11/XF86keysym.h?view=log&pathrev=XORG-CURRENT). Смотрим:
$ cat /usr/include/X11/XF86keysym.h
/*
* Keys found on some «Internet» keyboards.
*/
#define XF86XK_Standby 0x1008FF10
#define XF86XK_AudioLowerVolume 0x1008FF11
#define XF86XK_AudioRaiseVolume 0x1008FF13
#define XF86XK_AudioPlay 0x1008FF14
#define XF86XK_AudioStop 0x1008FF15
#define XF86XK_Mail 0x1008FF19
И так далее. Если сравнить последнюю строку с выводом xev, то увидим, что значения совпадают с клавишей с keycode 236 — keysym 0x1008ff19, XF86Mail (без суффикса XK_). Список всех доступных значений в том виде, каком они должны использоваться найдешь в /usr/share/X11/XKeysymDB. Вот перечень некоторых названий:
• XF86AudioLowerVolume — уменьшить звук;
• XF86AudioRaiseVolume — увеличить звук;
• XF86Search — поиск;
• XF86Standby — режим ожидания;
• XF86AudioMute — выключить звук ;
• XF86AudioPlay — играть дорожку в аудиопроигрывателе;
• XF86AudioStop — остановить проигрывание;
• XF86HomePage — запустить браузер;
• XF86Mail — запустить почтовый клиент;
• XF86AudioNext — следующая дорожка;
• XF86AudioPrev — предыдущая дорожка;
• XF86Back — на одну страницу назад в браузере;
• XF86Forward — на одну страницу вперед в браузере;
• XF86Stop — остановить загрузку страницы;
• XF86Favorites — любимые страницы;
• XF86Refresh — перезагрузить страничку;
• XF86AudioMedia — запуск проигрывателя;
• XF86Calculator — калькулятор
• XF86Sleep — спящий режим;
• XF86WakeUp — проснуться.
Составить свой вариант раскладки можно несколькими способами: создать описание своей клавиатуры или использовать Xmodmap. Последний способ самый простой, поэтому о нем и будем говорить дальше. В домашнем каталоге пользователя создаем файл .Xmodmap в который и заносим все нужные значения.
$ mcedit ~/. Xmodmap
keycode 174 XF86AudioLowerVolume
keycode 176 XF86AudioRaiseVolume
keycode 162 XF86AudioPause
Итак далее, принцип думаю ясен. Причем код клавиш можно заносить как в десятичном, так и шестнадцатеричном виде. По моим наблюдениям коды большинства клавиш стандартизированы. Поэтому если один раз настроить реакцию на нажатие клавиши и перенести файл на другой комп, есть вероятность, что на другой клаве реакция на нажатие подписанной также клавиши будет аналогичное. Пользователи рабочего стола Gnome с GDM могут прописать все эти строки в общесистемный файл /etc/X11/Xmodmap.
В других случаях нам нужно еще указать X-серверу, чтобы он использовал созданный файл. В разных дистрибутивах это реализовано по-разному, основная идея выглядит в запуске такой команды «/usr/bin/xmodmap $HOME/.Xmodmap» при входе пользователя в систему или старте Х, тут уж каждый делает, как хочет. В некоторых советах предлагают для этой цели использовать файл $HOME/.xsession, в некоторых дистрибутивах он может называться .Xsession, .xprofile или системный /etc/X11/Xsession. И боюсь, что это далеко не все возможные варианты. Но разработчики зря свой хлеб не едят, и как правило все уже придумано за нас, нужно просто уметь его найти. Посмотрим, как это реализовано в KUbuntu.
$ sudo grep -iR xmodmap /etc
В результате находим прелюбопытнейший файл /etc/X11/Xsession.d/80ubuntu-xmodmap, такого содержания:
$ cat /etc/X11/Xsession.d/80ubuntu-xmodmap
/usr/bin/xmodmap /usr/share/apps/kxkb/ubuntu.xmodmap || true
USRMODMAP=»$HOME/.Xmodmap»
if [ -x /usr/bin/xmodmap ]; then
if [ -f «$USRMODMAP» ]; then
/usr/bin/xmodmap «$USRMODMAP» || true
fi
fi
То есть загружается содержимое файла ubuntu.xmodmap и если есть, то и пользовательский .Xmodmap. Открыв в редакторе ubuntu.xmodmap обнаруживаем список keycode и сопоставленных им символьных имен.
Это ссылка на готовый файл ubuntu.xmodmap 🙂
Отсюда можно сделать вывод, если разработчик сообщает о том, что его дистрибутив поддерживает мультимедийные клавиатуры, то можно с большой долей вероятности найти подобный файл. В других дистрибутивах также есть подобная система запуска пользовательских xmodmap файлов.
Теперь когда символьные имена клавишам присвоены, можно назначать им любые желаемые действия. Некоторые оконные среды вроде KDE умеют отрабатывать действия по символьным именам, так при нажатии кнопки с XF86AudioPlay начинает воспроизведение проигрыватель, используемый по умолчанию. Если есть желание достаточно зайти в Центр Управления KDE — Региональные и специальные возможности — Комбинации клавиш (в KUbuntu ищи в System Setting — Keyboard & Mouse) и устанавливаем нужную комбинацию.
Аналогичный пункт меню есть и в Gnome (можно просто вызвать gnome-keyboard-bindings) и XFce. Плюс некоторые программы, вроде Amarok, Konqueror, MPD и другие также умеют обрабатывать нажатия клавиш. В других средах, не имеющих графических средств настройки, скорее всего, потребуется уже ручное вмешательство в конфигурационные файлы. Например в IceWM чтобы по нажатию клавиши с символьным именем XF86AudioPlay запускался, а при повторном становился на паузу проигрыватель XMMS в файл .icewm образующийся после первого запуска в домашнем каталоге пользователя добавляем строку:
$ mcedit ~/.icewm
key XF86AudioPlay xmms —play-pause
В fluxbox строка в конфигурационном файле, для запуска проигрывателя выглядит так:
$ mcedit ~/.fluxbox/keys
None XF86AudioPlay :ExecCommand xmms —play-pause
С остальными оконными менеджерами подход аналогичен. Кто не хочет возиться используйте графические утилиты для настройки http://www.tux.in.ua/articles/374. Linux forever!
//
Не работает. Выудил значения клавиш, все записал в файл:
keycode 161 XF86Calculator
keycode 231 XF86Refresh
keycode 174 XF86AudioLowerVolume
keycode 176 XF86AudioRaiseVolume
keycode 229 XF86Search
keycode 160 XF86AudioMute
keycode 234 XF86Back
keycode 233 XF86Forward
keycode 232 XF86Stop
keycode 178 XF86HomePage
keycode 164 XF86AudioStop
keycode 162 XF86AudioPlay
keycode 153 XF86AudioNext
keycode 144 XF86AudioPrev
keycode 237 XF86AudioMedia
$ xmodmap $HOME/.Xmodmap
xmodmap: /home/vlas/.Xmodmap:1: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:2: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:3: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:4: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:5: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:6: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:7: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:8: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:9: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:10: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:11: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:12: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:13: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:14: bad keycode command (missing keysym list),
xmodmap: /home/vlas/.Xmodmap:15: bad keycode command (missing keysym list),
xmodmap: 15 errors encountered, aborting.
//
А что xev говорит, он видит клавиши? Кроме того может в файле $HOME/.Xmodmapесть ошибки, например лишние пробелы после записи. Хотя он явно пишет «missing keysym list». Э так правильно
keycode 241 = XF86LaunchB
keycode 205 = XF86LaunchC
keycode 132 = XF86LightBulb
Там же в тексте ссылка есть на файл с Ubuntu.
//
Появился еще вопрос, я использую КДЕ, назначил кнопки, подправил конфиг, запустил xmodmap, все приняло. Но не все клавиши работают, из 20 клавиш работают только 3 :): konqueror: Вперед\Назад\обновить.
//
Так нужно нажать xev и посмотреть кож клавиши и указать соответствие, если его нет, плюс в центре управления настроить реакцию.
//
Так, спасибо, почти все настроил, последние вопросы (надеюсь):
1. Не работают клавиши Mute, VolUP, VolDOWN (как управлять микшером?)
2. можно ли как-то кнопки управления медиаплеером (вперед, назад, стоп, пауза\играть) подружить с audacious?
//
1. Принцип тот же у меня же работают.
2. Можно наверное, я амароком сейчас пользуюсь, поэтому ничего не могу пока сказать, но по идее KDE должен сам отрабатывать некоторые команды.
//
Кнопки описаны так:
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume
keycode 160 = XF86AudioMute
система на них реагирует, но звук все равно никак не изменяется, в Кcontrol’e параметров отвечающих за микшер я не увидел..
//
audacious прикрутил через audtool, но вот с микшером вопрос открыт
//
В общем спасибо за статью, со всем уже сам разобрался…все настроил
//
Ну и отличненько.
//
заметил одну досадную штуку.. мультимедийные клавиши не работают в играх, в частности в quake, и вообще наверное во всех таких играх..
Permalink