Как переназначить клавиши под Linux только для конкретной клавиатуры
Я недавно купил клавиатуру Unicomp, которая поставляется со сменными правыми и клавишами Windows. Клавиатура идентифицирует как это на lsusb:
Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc
Есть ли способ заставить ядро (то есть не основанное на xmodmap) поменять местами правые клавиши и клавиши Windows, чтобы каждое приложение видело их в местах перестановки, даже если они получают необработанный ввод с клавиатуры (замена содержимого с помощью xmodmap этого не сделает)? Есть ли способ сделать это только для этой клавиатуры?
3 ответа
Да, это возможно с помощью XKB. В отличие от xmodmap, XKB может переназначать ваши ключи для отдельных устройств.
Примечание: убедитесь, что у вас есть xkbcomp > 1.2.0
Сначала перечислите свои устройства с:
xinput list
Вы получите что-то вроде этого:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen Pen stylus id=11 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen Finger touch id=12 [slave pointer (2)]
⎜ ↳ Logitech USB-PS/2 Optical Mouse id=13 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen Pen eraser id=14 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen Finger pad id=15 [slave pointer (2)]
⎜ ↳ GASIA USB KB V11 id=17 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Power Button id=7 [slave keyboard (3)]
↳ G19 Gaming Keyboard id=8 [slave keyboard (3)]
↳ G19 Gaming Keyboard id=9 [slave keyboard (3)]
↳ Logitech G19 Gaming Keyboard id=10 [slave keyboard (3)]
↳ GASIA USB KB V11 id=16 [slave keyboard (3)]
Определите строку вашего устройства и отредактируйте следующий скрипт оболочки, заменив строку sed на ту, которая соответствует имени вашего устройства. Затем измените ключи, которые вам нужно переназначить.
Пример: загрузка xev
и нажмите клавишу, которую вы хотите переназначить. Предположим, вы узнали его код ключа 84. Найдите 84 в https://gist.github.com/zoqaeski/3880640. Имя ключа есть <KP5>
, Затем найдите ключ, которым вы хотите заменить его (в той же ссылке, ниже) и скопируйте то, что находится внутри скобок. Повторите процесс для всех ключей, которые вы хотите.
remote_id=$(
xinput list |
sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit
# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control
mkdir -p /tmp/xkb/symbols
cat >/tmp/xkb/symbols/custom <<\EOF
xkb_symbols "remote" {
key <KP5> { [ KP_Right, KP_6, U2192, U21D2 ] };
key <I129> { [ KP_Down, KP_2, U2193, U21D3 ] };
key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ] };
key <LFSH> { [ Control_L ] };
};
EOF
setxkbmap -device $remote_id -print | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null
Затем отправьте его (вы можете добавить его в свой.xinitrc). Все сделано! Теперь нажатие клавиш должно генерировать желаемый вывод только для указанного вами устройства.
Изменить: Недавно я заметил, что по какой-то причине новая конфигурация не применяется сразу. Сначала необходимо нажать клавишу на другой клавиатуре, а затем проверить настроенные клавиши на измененной клавиатуре. Я не знаю, почему это происходит, может быть, какой-то кеш.
Для всех, кто приезжает сюда из Google и хочет получить ответ, более соответствующий тому, на что изначально надеялся спрашивающий, я знаю два способа переназначить события на evdev
уровень, так что изменение распространяется на все приложения:
udev предоставляет API для изменения записей аппаратной базы данных, которые управляют отображениями между кодами сканирования и кодами клавиш. Эта страница ArchiWiki, которая содержит инструкции, прямо говорит, что она будет работать как для X11, так и для ввода с консоли.
Суть в том, что вы создаете пользовательскую запись в
/etc/udev/hwdb.d/
который состоит из шаблона соответствия устройства и некоторых определений сопоставления кода скан-код-ключ, затем запуститеsystemd-hwdb update
восстановить базу данных иudevadm trigger
применить его без перезагрузки.Учитывая, что Wayland не использует клавиатурную подсистему X11, а основные композиторы Wayland, такие как GNOME Shell и Weston, не реализуют пользовательские интерфейсы для настройки соответствующих аспектов libinput, кто-то написал демон с именем evdevremapkeys, который решает проблему аналогично драйверу пространства пользователя G15Daemon для Logitech. G15 игровые клавиатуры.
(Он проглатывает события, которые он намеревается переназначить, поэтому никто, слушающий устройство, не сможет их увидеть, а затем выдает исправленные события через
uinput
API для создания устройств ввода уровня ядра из пространства пользователя.)
Для тех, кто не справился с опцией @Watcom, просто добавьте новый файл сопоставления, например:
xkb_symbols "remote" {
key <KP5> { [ KP_Right, KP_6, U2192, U21D2 ] };
key <I129> { [ KP_Down, KP_2, U2193, U21D3 ] };
key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ] };
key <LFSH> { [ Control_L ] };
};
в /usr/share/X11/xkb/symbols/ как root (ubuntu, может отличаться для вашего дистрибутива), назовите файл "custom". Запросите текущую строку макета с setxkbmap -device <device id> -print | grep xkb_symbols
и добавить +custom
к этому. Установите новый макет с переназначенными ключами и измененной строкой макета:
setxkbmap -device <device id> -layout "us+ru:2+us:3+inet(evdev)+capslock(grouplock)+custom"
Эффект не является постоянным и, к сожалению, сбрасывается при подключении другой клавиатуры, пока не понял, как это исправить. Вы можете добавить команду выше к вашему .bashrc
тем не менее, поэтому ключи переставляются при перезагрузке, если это необходимо.