Мультимедийные клавиши ("Учим пингвина понимать мультимедийные клавиши" (С))

Разные проблемы звука, видео, обсуждение разных устройств и т.д.

Модератор: Модераторы разделов

Аватара пользователя
kma21
Сообщения: 874
Статус: Странный экспериментатор...

Мультимедийные клавиши

Сообщение kma21 »

Доброго времени суток! Поставил я на свой EeePC 901 Kubuntu 8.10, а на ней не работают 4-е мультимедийных клавиши. Решил, что это не порядок и надо исправлять. Вот нагуглил статейку.

Код:

Большинство современных клавиатур снабжено мультимедийными клавишами, да и мышки уже имеют от трех до семи кнопок. На диске, идущем в комплекте, и на сайте производителя доступны драйверы и всяческие полезные программы только для Windows. Всем известно, что Linux славится своей возможностью настроить систему под себя, если, конечно, знать, где и что настраивать. Наша задача - научить пингвина работать с дополнительными батонами. Определение скан-кода клавиш Что бы ты там не нажимал на своей клавиатуре, X-серверу и ядру, в общем-то, все равно, что на ней написано или нарисовано. Их интересуют исключительно скан-код кнопки, причем сначала иксы считывают таблицу кодов клавиш ядра, а затем уже код клавиши привязывается к собственной таблице кодов. Если в Windows проблемы настройки мультимедийных клавиш в консоли как таковой не существует, то в Linux приходится отдельно настраивать реакцию на нажатие кнопок в консоли и в 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 ' 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. Смотрим: $ 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. Составить свой вариант раскладки можно двумя способами: создать описание своей клавиатуры или использовать Xmodmap. Последний способ самый простой, поэтому о нем и будем говорить далее. В домашнем каталоге пользователя создаем файл .Xmodmap, в который заносим желаемые значения: $ mcedit ~/. Xmodmap keycode 161 XF86Calculator 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 и сопоставленные символьные имена. Отсюда можно сделать вывод: если разработчик сообщает о том, что его дистрибутив поддерживает мультимедийные клавиатуры, то с большой долей вероятности можно найти подобный файл. В других дистрибутивах присутствует аналогичная система запуска пользовательских 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 В конфигах обычно есть примеры, поэтому с остальными оконными менеджерами, думаю, ты без труда разберешься сам. Настройка реакции в консоли В консоли порядок действий несколько иной. Как ты помнишь, вывод dmesg рекомендовал назначить клавишные коды с помощью команды setkeycodes. Но здесь есть отличия - клавишных команд в консоли не может быть больше 128, следует выбирать значения от 0 до 127: $ setkeycodes 0xec 118 Посмотреть свободные значения можно в файле текущей клавиатурной раскладки. В Ubuntu и всех дистрибутивах, базирующихся на Debian, это обычно /etc/console-setup/boottime.kmap.gz. Если после запуска проблем с клавишами нет, заносим эту строку в один из стартовых скриптов, например в /etc/init.d/rc.local. Теперь осталось задать соответствие клавиши и выполняемого действия. Здесь простор для творчества даже больше, чем в иксах. В keymaps(5) процедура установки соответствия keycode выглядит следующим образом: { plain | } keycode keynumber = keysym Пример: # Переключение консоли на одну назад при нажатии на клавишу с кодом 105 keycode 105 = Decr_Console # Переключение консоли на одну вперед при нажатии на и клавишу с кодом 106 alt keycode 106 = Incr_Console Но можно создавать и свои варианты, указывая команду в переменных: keycode 120 = F100 string F100 = "/sbin/shutdown -h now\n" Другими словами, по нажатии клавиши с кодом 120 будет выполнено действие, указанное в переменной F100; в нашем случае задано выключение компьютера. Вместо F100, естественно, можно использовать любое другое имя. Теперь не менее важная часть - куда все это записывать. В документации и в многочисленных советах предлагается использовать текущий файл консольной раскладки (в моем случае - boottime.kmap.gz). Кстати, это единственный файл описания раскладок, доступный после установки KUbuntu; чтобы увидеть остальные варианты, следует установить пакет console-data. После этого в /usr/share/keymaps/i386/ можно обнаружить несколько подкаталогов с файлами внутри. Но если тебе понадобится перейти на другую раскладку (в Ubuntu и некоторых других дистрибутивах для этих целей используется файл /etc/default/console-setup или ~/.console-setup), все настройки нужно будет перенести в другой файл, что несколько неудобно. Если ты все-таки решишься на этот шаг, используй имеющиеся записи как шаблон, ничего не записывая на первую позицию, а в конце не забудь оставить пустую строку. Немного о ноутбуке Пока мне не попадался ноутбук, скан-коды клавиш которого определить не удалось бы. Поэтому настройки здесь ничем не отличаются от описанных выше. Хотя есть один прием, о котором хотелось бы рассказать. Я считаю очень удобным в использовании режим гибернации, когда, включив компьютер, обнаруживаешь все на своих местах. Современные дистрибутивы, как правило, его поддерживают, хотя настройка, в общем-то, несложна - достаточно установить пакет hibernate и переопределить необходимые параметры в конфигурационном файле. Единственное, каждый раз для перехода в этот режим нужно запускать скрипт /usr/sbin/hibernate, что не всегда удобно. Хочется просто закрыть крышку ноутбука, а вновь включив питание, обнаружить все на своих местах. Это очень просто сделать, используя демон acpid, который представляет собой нечто вроде пользовательского интерфейса, позволяющего управлять любыми событиями ACPI, доступными через /proc/acpi/event. При этом acpid читает набор конфигурационных файлов из каталога /etc/acpi/events/. Если пакет с демоном в дистрибутиве отсутствует, устанавливаем его из репозитария; последнюю версию можно взять с сайта phobos.fs.tum.de/acpi. После установки необходимо в каталоге /etc/acpi/events создать два файла: lid и power. Первый описывает реакцию на закрытие крышки, второй - на нажатие кнопки включения питания. $ sudo mcedit /etc/acpi/events/lid event=button/lid.* action=/usr/sbin/hibernate $ sudo mcedit /etc/acpi/events/power event=button/power.* action=/sbin/shutdown -h now Это несколько упрощенные варианты, в KUbuntu ты найдешь более сложные скрипты. После этого требуется перезапуск демона acpid: $ sudo /etc/init.d/acpid restart Теперь при закрытии крышки ноутбука система будет впадать в спячку с выключенным питанием, а при нажатии на кнопку питания - выключаться. Просто и удобно. Программы настройки Если тебе не по душе возня с конфигурационными файлами, предлагаю несколько программ, которые помогут настроить работу мультимедийных клавиш. Например, первоначальное назначение программы Sven (sven.linux.kiev.ua) - настройка дополнительных клавиш на мультимедийной клавиатуре, но, начиная с версии 0.4, она умеет исправлять ошибки при наборе текста и изменять клавиатурную раскладку. Более того, даже если у тебя обычная клава, с ее помощью ты сможешь эмулировать мультимедиа-клавиши, использовав вместо них клавиатурные сочетания. Также можно назначить действия на определенные кнопки мыши. Она понимает приблизительно 10 000 русских слов и 9 500 английских. Если программа не переключилась сама, то раскладку можно изменить и вручную, при помощи специально заданной клавиши (по умолчанию Break). Отдельной клавишей (Scroll Lock) можно изменять регистр слов (верхний, нижний, первая буква - верхний, остальные - нижний). Индикатор-переключатель раскладки клавиатуры запоминает свое состояние для каждого окна, поэтому, часто переключаясь между приложениями, тебе уже не нужно будет дополнительно изменять и раскладку. Программа имеет большие возможности, и я бы советовал на нее взглянуть. Все настройки производятся при помощи графической программы, построенной на библиотеках GTK+. Sven тестировался в Linux, но в принципе должен работать и на *BSD-системах. Используемый оконный менеджер не имеет значения. Возможности KeyTouch (keytouch.sf.net) несколько скромнее, эта утилита применяется исключительно для настройки мультимедийных клавиш. Хотя с ее помощью любой клавише можно назначить свое действие, отличающееся от установок по умолчанию. На сайте программы, кроме исходных текстов и пакетов для некоторых дистрибутивов, можно найти готовые настройки для мультимедийных клавиатур большинства известных производителей. Еще одно интересное решение - xbindkeys (hocwp.free.fr/xbindkeys/xbindkeys.html) - позволяет присваивать любой кнопке клавиатуры и мышки любые команды, в том числе и команды оболочки. Все настройки производятся в конфигурационном файле, который имеет простой и понятный формат.


От себя скажу, что ещЁ не пробовал, сейчас буду пробовать.
З.Ы. Источник _http://www.cyberinfo.ru/index.php?newsid=15471
Спасибо сказали:
Аватара пользователя
Juliette
Сообщения: 5058
Статус: ROSA Lab
ОС: Ubuntu LTS, Mandriva 2011

Re: Мультимедийные клавиши

Сообщение Juliette »

Форум "проекты нашего форума", как всё-таки должно быть понятно из названия, подразумевает, что тут выкладываются интрересные проекты, разработанные и реализованные самими пользователями форума, то есть форумчанами. Посему перекидываю вас в "мультимедию". Ну и всё-таки неплохо бы опробовать для начала у себя, а то совсем не труъ как-то, покольку статеек на развалах тырнета бессчётное количество, также как и программок для работы мультимедийных клавиш под Линуксом :)
Спасибо сказали: