LXF118:keyboard

Материал из Linuxformat.

Версия от 13:23, 1 марта 2010; Crazy Rebel (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
В одно касание Пусть мультимедийная клавиатура работает вплоть до последней кнопки

Содержание

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 и не забивать себе голову.

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

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

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

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

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

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

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

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

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

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

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию