Dapatkan kode kunci tombol, dari keyboard yang dibuat khusus

12

Saya mencoba mengubah Minitel menjadi komputer dengan Raspberry Pi.

Ini adalah minitel:

masukkan deskripsi gambar di sini

Jadi saya menyolder matriks keyboard minitel ke pc keyboard usb, seperti ini: masukkan deskripsi gambar di sini

Semuanya berfungsi ok, saya menerima beberapa tombol dari keyboard kustom saya. Saya hanya perlu memetakan kembali tombol-tombolnya dengan tepat.

Jadi saya mencoba membuat program yang akan meminta saya untuk menekan adan menjebak kode kunci yang sesuai, dan kemudian dengan semua tombol keyboard kustom saya, untuk akhirnya menghasilkan file xmodmap.

Satu-satunya masalah yang saya miliki adalah bahwa saya tidak tahu bagaimana cara mendapatkan kode kunci itu (dan hanya itu!). Saya mencoba xevtetapi ada terlalu banyak data yang ditampilkan untuk memfilternya.

Saya tahu saya bisa melacak semua kode kunci dengan tangan, tapi saya akan mengubah 10 Minitels, jadi saya lebih suka cara yang lebih cepat!

xavier.seignard
sumber
Bisakah Anda membuang ROM dari Minitel yang Anda miliki, untuk proyek MESS? Perangkat keras itu saat ini rusak dan tentu saja penting secara historis.
sendmoreinfo
kenapa tidak, tapi saya tidak tahu bagaimana melakukannya!
xavier.seignard

Jawaban:

6

Saya berasumsi Anda mencoba melakukan ini di shell atau serupa (kalau tidak, Anda hanya akan menggunakan perpustakaan X secara langsung). Jika demikian, Anda mungkin menemukan xinput --test «device-name»lebih mudah mengurai.

Sayangnya, ini benar-benar tidak bersahabat dengan shell-scripting. Tapi Anda bisa membuatnya bekerja stdbuf. Ini berjalan sampai Anda membunuhnya, tetapi skrip shell Anda dapat mengirimkannya ke pipa read.

Jadi, Anda dapat melakukan sesuatu seperti ini:

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

Anda harus menggunakan nama keyboard yang benar sebagai pengganti "AT Translated Set 2 keyboard". Anda dapat menemukannya dengan 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)]

Sayangnya, Anda harus menggunakan perangkat tertentu — Anda tidak dapat menggunakan keyboard inti.

(Juga, Anda harus menemukan cara untuk membunuh xinput di atas, atau cukup isi diri Anda untuk menekan Control-C ketika Anda telah memasukkan semua kunci. Dan Anda mungkin ingin membuat daftar lebih banyak kunci daripada qwerty. )

derobert
sumber
terima kasih derobert! itu sangat sesuai dengan kebutuhan saya! Saya menggunakan idkeyboard bukan namanya, karena saya memiliki konflik dengan 2 nama yang sama. Jadi di xinput test 18mana 18 adalah id dari keyboard saya.
xavier.seignard
jika saya bisa melakukan hal yang sama dengan perintah yang tidak berjalan lama (yaitu berhenti setelah tombol pertama ditekan dan mengembalikan kode kunci) itu akan menjadi semacam mimpi :)
xavier.seignard
@ xavier.seignard Saya mencoba dan tidak dapat menemukan utilitas yang melakukan itu. Tetapi akan cukup mudah untuk mengambil sumber xinput dan membuatnya berfungsi seperti itu ... periksa test.c, sepertinya fungsi yang relevan print_events. Mungkin xorg akan mengambil tambalan untuk menambahkan bendera untuk berhenti setelah n acara?
derobert
@ xavier.seignard Saya baru saja menemukan cara untuk melakukan itu ... xinput --query-statememberikan kondisi saat ini, dan segera keluar. Anda bisa sibuk melakukannya.
derobert