acpid-2.0.14 – решение проблемы кнопки Power на клавиатуре

В последних ветках ядра исчезла поддержка /proc/acpi/event , что имело двоякий результат:
1) С одной стороны, acpid, который умеет получать данные не только по этому каналу, начал получать события от оставшихся устройств ввода, в результате чего заработали кнопки Power и Sleep на клавиатуре.
2) С другой стороны, исчезла какая-либо разница между нажатием на кнопку Power на клавиатуре и на корпусе, что сделало невозможным избирательное отключение или переназначение соответствующей клавиши на клавиатуре, которую на многих клавиатурах слишком легко нажать случайно.

Анализ событий клавиатуры и кода acpid показал, что этот демон обрабатывал сообщения клавиатуры несколько упрощённо, что стирало разницу, которая состояла в дополнительном событии со скан-кодом клавиши, которое отсутствует у кнопки на корпусе.

Я написал об этом разработчику acpid, и неделю назад получил ответ с вложенным исходником промежуточной версии, в которой он эту проблему благополучно решил – теперь все события клавиатуры (то есть для которых передаётся скан-код клавиши) помечаются на выходе acpid буквой K:
# acpi_listen 
button/power PBTN 00000080 00000000
button/power PBTN 00000080 00000000 K
button/sleep SBTN 00000080 00000000 K
Здесь первая строчка – нажатие кнопки на корпусе, а дальше идут две кнопки с клавиатуры.

Сегодня наконец вышел релиз acpid-2.0.14, в который это включено.
Я уже отметил пакет acpid-2.0.13 в репозитории как устаревший и надеюсь, что в скором времени он будет обновлён.
Ну вот, и года не прошло, acpid-2.0.14 уже в репозиториях Арч.

Теперь (если ядро 3.1 и выше, и/или /proc/acpi/events больше нет) можно делать примерно так:
Пишем общий acpid-файл /etc/acpi/events/power сразу для всех кнопок Power и Sleep:
# /etc/acpi/events/power
# This is called when the user presses the power or sleep button
event=button/(power|sleep)
action=/etc/acpi/power.sh %e
Создаём скрипт с разбором параметров /etc/acpi/power.sh :
#!/bin/bash
              # выкидываем ненужные 3й и 4й параметры с цифрами,
case "$1 $2 $5" in # остальные собираем в строчку для проверки
'button/power PBTN K') # кнопка Power на клавиатуре
 /usr/sbin/pm-suspend   # пусть будет ждущий режим
 ;;
'button/power PBTN ')  # кнопка Power на корпусе
 /sbin/poweroff         # завершаем работу
 ;;
'button/sleep SBTN K') # кнопка Sleep на клавиатуре
 /usr/sbin/pm-hibernate # спящий режим
 ;;
esac
Делаем скрипт исполняемым и перезапускаем acpid :
chmod 755 /etc/acpi/power.sh
/etc/rc.d/acpid restart
Готово. Можно жать на кнопки :)

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