Не работают функциональные клавиши на ноутбуке

На момент написания версия образа: ctlos_xfce_1.10.0_20200824 \ bspwm

Вылечить FN клавиши на ноутбуке/ПК с Arch Linux

FN + … , которые у меня есть:

  1. F1 - выключить звук (+)
  2. F2 - меньше громкость (+)
  3. F3 - больше громкость (+)
  4. F4 - выключить микрофон (+)
  5. F5 - обновить страницу (-)
  6. F6 - выключить тачпад (-)
  7. F7 - режим в полете (-)
  8. F8 - выключить камеру (-)
  9. F9 - замок (поставить замок на ноутбук) (-)
  10. F10 - переключение основного дисплея (-)
  11. F11 - меньше яркость (-)
  12. F12 - больше яркость (-)
  13. Пуск/пауза музыки - Пуск/пауза музыки (+)
  14. Переключить на трек влево - Переключить на трек влево (+)
  15. Переключить на трек вправо - Переключить на трек вправо (+)
  • НЕ решено
  • решено

Пункты 11 и 12 начинают работать после выхода из ждущего режима (suspend) :confused:

Решение:

  1. pamac install acpid acpi acpitool
  2. systemctl start acpid.service
  3. systemctl enable acpid.service
  4. pamac install playerctl (если есть клавиши, которые манипулируют с музыкой)
  5. acpi_listen

Теперь нужно нажать на Fn + F(1…12) после чего у вас отобразится примерно такой текст:

button/mute MUTE 00000080 00000000 K
button/volumedown VOLDN 00000080 00000000 K
button/volumeup VOLUP 00000080 00000000 K
button/f20 F20 00000080 00000000 K
cd/play CDPLAY 00000080 00000000 K
cd/prev CDPREV 00000080 00000000 K
cd/next CDNEXT 00000080 00000000 K

Здесь не все 12 строчек, так как еще не все решил.

  1. Зайдите в папку /etc/acpi/
  2. Выполните в папке git clone https://github.com/xihnik/LinuxFixFN.git
  3. Откройте конфиг /etc/acpi/acpi-config
  4. Измените в нем your_user на название вашего пользователя.
  5. Перезапустите ноутбук/ПК и все должно заработать или можно этой командой перезапустить контроллер отвечающий за FN клавиши: systemctl disable acpid.service && systemctl enable acpid.service

Если вы хотите добавить свои обработчики, тогда краткий экскурс:
Зайдите в папку /etc/acpi/ в этой папке лежат bash скрипты, которые выполняются при нажатии на FN+F1(1…12). Зайдите в папку /etc/acpi/events/ в этой папке лежат конфиги, которые и отвечают за вызов скриптов.

К примеру мы хотим добавить обработку нажатия на FN+F1 (у меня это включить/выключить звук):

  1. Зайдите в папку /etc/acpi/events/
  2. Добавьте файл без расширения к примеру VolumeToggle
  3. Откройте его
  4. Добавьте значение FN+F1:
    Вот FN+F1 полученный с помощью acpi_listen: button/mute MUTE 00000080 00000000 K
    Нам нужно превартить этот текст из этого event=button/other (FUNC|HOTK) 00000070 в этот event=button/mute (MUTE|HOTK) 00000080

Что мы сделали:
button/other заменили на button/mute
FUNC заменили на MUTE
00000070 заменили на 00000080

  1. Навешиваем bash скрипт на action
    action=/etc/acpi/VolumeToggle.sh %e
  2. Зайдите в папку /etc/acpi/
  3. Создайте файл VolumeToggle.sh и сделайте его исполняемых (свойства файла->права)
  4. Откройте его редактором
  5. И добавьте следующее:

[code]#!/bin/bash
#Выключить/включить звук

filename=/etc/acpi/acpi-config
user=$(head -n 1 $filename)
var=$(amixer get Master | grep ‘[on]’)

if [[ -z $var ]]; then
amixer -D pulse sset Master unmute
amixer -c 0 set Master unmute
amixer cset numid=4 on
sudo -u $user amixer cset numid=4 on
sudo -u $user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send “Звук включен”
else
amixer -D pulse sset Master mute
amixer -c 0 set Master mute
amixer cset numid=4 off
sudo -u $user amixer cset numid=4 off
sudo -u $user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send “Звук выключен”
fi[/code]

*Здесь мы описали, что произойдет при вызове FN+F1

  1. Перезапустите ноутбук/ПК и все должно заработать хотя можно и этой командой перезапустить контроллер отвечающий за FN обработчики: systemctl disable acpid.service && systemctl enable acpid.service

Есть ещё более простой и красивый способ управления мультимедиа клавишами.
В sxhkdrc добавляем строки:

[code]# Volume control
XF86Audio{RaiseVolume,LowerVolume}
volume{-up,-down}

XF86AudioMute
amixer set Master toggle

Music control

XF86Audio{Next,Prev,Play,Stop}
mpc {next,prev,toggle,stop}
[/code]
создаём скрипты:
volume-down

[code]#!/bin/bash

/usr/local/bin/volume-down

amixer -Mq set Master,0 5%- unmute && dunstify -u low --replace=69 -i /usr/share/icons/Papirus-Dark/24x24/actions/audio-volume-medium.svg “Volume Down : $(volume)%”
[/code]

volume-up

[code]#!/bin/bash

/usr/local/bin/volume-up

amixer -Mq set Master,0 5%+ unmute && dunstify -u low --replace=69 -i /usr/share/icons/Papirus-Dark/24x24/actions/audio-volume-high.svg “Volume Up : $(volume)%”
[/code]

volume

[code]#!/bin/bash

/usr/local/bin/volume

statusLine=$(amixer get Master | tail -n 1)
status=$(echo “${statusLine}” | grep -wo “on”)
volume=$(echo “${statusLine}” | awk -F ’ ’ ‘{print $5}’ | tr -d ‘[]%’)

echo “$volume”
[/code]

закидываем их в папку, допустим /usr/local/bin, не забыв сделать исполняемыми, перезагружаем sxhkdrc (super + Escape)
И на выходе получаем приблизительно такую картинку: