Получить код клавиши от изготовленной на заказ клавиатуры

12

Я пытаюсь превратить Minitel в компьютер с Raspberry Pi.

Это минител:

введите описание изображения здесь

Поэтому я припаял матрицу клавиатуры Minitel к PCB-клавиатуре USB, вот так: введите описание изображения здесь

Все работает хорошо, я получаю некоторые ключи от моей пользовательской клавиатуры. Мне просто нужно правильно переназначить ключи.

Поэтому я пытаюсь создать программу, которая попросит меня нажать aи перехватить соответствующий код клавиши, а затем со всеми клавишами моей пользовательской клавиатуры, чтобы окончательно создать файл xmodmap.

Единственная проблема, которую я имею, состоит в том, что я не могу понять, как я могу получить этот код (и только это!). Я пытался, xevно слишком много данных отображается для фильтрации.

Я знаю, что могу отследить все коды клавиш вручную, но я преобразую 10 Минителей, поэтому я бы предпочел более быстрый способ!

xavier.seignard
источник
Не могли бы вы сбросить ПЗУ из имеющихся у вас Minitel для проекта MESS? Это оборудование в настоящее время не используется и, безусловно, имеет историческое значение.
sendmoreinfo
почему нет, но я понятия не имею, как это сделать!
xavier.seignard

Ответы:

6

Я предполагаю, что вы пытаетесь сделать это в оболочке или аналогичной (иначе, вы бы просто использовали библиотеки X напрямую). Если это так, вам может быть xinput --test «device-name»гораздо проще разобрать.

К сожалению, это действительно не дружественный к сценариям оболочки. Но вы можете заставить его работать stdbuf. Он работает до тех пор, пока вы его не убьете, но ваш сценарий оболочки может передать его read.

Итак, вы можете сделать что-то вроде этого:

stty -echo
stdbuf -oL xinput test 'AT Translated Set 2 keyboard' \
    | perl -nE 'BEGIN {$| = 1} m/^key press\s+(\d+)/ and say $1' \
    | for key in q w e r t y; do
         echo -n "Please press $key: "
         read -r keycode
         echo "key $key = $keycode"
    done
stty echo

Вам нужно будет использовать правильное имя клавиатуры вместо «AT Translated Set 2 клавиатура». Вы можете найти это с xinput list:

anthony@Zia:~$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=8    [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)]
    ↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]

К сожалению, вы должны использовать определенное устройство - вы не можете использовать основную клавиатуру.

(Кроме того, вам нужно будет найти способ убить xinput из вышеприведенного или просто довольствоваться нажатием Control-C, когда вы ввели все ключи. И вы, вероятно, захотите перечислить больше ключей, чем qwerty. )

derobert
источник
спасибо Дероберт! это идеально подходит моей потребности! Я использовал idклавиатуру вместо ее имени, потому что у меня были конфликты с 2 одинаковыми именами. Так xinput test 18где 18 - это идентификатор моей клавиатуры.
xavier.seignard
если бы я мог сделать то же самое с командой, которая не работает долго (то есть останавливается после нажатия первой клавиши и возвращает код клавиши), это было бы своего рода мечтой :)
xavier.seignard
@ xavier.seignard Я попробовал и не смог найти утилиту, которая делает это. Но было бы довольно легко взять исходный код xinput и заставить его работать таким образом ... проверьте test.c, похоже, что соответствующая функция есть print_events. Может быть, xorg взял бы патч, чтобы добавить флаг, чтобы остановить после n событий?
Дероберт
@ xavier.seignard Я только что наткнулся на способ сделать это ... xinput --query-stateдает текущее состояние и сразу выходит. Вы могли бы это сделать.
Дероберт