Отримайте код клавіші з клавіатури, виготовленої на замовлення


12

Я намагаюся перетворити Minitel на комп'ютер із Raspberry Pi.

Це мінімум:

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

Тож я припаяв матрицю клавіатури minitel до ПК-клавіатури usb, наприклад: введіть тут опис зображення

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

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

Єдина проблема, яку я маю - це те, що я не можу зрозуміти, як я можу отримати цей ключовий код (і тільки це!). Я спробував, xevале відображається занадто багато даних, щоб їх відфільтрувати.

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


Чи можете ви скинути ROM (и) з мінімумів, які у вас є, для проекту 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. )


дякую дероберт! що ідеально відповідає моїй потребі! Я використовував idклавіатуру замість її назви, оскільки у мене були конфлікти з двома однаковими іменами. Тож xinput test 18де 18 - ідентифікатор моєї клавіатури.
xavier.seignard

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

@ xavier.seignard Я спробував і не зміг знайти утиліту, яка це робить. Але було б досить просто взяти джерело xinput і змусити його працювати так ... перевірити test.c, схоже, що це відповідна функція print_events. Можливо, xorg взяв би патч, щоб додати прапор, який зупиниться після n подій?
derobert

@ xavier.seignard Я просто перебіг спосіб зробити це ... xinput --query-stateдає поточний стан і виходить негайно. Ви могли б зайнятись циклами.
derobert
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.