Настройка обработчиков специальных клавиш

Автор:
Вадим Цесько

Это небольшое HOWTO по настройке обработчиков специальных клавиш. Всё, описанное здесь, тестировалось на ноутбуке Lenovo ThinkPad X200s. Ноутбуки Lenovo, как и многие другие ноутбуки, характеризуются наличием специальных клавиш, активируемых по нажатию Fn + F*, Fn + <стрелка>, или даже аппаратных специальных клавиш (у меня это Volume Mute, Volume Up/Down, Forward, Next).

Условно можно разделить обработчики нажатий на такие клавиши на два класса:

  • обрабатываемые при помощи acpid
  • обрабатываемые при помощи Xmodmap/Xbindkeys

При помощи acpid обрабатываются нажатия на такие клавиши как:

  • переход в ждущий/спящий режим
  • включение/выключение внешнего монитора
  • включение/выключение WiFi/Bluetooth

При помощи Xmodmap/Xbindkeys обрабатываются:

  • регулировка громкости звука
  • мультимедийные клавиши (Fn + <стрелка>)
  • клавиши навигации вперёд/назад

Требуемый софт

Понадобятся следующие пакеты:

  • acpi
  • acpid
  • acpitool
  • xorg-server-utils
  • xbindkeys

Настройка ACPI

После установки пакета acpi укажите в /etc/rc.conf ACPI-модуль для Вашей машины. У меня это thinkpad_acpi.

Настройка обработчиков нажатий осуществляется в файле /etc/acpi/handler.sh. Демон ACPI перенаправляет события ACPI этому скрипту. Мой скрипт выглядит следующим образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/sh

# Default acpi script that takes an entry for all actions

set $*

case "$1" in
    ibm/hotkey)
        case "$2" in
        HKEY)
                case "$4" in
                    00001004) # Suspend to RAM
                        /usr/sbin/pm-suspend
                        ;;
                    00001008) # Switch Bluetooth
                        if [ "$(grep "status.*enabled" /proc/acpi/ibm/bluetooth)" ]; then
                            /etc/rc.d/bluetooth stop
                            echo "disable" > /proc/acpi/ibm/bluetooth
                        else
                            echo "enable" > /proc/acpi/ibm/bluetooth
                            /etc/rc.d/bluetooth start
                        fi
                        ;;
                    00001007) # Toggle external display
                        if [ "$(xrandr -q | grep "VGA connected")" ]; then
                            if [ "$(xrandr -q | grep "VGA connected [0-9]")" ]; then
                                xrandr --output VGA --off
                            else
                                xrandr --output VGA --auto
                            fi
                        else
                            xrandr --output VGA --off
                        fi
                        ;;
                    0000100c) # Hibernate
                        /usr/sbin/pm-hibernate
                        ;;
                esac
                ;;
        esac
        ;;
esac

Посмотреть номера клавиш можно при помощи утилиты acpi_listen, например:

$ acpi_listen
ibm/hotkey HKEY 00000080 00001003
^C

Скрипт /etc/acpi/handler.sh по частям обрабатывает код события (разбивая строку на параметры при помощи set $*) и выполняет соответствующие им действия. Таким образом Вы можете добавлять новые обработчики.

Настройка Xmodmap

Сервер X ведёт свою таблицу символов. Посмотреть какой символ соответствует нажатию специальной клавиши можно при помощи утилиты xev. Для клавиш, которым сервер X самостоятельно не сопоставил правильных символов, можно задать символы при помощи утилиты Xmodmap в файле ~/.Xmodmap:

keycode 121 = XF86AudioMute
keycode 122 = XF86AudioLowerVolume
keycode 123 = XF86AudioRaiseVolume
keycode 166 = XF86Back
keycode 167 = XF86Forward

Список символов можно посмотреть в файле /usr/include/X11/keysymdef.h.

Не забудьте прописать запуск Xmodmap при старте менеджера окон в ~/.xinitrc:

xmodmap ~/.Xmodmap
xbindkeys
while :
do
    wmii
done

Настройка Xbindkeys

Опишите действия, которые нужно выполнять при обработке символов X в файле ~/.xbindkeysrc:

"mocp -G"
XF86AudioPlay

"mocp -s"
XF86AudioStop

"mocp -r"
XF86AudioPrev

"mocp -f"
XF86AudioNext

"amixer sset Master 5%-"
XF86AudioLowerVolume

"amixer sset Master 5%+"
XF86AudioRaiseVolume

"amixer sset Master toggle"
XF86AudioMute

"xbacklight -inc 10"
XF86MonBrightnessUp

"xbacklight -dec 10"
XF86MonBrightnessDown

Как легко понять, клавиши мультимедиа управляют демоном mocp, клавиши регулировки громкости управляют микшером ALSA, а клавиши регулировки яркости вызывают утилиту xbacklight.

Так же как и в случае Xmodmap, не забудьте запустить xbindkeys при старте менеджера окон (см. ~/.xinitrc выше).

Внешние ссылки

  • ArchWiki: ACPI hotkeys

  • ArchWiki: Extra Keyboard Keys in Xorg

  • ArchWiki: Xmodmap

  • ArchWiki: Xbindkeys

blog comments powered by Disqus

Options

Tags

  • howto
  • hardware
  • input
  • keyboard
  • software
  • acpi
  • hotkey

Content view

  • Source

Navigation

  • Index
  • Blog
  • All pages
  • Tags
  • Mercurial repo

Search page names

nqw powered

Creative Commons License Copyright © 2008-2010 spb-archlinux Group. Материалы вики доступны по лицензии Creative Commons.