15

Я недавно купил клавиатуру Unicomp, которая поставляется со сменными правыми и клавишами Windows. Клавиатура идентифицирует как это на lsusb:

Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc 

Есть ли способ заставить ядро (то есть не основанное на xmodmap) поменять местами правые клавиши и клавиши Windows, чтобы каждое приложение видело их в местах перестановки, даже если они получают ввод с клавиатуры в обычном режиме (замена содержимого с помощью xmodmap этого не сделает)? Есть ли способ сделать это только для этой клавиатуры?

2 ответа2

20

Да, это возможно с помощью 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). Все сделано! Теперь нажатие клавиш должно генерировать желаемый вывод только для указанного вами устройства.

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

1

Для всех, кто приезжает сюда из Google и хочет получить ответ, более соответствующий тому, на что изначально надеялся спрашивающий, мне известны два способа переназначения событий на уровне evdev чтобы изменение относилось ко всем приложениям:

  1. udev предоставляет API для изменения записей аппаратной базы данных, которые управляют отображениями между кодами сканирования и кодами клавиш. Эта страница ArchiWiki, которая содержит инструкции, прямо говорит, что она будет работать как для X11, так и для ввода с консоли.

    Суть в том, что вы создаете пользовательскую запись в /etc/udev/hwdb.d/ которая состоит из шаблона соответствия устройства и некоторых определений сопоставления кода скан-кода, затем запускаете systemd-hwdb update чтобы перестроить базу данных, и udevadm trigger это без перезагрузки.

  2. Учитывая, что Wayland не использует подсистему клавиатуры X11, а основные композиторы Wayland, такие как GNOME Shell и Weston, не реализуют пользовательские интерфейсы для настройки соответствующих аспектов libinput, кто-то написал демон с именем evdevremapkeys, который решает проблему аналогично драйверу пространства пользователя G15Daemon для Logitech. G15 игровые клавиатуры.

    (Он проглатывает события, которые он намеревается перераспределить, поэтому никто, слушающий устройство, не сможет их увидеть, а затем отправляет исправленные события через API uinput для создания устройств ввода уровня ядра из пространства пользователя.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .