Проблемы с сочетаниями клавиш: различия между версиями
Velavok (обсуждение | вклад) (Новая страница: «Иногда определенные клавиши или их сочетания могут неправильно распознаваться системой. Например, вместо ожидаемой функции может срабатывать другая команда, или же клавиша может не работать вовсе. Такие проблемы особенно распространены на менее рас...») |
Velavok (обсуждение | вклад) м (Velavok переименовал страницу Категория:Проблемы с сочетаниями клавиш в Проблемы с сочетаниями клавиш) |
(нет различий)
|
Текущая версия от 09:51, 10 сентября 2024
Иногда определенные клавиши или их сочетания могут неправильно распознаваться системой. Например, вместо ожидаемой функции может срабатывать другая команда, или же клавиша может не работать вовсе. Такие проблемы особенно распространены на менее распространенных или кастомных клавиатурах. Одним из решений этой проблемы является использование 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
Как видно, поведение на оболочках различается.
Если переопределение помогло, отправляем в апстрим .