Acpid (Русский)

From ArchWiki
Jump to: navigation, search

Tango-preferences-desktop-locale.pngЭта страница нуждается в сопроводителеTango-preferences-desktop-locale.png

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

Краткое вступление

Многие руководства описывают процесс настройки мультимедийных клавиш с использованием таких программ как xev или keyTouch. Настоящая статья поясняет использование утилиты acpi_listen и создание вашего собственного скрипта для горячих клавиш.

Для кого предназначено данное руководство?

Данный метод предполагает, что сигналы с клавиатуры передаются через acpi. Если вам неизвестно, как это происходит в вашей системе, то полезно обратиться к статьям:

  • Using Multimedia Keys in Linux
  • Hotkeys
  • Extra Keyboard Keys - keyTouch

Установка необходимых инструментов

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

$ sudo pacman -S acpi acpid acpitool

Данная статья рассказывает, какие модули вам необходимо загрузить (например, в /etc/rc.conf или через modprobe).

Использование acpi_listen

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

# acpi_listen

Если при нажатии особой клавиши, например "Следующий" ("Next") или "Предыдущий" ("Previous") на экране появляются строки, похожие на:

hkey VALZ 00000000 00000b31

значит все в порядке и можно продолжать.

Настройка ACPID

Демон ACPI реагирует на события ACPI в соответствии с содержимым файла handler.sh, который находится в /etc/acpi/handler.sh

Вы можете либо редактировать его непосредственно, либо указать в нем другой скрипт (например /etc/acpi/hotkeys.sh)

В файл /etc/acpi/hotkeys.sh нужно добавить следующие строки:

hkey)
:case "$4" in
::00000b31)
::echo "PreviousButton pressed!"
::exailectl p
::;;
:00000b32)
::echo "NextButton pressed!"
::exailectl n
::;;
:00000b33)
::echo "Play/PauseButton pressed!"
::exailectl pp
::echo "executed.."
::;;
:00000b30)
::echo "StopButton pressed!"
::exailectl s
::;;
:*)
::echo "Hotkey Else: $4"
::;;
:esac
:;;

Значения "00000b31" и тому подобные представляют собой ответ, полученный от acpi_listen. "$4" представляет собой последнюю часть строки "hkey VALZ 00000000 00000b31" и различает мультимедийные клавиши.

К тому же можно создать краткий shell-скрипт для управления медиа проигрывателем (на примере Exaile), который назовем exailectl. Так как ACPID запускается от суперпользователя, то вызов Exaile нужно выполнить командой:

$ sudo -u (имя пользователя) exaile

В противном случае acpi не сможет обнаружить нашу плеер, работающий на пользовательском уровне запуска, и воссоздаст другой процесс.

Устаревшее: пример скрипта

Так как keyTouch и другие программы для работы с клавиатурой у меня либо не заработали, либо работали не совсем хорошо, то перед редактированием handler.sh я создал свой скрипт, запускающийся в фоне и непосредственно реагирующий на вывод acpi_listen. Это не совсем правильный способ, так как его работа постоянно нагружала мой ноутбук. Но так или иначе я привожу данный скрипт, поэтому вы можете использовать или изменять его для себя, а также добавлять свои предложения по его улучшению. Он создан для ноутбука Toshiba Satellite A50 и управляет плеером Exaile, но его легко изменить для управления Amarok, Xine или даже приспособить для немультимедийных программ.

export STOP_MYHOTKEY=0
i=`acpi_listen -c 1`
case "$i"
in
:"hkey VALZ 00000000 00000b31")
::#echo "PREVIOUS"
::exaile -p
::;;
:"hkey VALZ 00000000 00000b32")
::#echo "NEXT"
::exaile -n
::;;
:"hkey VALZ 00000000 00000b33")
::exaile -t
::;;
:"hkey VALZ 00000000 00000b30")
::#echo "STOP"
::exaile -s
::;;
:*)
::#echo "ELSE: $i"
::;;
esac
e=`echo $STOP_MYHOTKEY`
if [ "$e" != "1" ]
then
:./myHotkey.sh &
fi

Указание: скрипт необязательно запускать из-под суперпользователя, если вы можете получать ответ acpi_listen из-под обычного пользовательского аккаунта (снова подразумевается, что для него возможен доступ к устройствам ввода).