keyboard tombol remap keras?

19

Saya mencoba menemukan cara untuk memetakan kembali tombol keyboard dengan paksa.
Saya mencoba menggunakan xmodmap dan setxkbmap, tetapi mereka tidak berfungsi untuk satu aplikasi tertentu. Perintah tersebut berfungsi untuk aplikasi berjendela / normal lainnya di Xtho.

Saya pikir aplikasi mungkin membaca data mentah keyboard dan mengabaikan input X?

Jadi, bagaimana cara memetakan kembali kunci tanpa menggunakan xmodmap dan setxkbmap? apakah mungkin dilakukan dengan menggunakan beberapa perangkat lunak.

Saya juga mencoba xkeycaps, xkbcomp, tetapi tidak mencoba loadkeys, karena sedang berjalan di X.

Saya menemukan di sini bahwa saya dapat mencoba setkeycodes, "karena setelah menetapkan kernel kode kunci tombol harus bekerja di xorg" , tetapi saya juga menemukan bahwa "Anda tidak dapat menggunakan 'setkeycodes' pada keyboard USB" , itu kasus saya (saya tertarik pada kasus seseorang membuatnya bekerja pada ps2 karena saya pikir saya bisa menggunakan adaptor).

Ini tampak menjanjikan "Peta scancodes keycode" , tetapi setelah beberapa tes tidak ada yang berubah, berikut adalah mereka:
Saya menemukan kode kunci "36" ("j" kunci) di vt1 dengan showkey
saya menemukan scancode "7e" (keypad ".") Di vt1 denganshowkey --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 .: tidak bekerja dengan: KEYBOARD_KEY_7e=j

Beberapa cara alternatif lain (oleh @ vinc17) untuk menemukan kunci:
evtest /dev/input/by-id/... atau
input-kbd 3(masukkan indeks id ditemukan di ls -l /dev/input/by-id/*dari ex. Event3)

PS .: * Jika Anda tertarik untuk menguji diri Anda, utas terkait untuk aplikasi adalah ini: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ Masalah yang saya miliki adalah sama: beberapa kunci (KP_Decimal, DownArrow, UpArrow, RightArrow) diabaikan dan dianggap semua dengan nilai yang sama di sana "0x00"

Kekuatan Aquarius
sumber
File yang diperbarui seharusnya /etc/udev/hwdb.bin, bukan /lib/udev/hwdb.bin. Tetapi meskipun file ini diperbarui dengan benar, ini juga tidak bekerja untuk saya, bahkan setelah reboot. Mungkin ada yang hilang dalam dokumentasi. Tentang ini: bugs.freedesktop.org/show_bug.cgi?id=82311
vinc17
@ vinc17 itu benar-benar menarik, segera setelah saya bisa saya akan coba lagi, saya pikir kita harus menemukan file pengaturan itu dan mencoba untuk menirunya, thx!
Aquarius Power
1
Masalah saya disebabkan oleh fakta bahwa baris KEYBOARD_KEY_ dimulai dengan 2 spasi alih-alih satu spasi (ini tidak didokumentasikan dan saya tidak mendapatkan pesan kesalahan!). Saya tidak tahu untuk Anda, tetapi dengan keyboard USB saya, showkey --scancodestidak memberikan scancodes yang udev harapkan (nilainya berbeda); yang input-kbdutilitas memberikan scancodes yang benar.
vinc17
1
The evtestutilitas juga harus memberikan scancodes benar: setelah mengetik kunci, Anda harus mendapatkan 2 baris dan yang pertama harus berakhir dengan sesuatu dari bentuk code 4 (MSC_SCAN), value xxx, di mana xxxadalah scancode tersebut. Tetapi driver untuk keyboard saya bermasalah, dan saya tidak mendapatkan MSC_SCANbaris ini untuk beberapa tombol yang ingin saya remap. Itu sebabnya saya menggunakan input-kbd, yang mencantumkan semua scancode untuk perangkat yang dipilih.
vinc17
1
Saya telah mengirim info terperinci dalam sebuah jawaban. Sekarang, saya tidak yakin 36 atau 7002c berfungsi sebagai nilai. Saya pikir Anda memerlukan pengidentifikasi kode kunci. Lihat jawaban saya.
vinc17

Jawaban:

17

Pertama temukan scancode dari kunci yang perlu dipetakan kembali, misalnya dengan evtestutilitas. Baris seperti berikut ini (dengan MSC_SCANdi dalamnya) harus berupa output:

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

diikuti oleh yang kedua memberikan kode kunci saat ini. Jika tidak ada MSC_SCANbaris yang dihasilkan, ini disebabkan oleh bug driver kernel, tetapi scancode masih dapat ditemukan dengan input-kbdutilitas; evtestseharusnya memberikan kode kunci, sehingga mudah untuk menemukan baris yang sesuai dalam input-kbdoutput (misalnya dengan menggunakan grep).

Setelah scancode kunci yang akan dipetakan kembali telah ditentukan, buat file seperti /etc/udev/hwdb.d/98-custom-keyboard.hwdbberisi remappings. Awal file /lib/udev/hwdb.d/60-keyboard.hwdbmemberikan beberapa informasi. Dalam kasus saya (yang berfungsi), saya memiliki:

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

(Sebelum udev 220, saya harus menggunakan keyboard:usb:v05ACp0221*untuk baris pertama.)

The evdev:string harus di awal baris. Perhatikan bahwa huruf dalam vendor dan id produk harus berupa huruf kapital. Setiap KEYBOARD_KEY_pengaturan harus memiliki tepat satu ruang sebelumnya (catatan: garis tanpa spasi akan memberikan pesan kesalahan, dan garis dengan dua spasi diam - diam diabaikan dengan versi udev lama). KEYBOARD_KEY_diikuti oleh scancode dalam heksadesimal (seperti apa yang keduanya evtestdan input-kbdberikan). Nilai yang valid dapat diperoleh dari evtestoutput atau input-kbdoutput, atau bahkan dari /usr/include/linux/input.hfile: misalnya, KEY_102NDakan memberikan 102nd(dengan menghapus KEY_dan mengkonversi ke huruf kecil), yang saya gunakan di atas.

Setelah file disimpan, ketikkan:

udevadm hwdb --update

untuk (kembali) membangun basis data /etc/udev/hwdb.bin(Anda dapat memeriksa stempel waktunya). Kemudian,

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

akan mengambil pengaturan baru ke dalam akun. Anda bisa memeriksanya evtest.

Pada tahun 2014, udev yang dirilis memiliki informasi yang tidak lengkap / bermasalah /lib/udev/hwdb.d/60-keyboard.hwdb, tetapi Anda dapat melihat versi pengembangan terbaru dari file dan / atau laporan bug dan diskusi saya mengenai dokumentasi dan masalah spasi.

Jika ini tidak berhasil, masalahnya mungkin ditemukan setelah meningkatkan sementara tingkat log udevddengan udevadm control(lihat halaman manual udevadm (8) untuk detailnya).

Untuk udevversi lama seperti 204, metode ini harus tetap berfungsi.

vinc17
sumber
Ketika saya menjalankan perintah udevadm, file yang diperbarui adalah /lib/udev/hwdb.bin, saya melihat blessdan KEYBOARD_KEY_70085muncul di bagian akhir. Saya pikir ubuntu 14.04 dikonfigurasi (dilindungi?) Dengan cara ini. Saya mencoba udevadm control --log-priority=debug. berdasarkan lsusb(045e: 0750) keyboard saya suka keyboard:usb:v045ep0750*, tapi saya coba keyboard:usb:v*p*juga. Dugaan saya adalah ini /etc/udev/hwdb.binharus diperbarui tetapi bahkan tidak ada.
Aquarius Power
Ketika saya membaca di sini, itu mungkin seperti saya menggunakan perintah ini udevadm hwdb --usr --update, meskipun saya tidak.
Aquarius Power
Setelah udevadm hwdb --updatesaya disalin /lib/udev/hwdb.binke /etc/udev/hwdb.bindan berlari strace udevadm trigger --sysname-match="event*"dan file hwdb.bintampaknya belum dibaca oleh itu (jika itu adalah seperti karya ini).
Aquarius Power
1
@AquariusPower Ya, mungkin ada bug khusus Ubuntu (Saya menggunakan Debian / tidak stabil). Untuk melihat apakah basis data dibaca saat melakukan udevadm trigger ..., lihat pengujian saya di sini . Perhatikan bahwa sebelum menjalankan udevadm trigger ..., Anda perlu memastikan bahwa waktu modifikasi file telah diperbarui, jika tidak, waktu akses tidak akan diperbarui ketika file dibaca.
vinc17
1
@AquariusPower udevadm --version: 215 (dan versi paket udev: 215-7). Terima kasih udevadm trigger ..., Anda tidak perlu melakukan boot ulang (kecuali Anda ingin menghapus pengaturan, AFAIK). Tetapi Anda mungkin ingin mencoba reboot untuk melihat apakah ada efeknya.
vinc17