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

От Perlovka. 2007-07-24 04:07:10

Это руководство описывает процесс настройки системы для работы с мультимедийными клавиатурами.

Введение

Когда на клавиатуре нажата клавиша, ядро генерирует скан-код (raw scancode), который может быть приведен в соответствие с кодом клавиши (keycode). Оконная система X имеет собственную таблицу кодов клавиш. Она читает таблицу соответствия кодов клавиш ядра, и потом преобразует ее для своих нужд. В системе X каждый код клавиши может быть приведен в соответствие с ключевой суммой, которая является строкой, и которую можно использовать при назначении действий в приложениях.

Определение кода клавиш (keycodes)

Определить код клавиши не так уж и сложно. для начала надо собрать программу xev:

# emerge x11-apps/xev

Запустите программу в X-терминале:

$ xev

Теперь нажмите поочередно на каждую мультимедийную клавишу и обратите внимание на сгенерированные коды клавиш, выглядят они примерно так:

KeyRelease event, serial 31, synthetic NO, window 0x1c00001,
root 0x155, subw 0x0, time 4186870914, (293,307), root:(716,599),
state 0x10, keycode 185 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes: 
XFilterEvent returns: False

Если все в порядке, и xev генерирует коды клавиш, запишите код каждой клавиши и переходите к разделу Настройка Xmodmap. Если же xev не может определить код клавиши, мы вынуждены будем найти ее скан-код.

Нахождение скан-кода клавиш

Данный метод справедлив только для PS/2 клавиатур

Нажмите клавишу, для которой xev не смог сгенерировать код, и введите в терминале следующую команду:

$ dmesg | tail -n 2

Вы увидите ответ ядра на нажатие неизвестной ему клавиши. Выглядит это примерно так:

atkbd.c: Unknown key released (translated set 2, code 0x96 on isa0060/serio0).
atkbd.c: Use 'setkeycodes e016 <keycode>' to make it known.

Теперь надо дополнить таблицу соответствия кодов клавиш ядра. Но тут есть одна загвоздка. Из-за несоответствия таблиц кодов клавиш ядра и оконной системы X, введенный нами код клавиши будет в X-ах совсем другим. Может случиться, что он совпадет с уже существующим кодом, и мы получим две одинаковые кнопки. Для этого был написан скрипт приведения кодов клавиш в соответствие с оконной системой X. Загрузите его в свою папку пользователя и сделайте выполнимым:

$ chmod +x ~/scan2key.sh

Пользоваться скриптом очень просто, скормите ему значения скан-кодов клавиш (через пробел), и он выведет вам список команд для назначения кодов клавиш:

$ ~/scan2key e016 e01f e02d
setkeycodes e016 196
setkeycodes e01f 148
setkeycodes e02d 204

Внесите эти команды в файл /etc/conf.d/local.start:

setkeycodes e016 196
setkeycodes e01f 148
setkeycodes e02d 204

Это позволит назначать коды при каждой перезагрузке автоматически. Чтобы назначить коды без перезагрузки, выполните следующую команду от пользователя root:

# sh /etc/conf.d/local.start

Теперь перезапустите X, и проверьте, что xev определяет коды клавиш.

Настройка Xmodmap

Все, что нам осталось сделать - это назначить кодам клавиш ключевые суммы. Создайте файл .Xmodmap в папке пользователя:

$ touch ~/.Xmodmap

Синтаксис файла довольно прост:

keycode 162 = XF86AudioPlay
keycode 164 = XF86AudioStop
keycode 160 = XF86AudioMute
keycode 144 = XF86AudioPrev
keycode 153 = XF86AudioNext
keycode 176 = XF86AudioRaiseVolume
keycode 174 = XF86AudioLowerVolume

Возможные ключевые суммы можно посмотреть в файле /usr/share/X11/XKeysymDB:

XF86AudioLowerVolume    :1008FF11
XF86AudioMute           :1008FF12
XF86AudioRaiseVolume    :1008FF13
XF86AudioPlay           :1008FF14
XF86AudioStop           :1008FF15
XF86AudioPrev           :1008FF16
XF86AudioNext           :1008FF17

И настроим запуск xmodmap при входе в сеанс пользователя. Обычно это делается в файле ~/.xsession или ~/.xprofile:

/usr/X11R6/bin/xmodmap $HOME/.Xmodmap

Чтобы не перезапускать X, можно выполнить эту команду в терминале.

Теперь ваши клавиши имеют соответствующие ключевые суммы, которые можно применять в программах, например, вызов Audacious в fvwm:

Key XF86AudioMedia        A N  Exec exec audacious