Як перевпорядкувати клавіші під Linux лише для певної клавіатури


18

Нещодавно я придбав клавіатуру Unicomp, яка постачається із переключеними клавішами праворуч і клавішами Windows. Клавіатура ідентифікує так у lsusb:

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

Чи є спосіб змусити ядро ​​(тобто не на основі xmodmap) підміняти клавіші Alt та Windows правою клавішею, щоб кожна програма бачила їх у місцях, що розмінялися, навіть якщо вони отримують необмежену вкладку клавіатури (заміни матеріалів на xmodmap цього не робитимуть) ? Чи є спосіб мати це лише для цієї клавіатури?


Я підозрюю, що ви могли це зробити з udev, зіставивши серійний номер клавіатури, а потім зателефонувавши до сценарію, який виконує перезавантаження. Можливо, вам, можливо, буде потрібен аналогічний сценарій, щоб викликати його окремо, щоб пристрій повернув його назад.
варення

1
@jam Чи вдасться перевстановити всі додані клавіатури? Я не можу уявити, що Linux настільки негнучкий, що він може керувати лише однією таблицею відображення для всіх вкладених (USB) клавіатур.
FUZxxl

@jam Крім того, ви дійсно допоможете мені, якби ви могли описати, як зробити фактичну заміну. Мені не вдалося знайти нічого корисного в цьому, лише речі xmodmap (якими я не хочу користуватися).
FUZxxl

Якщо ви не хочете використовувати xmodmap, те, що ви запитуєте, здається занадто специфічним для моїх знань, щоб допомогти вам шкодувати. Запропонований нами метод використовуватиме xmodmap для обміну ключовими кодами цих клавіш для всіх пристроїв протягом тривалості додавання вашої конкретної клавіатури та повернення її назад. Ви очікуєте одночасного використання декількох клавіатур?
варення

@jam Якщо я використовував Xmodmap, програми X усе ще побачили б неправильні клавіші, оскільки X-сервер також надсилає клієнту неперекладені коди ключів. Це має значення, наприклад, для відеоігор. У ядрі повинно бути рішення, яке не ускладнить моє життя із програмами, які зчитують коди сканування.
FUZxxl

Відповіді:


27

Так, це можливо за допомогою 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
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
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

# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
#     we used above, in this case it's the "remote" definition
#     described in the file named "custom" which we specify in
#     this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
#     keyboard. This includes the file we just made, read in last,
#     so as to override any prior definitions.  Importantly we 
#     need to include the directory of the place we placed the file
#     to be considered when reading things in.
#
# Also notice that we aren't including exactly the 
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
# 
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
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). Готово! Тепер натискання клавіш має генерувати потрібний вихід, лише для вказаного вами пристрою.

Редагувати : Останнім часом я помітив, що з якоїсь причини нову конфігурацію застосовують не відразу. Спочатку потрібно натиснути клавішу на іншій клавіатурі, а потім протестувати налаштовані клавіші на зміненій клавіатурі. Я не знаю, чому це відбувається, можливо, якийсь кеш.


Дозвольте спробувати це у понеділок, коли я повернуся до комп'ютера, де я використовую цю клавіатуру.
FUZxxl

1
а) sed -n 's/.*G19 Gaming Keyboard.*id=\([0-9]*\).*keyboard.*/\1/p' в) Так, вам слід обов'язково протестувати його, попередньо замінивши $remote_idідентифікаційний номер. Зауважте, що там є дві посилання $remote_id, ви змінили обидва?
Ватком

1
О, і під час тестування жорсткого кодування $remote_id, переконайтеся, що ви прокоментуєте рядок, [ "$remote_id" ] || exitякщо ви ще цього не зробили.
Ватком

1
@ stats-hb $9не працюватиме, ви мали на увазі 9?
Ватком

1
це працює для мене lampjs.wordpress.com/2015/06/26/…
usil

6

Для всіх, хто приїжджає сюди з 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.

    (Він ковтає події, які він має намір перезавантажувати, тому більше нічого, слухаючи на пристрої, не може бачити їх, а потім виправляє виправлені події через uinputAPI для створення пристроїв введення рівня ядра з простору користувача.)


Я їду сюди з DuckDuckGo, але все одно дякую за відповідь (:
sm4rk0

0

Для тих, хто не досяг успіху за допомогою параметра @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 / символи / як може бути 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, тому клавіші поміняються під час перезавантаження при необхідності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.