The special Fn keys typically trigger ACPI events, for which the ACPI daemon can trigger actions.


Install ACPI daemon (apt install acpid) and make sure it is started and enabled. If it isn't,

systemctl start  acpid
systemctl enable acpid

You can read its manual page and inspect files under /etc/acpi to easily figure it all out. But here is a summary.


Run acpi_listen and press the special Fn keys. For brightness keys, volume keys and reconnecting the AC adapter, I get

$ acpi_listen
 676AA15E-6A47- 000000bc 00000000
video/brightnessdown BRTDN 00000087 00000000
 676AA15E-6A47- 000000bc 00000000
video/brightnessup BRTUP 00000086 00000000
 676AA15E-6A47- 000000bc 00000000
 676AA15E-6A47- 000000bc 00000000
button/volumedown VOLDN 00000080 00000000 K
button/volumeup VOLUP 00000080 00000000 K
ac_adapter ACPI0003:00 00000080 00000000
battery PNP0C0A:00 00000080 00000001
ac_adapter ACPI0003:00 00000080 00000001
battery PNP0C0A:00 00000080 00000001

Ignore garbage lines, just take note of the relevant identifiers, and look inside /etc/acpi/acpi_handler.sh.


The set $* statement turns each space delimited field into a positional argument. I.e.,

button/volumeup VOLUP 00000080 00000000 K
^^^^^^^^^^^^^^^ ^^^^^ ^^^^^^^^ ^^^^^^^^ ^
      $1         $2      $3       $4    $5

A working example:

if [ $# != 1 ]; then
        exit 1
fi
set $*

case "$1" in
    button/volumeup)      amixer -q set Master 5%+ ;;
    button/volumedown)    amixer -q set Master 5%- ;;
    video/brightnessup)   xbacklight -inc 6 ;;
    video/brightnessdown) xbacklight -dec 6 ;;
    ac_adapter)
        case "$4" in
            *1) adapter_connected ;;
            *0) adapter_disconnected ;;
        esac 
    ;;
esac

Then restart the daemon:

systemctl restart acpid

And the bindings will work.



/articles/extarticles/