Журнал LinuxFormat - перейти на главную

LXF118:keyboard

Материал из Linuxformat
Перейти к: навигация, поиск
В одно касание Пусть мультимедийная клавиатура работает вплоть до последней кнопки

Содержание

X: Задействуем спецклавиши

Если вы – не фанат Emacs, то наверняка не в восторге от заучивания «горячих клавиш». А вот Алексей Маслий решает большинство задач нажатием на одну кнопку.

Как-то раз друзья подарили мне на день рождения новую клавиатуру Genius, на которой помимо ста с хвостиком обычных клавиш было аж 36 дополнительных мультимедийных. Едва ли я – единственный обладатель такого устройства, предпочитающий использовать Linux, но компания-производитель решила, что потенциального покупателя вполне устроит поддержка Windows и Mac OS X. Подобную ситуацию вряд ли можно назвать уникальной; тем не менее, опыт свидетельствует, что большую часть периферии можно заставить работать и в открытой ОС, если приложить немного старания. Что с того, что на прилагаемом диске нет заветных .tar.gz файлов и настроечных скриптов? На то оно и свободное ПО, чтобы мы могли добавить их самостоятельно!

Я буду ориентироваться на openSUSE и KDE 3.x, хотя описанные ниже утилиты должны работать в любом дистрибутиве Linux – возможно, с небольшими вариациями (если что-то идет не так, почитайте справочные страницы по командам). Мы будем иметь в виду стандартные клавиатуры PS/2 (ситуация с USB клавиатурами несколько хуже в том плане что соответствующий модуль ядра не обрабатывает неизвестные сканкоды клавиш, но уж если клавиша определяется ядром то все остальнео аналогично), но процедура остается той же самой и для ноутбуков. Решение задачи подразделяется на две части: определение дополнительных клавиш и настройку действий, выполняемых по их нажатию.

А в чем проблема?

Прежде чем приступить к работе, неплохо бы выяснить, а нужно ли вообще что-то делать. Мультимедиа-клавиатуры в ходу уже давно, и даже если вашей модели нет в списке поддерживаемых, можно подобрать такой вариант, в котором будут работать если не все, то большинство специальных клавиш. Запустите Центр управления KDE (в разных системах он называется по-разному: в Ubuntu, например, это Системные настройки, а в openSUSE – Настройки рабочего стола, в любом случае чтобы долго не искать можно нажать Alt+F2 и ввести kcontrol). Откройте Региональные настройки и язык, и перейдите к пункту Раскладка клавиатуры. Во вкладке Раскладка есть выпадающее меню Модель клавиатуры, где перечислены все модели клавиатур, поддерживаемые системой Х Window вашего дистрибутива (к сожалению в настоящий момент уже не все). После ряда экспериментов я остановился на Genius Comfy KB-21 e-scroll. Из трех мультимедиа-клавиатур (производства Genius и Defender), оказавшихся у меня под рукой, на одной заработали сразу все спецклавиши, на другой не заработали три, а на третьей, подаренной – 16 из 36: многовато, но все же лучше, чем ничего.

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

KeyPress event, serial 28, synthetic NO, window 0x3600001,
 root 0x45, subw 0x0, time 3139172, (349,690), root:(352,714),
 state 0x0, keycode 205 (keysym 0x1008ff4c, XF86LaunchC),same_screen YES,
 XLookupString gives 0 bytes:
 XmbLookupString gives 0 bytes:
 XFilterEvent returns: False
KeyRelease event, serial 28, synthetic NO, window 0x3600001,
 root 0x45, subw 0x0, time 3139172, (349,690), root:(352,714),
 state 0x0, keycode 205 (keysym 0x1008ff4c, XF86LaunchC), same_screen YES,
 XLookupString gives 0 bytes:
 XFilterEvent returns: False

Первый блок записей сообщает, что кнопка была нажата, второй – что отпущена. В каждом блоке нас интересует третья строчка, начинающаяся со state 0x0; далее идут три параметра keycode и, в скобках, keysym и keysymname. Когда определены все три значения, такой клавише можно просто назначить действие в Центре управления KDE – среда знает ее и понимает. Если указан только keycode, это означает, что клавишу необходимо определить в базе X Window. И наконец, если по нажатию на кнопку не происходит вообще ничего, системе она не известна.

Если все мультимедиа-клавиши на вашей клавиатуре – первого типа, вам повезло: можете сразу же переходить к разделу «Время действовать». В двух других случаях необходимо пройти подготовительный этап (и вот тут как раз весьма вероятны проблемы с USB клавиатурами).

Эти незнакомые кнопки

Начнем с самого сложного случая – клавиша неизвестна системе как таковая. Вы наверняка знаете, что каждая кнопка передает при нажатии компьютеру свой скан-код (scancode) – уникальный идентификатор. Аналогичная процедура происходит и при отпускании. Система получает скан-код и ставит ему в соответствие код клавиши (keycode). Возникает вопрос: а для чего такие сложности, если можно использовать скан-код напрямую? Данный подход, например, позволяет легко переключать раскладку клавиатуры, просто переопределив keycode для скан-кодов алфавитных клавиш. Есть и другие причины, связанные с различным типом клавиатур в Unix-системах, а также с тем, что пользователь в итоге может сам определять действия по нажатию той или иной кнопки.

Итак, наша первая задача – узнать скан-коды клавиш, на которые не отреагировал xev. Нажмите их еще раз по очереди, проглядывая сообщения ядра в выводе утилиты dmesg. Каждой неизвестной клавише в нем соответствуют две строки примерно такого вида:

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

Модуль atkbd, обслуживающий клавиатуры PS/2, не только сообщает скан-код клавиши, но и любезно говорит, что нужно сделать для того, чтобы он стал известен системе. Теперь для каждого скан-кода необходимо задать свой уникальный код клавиши. Для этого нам потребуются права суперпользователя, поскольку мы собираемся вносить изменения в системную раскладку клавиатуры.

Назначением соответствия между скан-кодом и кодом клавиши занимается программа setkeycodes, принимающая в качестве параметра пары «scancode keycode»; таких пар можно задать сколько угодно. Удобно написать скрипт, каждый вызов setkeycodes в котором будет определять одну клавишу, и снабдить его комментариями, поясняющими, какую именно клавишу определяет та или иная команда. Например:

#!/bin/bash
# Messenger
setkeycodes e03d 217
...

Вы можете спросить: а как узнать, какие коды клавиш свободны, а какие – заняты? Первые 110 кодов гарантированно используются системой, а все дополнительные клавиши имеют коды от 110 до 256.

Переключитесь в текстовую консоль (Ctrl+Alt+F1‑F6). Это нужно сделать, поскольку X Window перехватывает клавиатурный ввод и транслирует его, так что можно получить неверные данные. Далее есть два пути. Можно запустить программу dumpkeys и проанализировать ее вывод, либо воспользоваться утилитой showkey, которая, в зависимости от параметра, может показать скан-код, код клавиши или ее ASCII-представление. Во втором случае нужно набрать showkey -k и понажимать дополнительные клавиши, записывая все занятые значения keycode.

Программа setkeycodes может присваивать дополнительным клавишам те же значения keycode, что и основным. Например, можно назначить код клавиши F5 (63) мультимедиа-кнопке Refresh. Поскольку в большинстве web-браузеров обновление страницы происходит по нажатию F5 (если пользователем не было задано другое поведение), после этого Refresh будет делать именно то, что на ней написано.

После того как все коды клавиш будут определены и сохранены в скрипте setkeys.sh по подобию описанного выше, его необходимо сделать исполняемым (chmod 755 setkeys.sh). Запустите сценарий от имени суперпользователя: все ранее неизвестные системе клавиши будут определены. Эту процедуру необходимо проделывать после каждой перезагрузки компьютера. Чтобы не выполнять ее вручную, добавьте вызов setkeys.sh в /etc/rc.d/rc.local (при желании можно просто скопировать содержимое setkeys.sh вместе с комментариями в rc-сценарий). Возможно, правильнее было бы отредактировать таблицу трансляции клавиатуры (keymap), но здесь есть опасность, что при обновлении системы содержащий ее пакет будет замещен и ваши изменения, добытые с таким трудом, потеряются.

Xmodmap спешит на помощь

Теперь, когда неизвестных клавиш на клавиатуре не осталось, можно переключаться обратно в Х Window и снова запускать xev. Понажимайте на проблемные кнопки и убедитесь, что xev понимает их. При этом обратите внимание, что значения keycode для них в Х Window, скорее всего, не будут соответствовать тем, что были определены в консоли. Х Window осуществляет свою собственную трансляцию, гарантированно сохраняющую только коды первых 128 клавиш. На данном этапе необходимо переписать keycode всех клавиш, для которых не определены keysym и keysymname, и присвоить им соответствующие значения.

Этим занимается утилита xmodmap. Снова встает вопрос: каким образом выбирать keysym и keysymname? На него есть уже более конкретный ответ: в Х Window зарезервировано значительно больше значений keysym и отвечающих им констант keysymname, чем способна вместить обычная клавиатура. Узнать об этих соответствиях можно, заглянув в /usr/include/X11/XF86Keysym.h или в /usr/share/X11/XKeysymDBman-страницах может быть указано другое расположение), а несколько пар keysym/keysymname для наиболее часто встречающихся клавиш приведены во врезке. Содержимое этих файлов дублирует друг друга, так что воспользоваться можно любым, только следует иметь в виду, что в поле keysym в /usr/share/X11/XKeysymDB содержатся шестнадцатеричные числа, то есть к ним следует добавлять префикс ‘0х’. Логично выбрать такие keysym, для которых keysymname соответствуют обозначениям на дополнительных клавишах: в дальнейшем это принесет пользу. Например, для клавиши, обозначенной на клавиатуре как Messenger, разумно взять keysymname XF86Messenger и соответствующий ему keysym 0х1008FF8E. Пусть для клавиши Messenger xev выдает keycode 228; тогда для ее определения в Х Window следует выполнить команду

xmodmap -e 'keycode 228 = 0x1008FF8E'

Теперь можно запустить xev и, нажав клавишу Messenger, получить вывод:

...
state 0x10, keycode 228 (keysym 0x1008ff8e, XF86Messenger), same_screen YES,
...

Утилита xmodmap предоставляет и альтернативный способ назначения пар keysym/keysymname по keysymname. Выполнение

xmodmap -e 'keycode 228 = XF86Messenger'

приведет к тому же результату, что и предыдущая команда, в чем легко убедиться, опять запустив xev.

Проделайте аналогичную процедуру со всеми остальными мультимедиа-клавишами. Клавиатура будет работать, но вновь – лишь до перезапуска X Window. Согласно man-странице xmodmap, для автоматической загрузки изменений необходимо сохранить их в файле .xmodmaprc в домашнем каталоге пользователя. Иногда упоминается также файл ~/.Xmodmap, но, как показывает практика, ни один из этих способов не дает надежных результатов. Попробуйте, и если это не сработает, создайте в /home/имя_пользователя/.kde/Autostart скрипт, содержащий одну команду:

xmodmap /home/имя_пользователя/.Xmodmap

Содержимое файла .Xmodmap должно быть примерно следующим:

!Messenger
keycode 228 = 0x1008FF8E
...

Восклицательный знак обозначает комментарии. В конце файла обязательно должна быть пустая строка.

Опять этот переключатель!

Вот вроде бы и все, но не тут-то было. Пользователей KDE 3 поджидает совершенно неожиданная проблема, сокрытая в недрах многострадально переключателя раскладок kxkb. Дело в том, что он выполняет команду

setxkbmap -model xxx -layout yyy -variant zzz

то есть при каждом переключении раскладок значение keymap устанавливается в один из стандартных вариантов, и все сделанные пользователем изменения «забываются». Что делать? По-крупному, вариантов здесь два.

  • Определить необходимые нам клавиши в системных файлах раскладки клавиатуры.
  • Отказаться от использования kxkb в пользу других переключателей раскладки, например, xxkb (http://pascal.tsu.ru/other/xxkb/) или KKBSwitch (http://kkbswitch.sourceforge.net/), или вообще родного переключателя раскладки в X Window - xkb.

Первый путь является самым «идеологически верным», ведь текстовые файлы конфигурации появились в Unix именно для того, чтобы пользователи могли легко разбираться в них и вносить изменения. Главным возражением против данного подхода является то, что если система (а точнее сказать, пакеты X Window) будет обновлена, то все изменения (как и в случае выше) будут потеряны, и нам придется «начинать игру сначала». Да и не дело это: ошибки в kxkb надо исправлять в kxkb, а не строить обходные пути. Впрочем, это больная тема, так что не будем затрагивать ее в очередной раз (тем более, что KDE 4 уже вышел).

Наилучшим является второй путь, имеющий массу плюсов (некоторые вообще не понимают, как можно работать в KDE 3, не имея KKBSwitch) и всего один минус: я так и не смог найти ни одного альтернативного переключателя раскладок ни в моем дистрибутиве openSUSE, ни в доступных репозиториях. Пришлось собирать их из исходных текстов – к счастью, для таких маленьких утилит число зависимостей минимально. С другой стороны, если не используются расширения переключателя клавиатуры (типа запоминание раскладки для каждого приложения), то имеет смысл остаться с родным переключателем раскладок xkb и не забивать себе голову.

Коды, коды, коды...

LXF118 73 1.jpg Такая настройка позволит переключаться между окнами не только по Alt-Tab, но и с помощью клавиш прокрутки.

В таблице ниже приведены значения keycode, keysym и keysymname для некоторых наиболее распространенных мультимедийных клавиш. Она будет полезна в том случае, если у вас имеется в наличии клавиатура, на которой перечисленные клавиши отсутствуют, зато присутствуют другие, неизвестные системе. Назначьте им keycode из перечисленных в таблице и используйте в X Window настройки для одной из мультимедиа-клавиатур. Тогда действия по клавишам будут определены автоматически, и непридется возиться с их назначением в X Window.

Клавиша keycode keysym keysymname
Internet (Homepage) 150 0x1008FF18 XF86HomePage
Search 217 0x1008FF1B XF86Search
Mail 155 0x1008FF19 XF86Mail
Forward 159 0x1008FF27 XF86Forward
Backward 158 0x1008FF26 XF86Back
Refresh 173 0x1008FF29 XF86Refresh
Stop 128 0x1008FF28 XF86Stop
Play/Pause 164 0x1008FF14 XF86AudioPlay
AudioStop 166 0x1008FF15 XF86AudioStop
Prev 165 0x1008FF16 XF86AudioPrev
Next 163 0x1008FF17 XF86AudioNext
Volume up 115 0x1008FF11 XF86AudioLowerVolume
Volume down 114 0x1008FF13 XF86AudioRaiseVolume
Mute 113 0x1008FF12 XF86AudioMute
Calculator 140 0x1008FF1D XF86Calculator
Sleep 142 0x1008FF2F XF86Sleep


Время действовать

LXF118 74 1.jpg Как и следовало ожидать, KDE позволяет назначить мультимедиа-клавише практически любое действие: рай для настройщика.

Итак, мы подошли к финалу нашего повествования: мультимедиа-клавиши определены и распознаются X Window. Осталось применить их для каких-нибудь полезных целей: увеличения или уменьшения громкости, запуска web-браузера и так далее. Для этого откройте Центр управления KDE и перейдите все в те же Региональные и специальные возможности. Определение действий производится в разделах Комбинации клавиш и Действия по вводу.

В разделе Комбинации клавиш есть три вкладки. В первой, Схемы привязок, опять же содержится три вкладки: Глобальные привязки, Последовательности привязок и Привязки для приложений. В первых двух вкладках можно определить кнопки и комбинации, которые будут управлять различными аспектами работы kwin - оконного менеджера KDE – переключением рабочих столов, сворачиванием окон и тому подобным. Третья вкладка позволяет определить единые комбинации клавиш для различных действий во всех приложениях KDE (например, Cut, Copy, Paste, Open, Close и так далее). Следует заметить, что все эти настройки будут работать только в приложениях KDE.Другие программы могут иметь для тех же действий свои комбинации клавиш.

Кроме того, есть еще одна приятная возможность, связанная с приложениями KDE: в каждой конкретной программе можно определить свою комбинацию клавиш для какого-то действия, а потом сделать ее глобальной. Например, и в KMix (стандартном микшере KDE), и в Amarok (прекрасном аудиоплеере) можно назначить клавиши, управляющие громкостью звука, при этом уровни будут независимы друг от друга (100% громкости в Amarok будут соответствовать уровню, установленному в общесистемном микшере). Тогда можно выставить громкость микшера большой и уменьшить ее в Amarok, чтобы хорошо слышать системные звуки. Согласен, пример несколько наигран: такого эффекта можно достичь и другими способами. Но, думаю, суть вы уловили.

Последняя вкладка – Привязка для приложений – позволяет назначить клавишу (или комбинацию клавиш) для запуска любого приложения, присутствующего в меню KDE.

LXF118 75 1.jpg Настройки Gnome в области мультимедиа-клавиш смотрятся более бледно, но со своими задачами тоже справляются.

Как же назначить действие по кнопкам? Выберите какой-нибудь пункт из перечня, скажем, Заблокировать сеанс. В нижней части окна есть раздел Клавиша для выбранного действия. Рядом расположены три переключателя (Нет, По умолчанию и Другая) и квадратная кнопка с комбинацией клавиш или словом Нет. Нажмите на нее – появится окно настройки клавиатурных комбинаций. На каждое действие возможно настроить две комбинации клавиш: основную и альтернативную. Активируем окошко интересующей нас комбинации и нажимаем клавишу или комбинацию клавиш – название нажатой клавиши отображается немедленно.

Однако предложенные способы не дают возможности запускать сценарии и программы, не включенные в меню KDE, а также подставлять параметры. Для реализации этой функциональности необходимо войти в раздел Действия по вводу. Он предоставляет замечательные возможности по назначению действий на различные клавиши (и не только): от запуска произвольных программ и скриптов с параметрами, до передачи команд в определенные приложения и активации заданных пользователем окон.

Как вы уже наверняка заметили, этот урок явно тяготеет к KDE; чтобы не быть обвиненными в предвзятости, скажем пару слов и о Gnome. Здесь вам на помощь придет Центр управления Gnome (gnome-control-center), позволяющий назначить отдельным клавишам команды в разделе Личная. Там вы найдете три подраздела: Рабочий стол, Звук и Управление окнами, в которых можно произвести кое-какие настройки.

LXF118 75 2.jpg Sven: тот самый случай, когда старый конь борозды не испортит.

В заключение, тем, кто желает настроить дополнительные клавиши на клавиатуре или дополнительные комбинации клавиш под свои потребности вне зависимости от используемого оконного менеджера и окружения рабочего стола, я бы посоветовал давно не обновлявшуюся, но не ставшую от этого менее замечательной программу Sven (http://sven.linux.kiev.ua/). Она представляет собой простой графический конфигуратор и позволяет легко настроить действия по дополнительным клавишам и клавиатурным комбинациям. Плюс ко всему, программа прекрасно интегрируется в системный лоток Gnome, KDE и IceWM (другие оконные менеджеры я просто не проверял) и имеет некоторые дополнительные функции, например, OSD (On Screen Display) или режим работы в качестве переключателя раскладок клавиатуры. Последнее обстоятельство делает ее применение особенно оправданным в KDE 3. LXF

Дополнительные возможности KDE

KDE по крайней мере в версии 3.5 (и вроде бы в версии 4 тоже, но мне так и не удалось разобраться как там это работает, возможно это была не очень хорошая сборка или за другими проблемами до этой у разработчиков руки не дошли) имеет массу дополнительных возможностей по обеспечению удобства работы за компьютером. Давайте посмотрим что можно сделать с клавиатурой. В качестве примера возьмем калькулятор.

Итак кнопка Калькулятор определена для запуска скажем программы kcalc (или кому что больше нравится). Нажали кнопку - калькулятор запустился. Замечательно! Нажали еще раз - запустился еще один калькулятор, и так далее. В процессе реальной работы часто требуется быстро посчитать что на калькуляторе, вставить результат в другое приложение, снова посчитать. Конечно неудобно каждый раз закрывать окно с калькулятором и потом запускать его снова, также неудобно искать его при помощи Alt+Tab или мышки (особенно если окно калькулятора на другом рабочем столе), и KDE здесь предоставляет прекрасную возможность определить на одну клавишу несколько действий, которые будут выполняться в зависимости от заданных условий.

Рассмотрим что логично было бы определить на примере того же калькулятора. Если ни один экземпляр приложения не запущен, то запустить его, а если уже запущен, то активировать существующий. И сделать это достаточно просто.

Приступим. Запускаем Центр управления KDE, далее выбираем Региональные и специальные > Действия ввода, внизу нажимаем кнопку Создать группу и назовем ее Калькулятор. Внутри группы создадим два действия Активировать калькулятор и Запустить калькулятор. Названия естественно набираются самостоятельно.

LXF118 keyb dop.png Определяем действия, требуется потрудиться, но потом это себя оправдает

Сначала определим действие Запустить калькулятор. Выбираем его, и для каждого действия доступно 4 вкладки Основное, Активаторы, Действия, Условия. Во вкладке Основное определяется название действия, комментарий к нему, тип действия и радиокнопка Отключить. В выпадающем меню Тип действия выберем Основное поскольку в этом случае возможно добавление условий, в отличие от Команда или адрес. На вкладе Активатоы нажимаем кнопку Добавить и в выпадающем списке выбираем Активация комбинацией клавиш, и в появившемся традиционном для KDE окне определяем клавишу Калькулятор.

Далее переключаемся во вкладку Действия снова нажимаем Добавить и выбираем Команда или адрес, в появившемся окошке набираем команду kcalc, жмем OK и переключаемся на вкладку Условия. Наше условие выполнения команды если приложение еще не запущено, поэтому сначала нажав кнопку Добавить выбыраем Не. В списке условий мышкой выбираем только что добавленное Не и снова жмем Добавить. В выпадающем меню выбираем Существующее окно. Сначала появляется окно со списком окон, здесь снова надо надать Добавить и выбрать единственный пункт Простое окно. Появляется дополнительное окно определяющее параметры интересующего нас окна, чтобы долго не думать можно сначала запустить калькулятор, а потом в этом окне нажать Автоопределение. Курсор превратится в крестик которым надо ткнуть в окно калькулятора. Поля в окне определения окна будут заполнены, однако возможно понадобится их подредактировать, также для удобства лучше заполнить поле комментарий.

Итак - первое действие определено и можно сразу нажать кнопку Применить и проверить его в действии. При первом нажатии клавиши Калькулятор запуститься kcalc, повторные нажатия будут игнорироваться. Значит все работает. Приступим ко второй части.

Определим действие Активировать калькулятор. Вкладки Основное и Активаторы заполняются аналогично предыдущему действию. Во вкладке Действия по кнопке Добавить надо выбрать Активировать окно и далее определить параметры окна как уже было описано выше (программа kcalc должна конечно быть запущена, но ведь после первого действия это уже просто). Во вкладке условия добавляется условие Существующее окно и снова определяются те же параметры окна. К сожалению на протяжении определения действия одной клавиши одно и тоже приходится повторять трижды, но зато теперь после нажатия кнопки Применить все должно работать как мы хотим.

Персональные инструменты
купить
подписаться
Яндекс.Метрика