Система Orphus
[]

среда, 9 сентября 2009 г.

Настройка Fn-клавиш в Ubuntu на примере ASUS M50Vc

Эх... Давненько я ничего не писал... Надо исправляться :)
В этом посте хочу рассказать о том как настроить хоткеи типа Fn+F1 и т.д. на ноуте в ubuntu, но это так же справедливо для любого другого дистрибутива linux/bsd (уверен, хотя не проверял).

Вступление или как все начиналось...
Тут пойдет не большая история моего знакомства с linux. Если тебе это не интересно, можешь смело переходить к следующему "разделу".
Свой первый ноут, Acer Aspire 5560, я купил (30 августа 2006 года) еще тогда, когда был поклонником форточек. Там все работало без проблем. Но в апреле прошлого года я поставил перед собой задачу перейти на linux во что бы то ни стало. Перебрав с 2 десятка дистрибутив, мой выбор пал на Ubuntu 8.04 Desktop. Причина была банальна, wifi работал "из коробки" и дрова на видяху встали без проблем. Да-да, тогда я еще не знал как самому настроить этот самый wifi (ну и дрова тоже). Но ни в одном дистре у меня не хотели работать Fn клавиши :(
В августе этого года я решил сменить ноут на ASUS M50Vc, но и тут Fn клавиши не заработали :(
Порывшись в гугле и вдоволь начитавшись про настройку Fn и мультимедиа клавиш через xev и т.п., а так же про перекомпиляцию ядра (например, Gentoo, Slackware) я чуть было не опустил нос...
И вот не так давно просматривая новости в любимом Google Reader'е обратил внимания на пост на Хабре про отключение тачпада (именно этого мне очень не хватало)... Конечно это не то, но... После прочтения этой статьи меня осенило (даже не знаю почему), что Fn-клавиши привязаны к BIOS (на этапе загрузки ноута (POST) и когда находишься в BIOS они же работают, например Fn+F7 выкл/вкл подсветку дисплея), а значит они должны обрабатываться через ACPI. Я еще не был уверен, что нашел решение, но поспешил проверить свои догадки и оказалось, что я не ошибся :)

Подготовка и "комментарии"
В ubuntu все необходимые нам пакеты ставятся "из коробки", в других дистрибутивах, возможно, придется их поставить/скомпилировать самостоятельно. Скажу сразу, этот метод должен подойти для любого ноута и дистрибутива linux, т.ж., думаю, это будет работать и в *BSD системах.
И так. Ставим пакеты (названия пакетов взяты из ubuntu) acpid и acpi-support (так же не помешают acpi и acpitool), если они еще не стоят. В ubuntu это делается так:
$ sudo aptitude install acpid acpi-support acpi acpitool
Поясню коротко для чего какой пакет.
acpid - сам acpi-демон, который обрабатывает acpi-события;
acpi-support - этот пакет ставит в систему файлы обработчики событий, т.е. правила реагирования на acpi-события, и скрипты, которые вызываются файлами-обработчиками при наступлении какого-либо события;
acpi и acpitool - это дополнительне утилиты, которые показывают различную информацию полученную через acpi.
Не смотря на то, что стоит пакет acpi-support все же не все клавиши работают. У меня на ASUS'е (на Acer'е уже не помню) работают "из коробки" только:
Fn+F2 - wifi и bluetooth (мне не понравилось поведение и я перенастроил его, но об этом в след. посте);
Fn+F{5..6} - яркость подсветки дисплея;
Fn+F7 - вкл/выкл подсветку дисплея;
Fn+F{10..12} - управление громкостью;
Fn+{Up,Down,Left,Right} - стоп, плей/пауза, вперед, назад;
переключатель на передней панели - вкл/выкл wifi и bluetooth;
Power - кнопка вкл/выкл ноута;
LID - крышка ноута.
Но еще есть Fn+F{1,3..4,8..9} и Fn+{A,T,C,V,Space}, которые не работали из коробки, а это уже не порядок.
На этом подготовка закончена. Переходим к...

Отлов событий
Нужные пакеты уже стоят, а значит пора действовать. "Набиваем" в любимой консольке:
$ acpi_listen
hotkey ATKD 00000051 00000000
hotkey ATKD 00000051 00000001
и тыкаем Fn клавиши, а когда натыкаемся жмем Ctrl+C :) В этом примере я 2 раза нажал Fn+F4 (вызов браузера). Что означает вывод? А вот что:
первые два слова - тип события;
третье - номер события;
четвертое - порядковый номер нажатия на эту клавишу (это нам не нужно).
Все номера событий для ASUS M50Vc с комментариями.

Поиск файлов-обработчиков событий и разбор их работы
Идем в каталог /etc/acpi/events/ и грепаем. Например, для того чтобы узнать какой файл-обработчик события отвечает за нажатие клавиши Fn+F4 выполняем:
$ grep 00000051 /etc/acpi/events/*
asus-internet:event=hotkey (ATKD|HOTK) 00000051
Перед двоеточием (:) указано имя файла-обработчика, а после - найденная строка. Давай теперь посмотрим содержимое этого файла:
$ grep -vE '^$|^#' /etc/acpi/events/asus-internet
event=hotkey (ATKD|HOTK) 00000051
action=/etc/acpi/webbtn.sh
Тут первая строка описывает событие, которое нужно отлавливать, а вторая говорит демону acpid какой скрипт нужно выполнить. Теперь глянем что это за скрипт:
$ grep -vE '^$' /etc/acpi/webbtn.sh
#!/bin/sh
test -f /usr/share/acpi-support/key-constants || exit 0
. /usr/share/acpi-support/key-constants
acpi_fakekey $KEY_WWW
Как видим, данный скрипт проверяет наличие файла и если его нет завершает свою работу иначе читает его (там переменные с кодами клавиш), вызывает утилиту acpi_fakekey (из пакета acpid) и передает ей в качестве параметра код клавиши 150 ($KEY_WWW). Утилита acpi_fakekey эмулирует нажатие клавиши на клавиатуре, код которой ей передали.
Вот и все. Как видишь ничего сложного :)

Простейший пример настройки Fn-клавиш
Давай для примера сделаем так, чтобы при нажатии клавиши Fn+F4 у нас запускался гномовский калькулятор (нумерация добавлена для удобства ссылок на строки кода):
1. $ grep 00000051 /etc/acpi/events/*
/etc/acpi/events/asus-internet:event=hotkey (ATKD|HOTK) 00000051
2. $ grep action /etc/acpi/events/asus-internet
action=/etc/acpi/webbtn.sh
3. $ sudo sed -ei 's/^acpi_fakekey.*/#acpi_fakekey \$KEY_WWW\nacpi_fakekey \$KEY_CALC/' /etc/acpi/webbtn.sh
4. $ ps aux | grep -vE 'grep|ps' | grep calc
5. $ sudo /etc/init.d/acpid restart
* Stopping ACPI services... [ OK ]
* Loading ACPI modules... [ OK ]
* Starting ACPI services... [ OK ]
6. $ ps aux | grep -vE 'grep|ps' | grep calc
angel    23999 10.1  0.5  32132 16360 ?        S    16:59   0:00 gcalctool
Что же мы тут наделали?.. Давай разбираться :) В первом шаге мы определяем какой файл-обработчик события отвечает за нажатие на клавишу Fn+F4, потом (шаг 2) заглядываем в этот файл-обработчик, чтобы узнать какой скрипт выполняется при нажатии Fn+F4. На шаге 3 мы изменяем скрипт, который выполняется при нажатии Fn+F4, а именно комментируем строку "acpi_fakekey $KEY_WWW" и под ней добавляем строку "acpi_fakekey $KEY_CALC", что заставляет клавишу Fn+F4 работать как кнопку вызова калькулятора (на некоторых мультимедиа клавах такие кнопки есть). Теперь нажми Fn+F4. Ничего не работает? Вот и у меня тоже, для этого я и выполнил команду из шага 4, чтобы убедиться, что калькулятор не запустился (вдруг в фоне повис). Дело в том, что надо перезапустить демона acpid, что мы и делаем в шаге 5. Ну а теперь снова жмем Fn+F4 и радуемся (шаг 6 показывает, что калькулятор запустился).

Заключение или я еще не прощаюсь ;)
В этом посте показано, как можно настраивать Fn-клавиши на ноуте. Хоть настройка и производилась в ubuntu на ASUS'е M50Vc, но я уверен, что описанный здесь подход подойдет для любого ноута и linux/bsd системы. Также в этом посте был показан простейший пример (пере)настройки Fn-клавиш.
В следующем посте расскажу как я настроил для себя клавиши Fn+F{2,9} и переключатель на лицевой панели ноута; при этом сделал так, чтобы система запоминала состояние этих клавиш и после перезагрузки восстанавливала их, т.е., например, если тачпад был выключен, то и после перезагрузки он будет выключен.




Информация с сайта http://angel2s2.blogspot.com/.

Похожие статьи

13 коммент.:

tkachenkosi комментирует... пятница, 30 апреля 2010 г., 14:57:00 GMT+3

Воспользовался вашей статьей - помогла. Спасибо. (Ставлю ubuntu сервер)

Angel 2S2 комментирует... пятница, 30 апреля 2010 г., 15:00:00 GMT+3

Рад за вас :))

Анонимный комментирует... вторник, 13 сентября 2011 г., 0:59:00 GMT+3

А что делать если acpi_listen не реагирует на некоторые сочетания?

Angel2S2 комментирует... вторник, 13 сентября 2011 г., 9:10:00 GMT+3

А что за сочетания? Какой ноут (марка и модель)?
Возможно в модуле ядра для вашего ноута нет поддержки некоторых сочетаний.

Анонимный комментирует... воскресенье, 18 сентября 2011 г., 12:41:00 GMT+3

у меня проблемка немного обратного типа...клавиша ФН используеться , что бы функциональные клавиши работали как обычно. То есть, мне не нжуно нажимаьть Ф3 и ФН,чтоб яркость(например) больше сделать, для этого достаточно нажать просто Ф4. А вот для того , чтоб клавиша функционировала как обычно, нужно нажимать ФН. Вроде, ерунда , кажеться, но изрядно напрягает. Хотелось бы , чтоб все было наоборот, это возможо?

Angel2S2 комментирует... понедельник, 19 сентября 2011 г., 9:01:00 GMT+3

Т.е. если я верно вас понял, у вас Fx клавиши работают как на макбуках?..
Я такие ноуты ни разу не встречал, к сожалению. Поэтому даже не знаю, что тут подсказать.
Но, на сколько помню, где-то слышал краем уха, что обычно у таких ноутов есть настройка, кажется, в BIOS, которая позволяет отключить такой режим поведения.

Анонимный комментирует... понедельник, 19 сентября 2011 г., 14:56:00 GMT+3

Да, верно поняли. Модель ноутбкука HP - G62-b51SR. В любом случае спасибо за ответ. Буду обращаться к специалистам, а то самому стремно с БИОСом разбираться:)

Анонимный комментирует... воскресенье, 19 февраля 2012 г., 17:35:00 GMT+3

А что делать если acpi_listen не реагирует на некоторые сочетания?
Fn+F6 выключает touchpad, но acpi_listen молчит как партизан на допросе. А так хотелось к этому событию прикрутить свой скрипт (((

Roman Shagrov комментирует... понедельник, 20 февраля 2012 г., 9:10:00 GMT+3

В некоторых ноутах отключение тачпада является аппаратным, хотя в них обычно кнопка находится рядом с тачпадом. Такое же есть и для экрана.

Ксюша комментирует... понедельник, 26 сентября 2016 г., 0:22:00 GMT+2

О, интересно! И мне прямо в тему. Сейчас настраиваю малыша Asus EEE Surf. Не действует управление звуком через Fn+F7/F8. При ближайшем рассмотрении оказалось, что по пути /etc/acpi/events отсутствуют нужные файлы, и соответств. скриптов тоже нет (при том что acpi_listen эти комбинации слышит). Придется, стало быть, создавать. Для начала посмотрю на другом ноуте. Если не удастся воспользоваться, предстоит брать за образец имеющееся здесь... Цирк, конечно, но вдруг? Если что получится, отпишусь.

Unknown комментирует... вторник, 5 сентября 2017 г., 14:24:00 GMT+2

SOS. У меня grep не находит в каталоге /etc/acpi/events/ номер никакого события из acpi_listen

Roma Shagrov комментирует... вторник, 5 сентября 2017 г., 15:35:00 GMT+2

Пакеты acpid acpi-support acpi acpitool стоят?
Может в этом каталоге и вовсе ничего нету.
8 прошло, я ноут уже поменял, проверить негде.

Отправить комментарий