Проблемы с сочетаниями клавиш

Материал из ALT Linux Wiki
Версия от 17:43, 9 сентября 2024; Velavok (обсуждение | вклад) (Новая страница: «Иногда определенные клавиши или их сочетания могут неправильно распознаваться системой. Например, вместо ожидаемой функции может срабатывать другая команда, или же клавиша может не работать вовсе. Такие проблемы особенно распространены на менее рас...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Иногда определенные клавиши или их сочетания могут неправильно распознаваться системой. Например, вместо ожидаемой функции может срабатывать другая команда, или же клавиша может не работать вовсе. Такие проблемы особенно распространены на менее распространенных или кастомных клавиатурах. Одним из решений этой проблемы является использование hwdb в systemd для настройки и исправления этих несовместимостей:

hwdb (Hardware Database) — это база данных аппаратных свойств, которая является частью системы udev в systemd. Она используется для хранения информации о различных устройствах, подключаемых к системе, включая клавиатуры. Эта информация может включать правила обработки входных данных, такие как скан-коды клавиш, чтобы они правильно отображались в операционной системе.

Рассмотрим на реальном примере. Ноутбук KVADRA NAU LE14U, проблемы:

Не работает комбинация Fn+F1 (вкл/откл тачпада)

Поиск решения.

Смотрим сканкод, например, удобно утилитой evtest (archlinux wiki ):

su -
apt-get install evtest

При запуске выдаст примерно следующее:

No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:      AT Translated Set 2 keyboard
/dev/input/event1:      Video Bus
/dev/input/event2:      Lid Switch
/dev/input/event3:      Power Button

Нас интересуют события от клавиатуры, запускаем:

su-
evtest /dev/input/event0

Нажимаем интересующие комбинации, например, Fn+F1, и видим, что ОС распознает это как комбинацию из 3-х клавиш Meta+Ctrl+<KEY_ZENKAKUHANKAKU>

Сканкод клавиши <KEY_ZENKAKUHANKAKU> равен 0x76 и не регистрируется DE для функций, поэтому переопределим на нужную:

su -
cat > /etc/udev/hwdb.d/20-kbd.hwdb <<EOF
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnKVADRA*:pn*LE1*U*:*
 KEYBOARD_KEY_76=f21
EOF

f21 здесь - кейкод, дергающий функцию, зарезервированную для вкл/откл тачпада. (см. типовые решения для клавиатур в /lib/udev/hwdb.d/60-keyboard.hwdb);

svn<>, pn<> - vendor и product id из dmidecode;

Еще важен отступ в 1 пробел перед KEYBOARD_KEY_76

Обновим hwdb:

su -
systemd-hwdb -s update

После перезагрузки, проверяем.

После этих действий, комбинация Fn+F1 понимается как Meta+Ctrl+F21, но возникает другая проблема - тачпад переключается не всегда из-за возникающих задержек, которые вносят другие два сканкода: Meta и Ctrl, поэтому дополнительно необходимо явно указать новую комбинацию:


для KDE : Настройки -> Параметры системы KDE5 -> Комбинации клавиш -> Сенсорная панель -> Включить или выключить сенсорную панель -> Назначить свою комбинацию -> Нажать Fn+F1 -> Применить

для MATE : Центр управления -> Комбинации клавиш клавиатуры -> Добавить -> Имя: "Touchpad Toggle" Команда: "xdotool sleep 0.5 key XF86TouchpadToggle" -> Применить -> Дважды щелкнуть в поле "Комбинация клавиш" и нажать Fn+F1


для XFCE : пишем скрипт /usr/bin/xfce4-touchpad-toggle:

#!/bin/sh

TOGGLE=$HOME/.toggle_touchpad
id=$(xinput |grep Touchpad |cut -d '=' -f 2 |cut -f 1)

if [ ! -e $TOGGLE ]; then
    touch $TOGGLE
    xinput disable $id
    notify-send -u low -i mouse --icon=/usr/share/icons/HighContrast/256x256/status/touchpad-disabled.png "TouchPad disabled" 
else
    rm $TOGGLE
    xinput enable $id
    notify-send -u low -i mouse --icon=/usr/share/icons/HighContrast/256x256/devices/input-touchpad.png "TouchPad enabled" 
fi

делаем его исполняемым:

su-
chmod +x /usr/bin/xfce4-touchpad-toggle

Приложения -> Настройки -> Диспетчер настроек -> Оборудование: Клавиатура -> Комбинации клавиш -> Добавить -> Команда: xfce4-touchpad-toggle -> Нажать комбинацию Fn + F1

Как видно, поведение на оболочках различается.

Если переопределение помогло, отправляем в апстрим .