клавіатури жорсткі перезастосування клавіш?


19

Я намагаюся знайти спосіб перенастроїти клавіші клавіатури.
Я спробував використовувати xmodmap та setxkbmap, але вони не працюють для одного конкретного додатка. Такі команди працюють для інших звичайних вікон / програм на X tho.

Я думаю, що програма може читати необроблені дані на клавіатурі та ігнорувати X-введення?

Отже, як перевпорядкувати ключі без використання xmodmap та setxkbmap? якщо це колись можливо зробити за допомогою певного програмного забезпечення.

Я також спробував xkeycaps, xkbcomp, але не спробував loadkeys, оскільки він працює на X.

Я знайшов тут , що я міг би спробувати setkeycodes, «тому що після призначення ядра коду ключа кнопка повинна працювати в Xorg» , але я також виявив , що «ви не можете використовувати" setkeycodes "на USB - клавіатурами» , це мій випадок (я зацікавлений в разі хтось змусить це працювати на ps2, як я думаю, я міг би використовувати адаптер).

Це здавалося перспективним "Сканування карти на коди клавіш" , але після декількох тестів нічого не змінилося, ось вони:
я знайшов у vt1 ключ код "36" ("j" ключ), і я знайшов код сканування showkey
"7e" (клавіатура ".") У vt1 сshowkey --scancodes

$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..

Obs .: не працював ні з: KEYBOARD_KEY_7e=j

Ще кілька альтернативних способів (від @ vinc17) знайти ключі:
evtest /dev/input/by-id/... або
input-kbd 3(покладіть індекс, знайдений у ls -l /dev/input/by-id/*з події event3)

PS .: * Якщо вас цікавить тестування, пов’язана тема для програми: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ Проблеми, які я мають одне і те ж: деякі клавіші (KP_Decimal, DownArrow, UpArrow, RightArrow) ігноруються і вважаються всі з однаковим значенням там "0x00"


Оновлений файл повинен бути /etc/udev/hwdb.bin, не /lib/udev/hwdb.bin. Але, хоча цей файл оновлено правильно, це не працює і для мене, навіть після перезавантаження. Можливо, щось не вистачає в документації. Про це: bugs.freedesktop.org/show_bug.cgi?id=82311
vinc17

@ vinc17 це справді цікаво, як тільки я можу спробувати ще раз, я думаю, що ми повинні знайти цей файл налаштувань і спробувати наслідувати його, thx!
Сила Водолія

1
Моя проблема була пов'язана з тим, що рядки KEYBOARD_KEY_ починалися з 2 проміжків замість одного (це не було задокументовано, і я не отримав жодних повідомлень про помилки!). Я не знаю для вас, але з моєю USB-клавіатурою showkey --scancodesне дає сканкодів, які очікує udev (значення різні); input-kbdутиліта дає правильні сканкоди.
vinc17

1
evtestУтиліта має також дати вам правильні сканкоди: після введення ключа, ви повинні отримати 2 рядки і перший один повинен закінчуватися ніж - то форма code 4 (MSC_SCAN), value xxx, де xxxє скан. Але драйвер моєї клавіатури баггі, і я не отримую цю MSC_SCANлінію для деяких клавіш, які я хотів перезаписати. Ось чому я використав input-kbd, в якому перераховані всі коди сканування для вибраного пристрою.
vinc17

1
Я опублікував детальну інформацію у відповідь. Зараз я не впевнений, що 36 або 7002c працює як цінність. Я думаю, що вам потрібен ідентифікатор ключового коду. Дивіться мою відповідь.
vinc17

Відповіді:


17

Спочатку знайдіть код сканування ключа, який потрібно переробити, наприклад, з evtestутилітою. MSC_SCANПотрібно вивести такий рядок ( у ньому):

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

після чого другий, який дає поточний код ключа. Якщо жодна MSC_SCANлінія не виводиться, це пов’язано з помилкою драйвера ядра, але код сканування все ще можна знайти input-kbdутилітою; evtestслід було вказати код ключа, щоб було легко знайти відповідний рядок у input-kbdвисновку (наприклад, використовуючи grep).

Після того, як скан-коди ключів, які потрібно перезаписати, визначені, створіть файл, такий як /etc/udev/hwdb.d/98-custom-keyboard.hwdbмістить перенастроювання . Початок файлу /lib/udev/hwdb.d/60-keyboard.hwdbдає деяку інформацію. У моєму випадку (який працює) я маю:

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

(До udev 220, мені довелося користуватися keyboard:usb:v05ACp0221* для першого рядка.)

evdev:Рядок повинен бути на початку рядка. Зауважте, що букви у ідентифікаторі постачальника та продукту повинні бути великими літерами. Кожен KEYBOARD_KEY_параметр повинен мати рівно один пробіл (зверніть увагу: рядок без пробілів видасть повідомлення про помилку, а рядок з двома пробілами мовчки ігнорується у старих версіях udev). KEYBOARD_KEY_супроводжується скан-кодом у шістнадцятковій формі (як те, що evtestі input-kbdдають). Дійсні значення можна отримати або з evtestвиводу, або з input-kbdвиводу, або навіть з /usr/include/linux/input.hфайлу: наприклад, KEY_102NDдали б 102nd(видаливши KEY_і перетворивши в малі регістри), які я використовував вище.

Після збереження файлу введіть:

udevadm hwdb --update

для (пере) побудови бази даних /etc/udev/hwdb.bin(ви можете перевірити її часову позначку). Потім,

udevadm trigger --sysname-match="event*"

візьме до уваги нові налаштування. Ви можете перевірити evtest.

У 2014 році випущений udev містив неповну інформацію про помилки /lib/udev/hwdb.d/60-keyboard.hwdb, але ви можете переглянути останню версію розробки файлу та / або мій звіт про помилки та обговорення щодо питань документації та проміжків.

Якщо це не працює, проблема може бути знайдена після тимчасового підвищення рівня журналу udevdз udevadm control(детальніше див. Сторінку чоловічої сторінки udevadm (8)).

Для старих udevверсій, таких як 204, цей метод все одно повинен працювати.


Коли я запускаю команди udevadm /lib/udev/hwdb.bin, я оновлюється файл, який я оновлював , blessі KEYBOARD_KEY_70085з'являється в його кінці. Я думаю, що ubuntu 14.04 налаштований (захищений?) Таким чином. Я спробував udevadm control --log-priority=debug. на основі lsusb(045e: 0750) моя клавіатура виглядає як keyboard:usb:v045ep0750*, але я намагався і з цим keyboard:usb:v*p*. Думаю, це /etc/udev/hwdb.binслід оновити, але воно навіть не існує.
Сила Водолія

Як я читав тут, це могло бути так, як я використовував цю команду udevadm hwdb --usr --update, незважаючи на те, що я не був.
Сила Водолія

Після того, як udevadm hwdb --updateя скопіював /lib/udev/hwdb.binв /etc/udev/hwdb.binі побіг , strace udevadm trigger --sysname-match="event*"і файл , hwdb.binздається , були прочитані ним (якщо це як це працює).
Сила Водолія

1
@AquariusPower Так, може виникнути помилка Ubuntu (я використовую Debian / нестабільний). Щоб дізнатись, чи читається база даних під час роботи udevadm trigger ..., дивіться мій тест тут . Зауважте, що перед запуском udevadm trigger ...потрібно переконатися, що час модифікації файлу оновлено, інакше час доступу не буде оновлений під час читання файлу.
vinc17

1
@AquariusPower udevadm --version: 215 (і версія пакету udev: 215-7). Завдяки цьому udevadm trigger ...вам не потрібно буде перезавантажувати (якщо ви не хочете видалити налаштування, AFAIK). Але ви можете спробувати перезавантажити, щоб побачити, чи є ефект.
vinc17
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.