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"
sumber
/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=82311showkey --scancodes
tidak memberikan scancodes yang udev harapkan (nilainya berbeda); yanginput-kbd
utilitas memberikan scancodes yang benar.evtest
utilitas juga harus memberikan scancodes benar: setelah mengetik kunci, Anda harus mendapatkan 2 baris dan yang pertama harus berakhir dengan sesuatu dari bentukcode 4 (MSC_SCAN), value xxx
, di manaxxx
adalah scancode tersebut. Tetapi driver untuk keyboard saya bermasalah, dan saya tidak mendapatkanMSC_SCAN
baris ini untuk beberapa tombol yang ingin saya remap. Itu sebabnya saya menggunakaninput-kbd
, yang mencantumkan semua scancode untuk perangkat yang dipilih.Jawaban:
Pertama temukan scancode dari kunci yang perlu dipetakan kembali, misalnya dengan
evtest
utilitas. Baris seperti berikut ini (denganMSC_SCAN
di dalamnya) harus berupa output:diikuti oleh yang kedua memberikan kode kunci saat ini. Jika tidak ada
MSC_SCAN
baris yang dihasilkan, ini disebabkan oleh bug driver kernel, tetapi scancode masih dapat ditemukan denganinput-kbd
utilitas;evtest
seharusnya memberikan kode kunci, sehingga mudah untuk menemukan baris yang sesuai dalaminput-kbd
output (misalnya dengan menggunakangrep
).Setelah scancode kunci yang akan dipetakan kembali telah ditentukan, buat file seperti
/etc/udev/hwdb.d/98-custom-keyboard.hwdb
berisi remappings. Awal file/lib/udev/hwdb.d/60-keyboard.hwdb
memberikan beberapa informasi. Dalam kasus saya (yang berfungsi), saya memiliki:(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. SetiapKEYBOARD_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 keduanyaevtest
daninput-kbd
berikan). Nilai yang valid dapat diperoleh darievtest
output atauinput-kbd
output, atau bahkan dari/usr/include/linux/input.h
file: misalnya,KEY_102ND
akan memberikan102nd
(dengan menghapusKEY_
dan mengkonversi ke huruf kecil), yang saya gunakan di atas.Setelah file disimpan, ketikkan:
untuk (kembali) membangun basis data
/etc/udev/hwdb.bin
(Anda dapat memeriksa stempel waktunya). Kemudian,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
udevd
denganudevadm control
(lihat halaman manual udevadm (8) untuk detailnya).Untuk
udev
versi lama seperti 204, metode ini harus tetap berfungsi.sumber
/lib/udev/hwdb.bin
, saya melihatbless
danKEYBOARD_KEY_70085
muncul di bagian akhir. Saya pikir ubuntu 14.04 dikonfigurasi (dilindungi?) Dengan cara ini. Saya mencobaudevadm control --log-priority=debug
. berdasarkanlsusb
(045e: 0750) keyboard saya sukakeyboard:usb:v045ep0750*
, tapi saya cobakeyboard:usb:v*p*
juga. Dugaan saya adalah ini/etc/udev/hwdb.bin
harus diperbarui tetapi bahkan tidak ada.udevadm hwdb --usr --update
, meskipun saya tidak.udevadm hwdb --update
saya disalin/lib/udev/hwdb.bin
ke/etc/udev/hwdb.bin
dan berlaristrace udevadm trigger --sysname-match="event*"
dan filehwdb.bin
tampaknya belum dibaca oleh itu (jika itu adalah seperti karya ini).udevadm trigger ...
, lihat pengujian saya di sini . Perhatikan bahwa sebelum menjalankanudevadm trigger ...
, Anda perlu memastikan bahwa waktu modifikasi file telah diperbarui, jika tidak, waktu akses tidak akan diperbarui ketika file dibaca.udevadm --version
: 215 (dan versi paket udev: 215-7). Terima kasihudevadm trigger ...
, Anda tidak perlu melakukan boot ulang (kecuali Anda ingin menghapus pengaturan, AFAIK). Tetapi Anda mungkin ingin mencoba reboot untuk melihat apakah ada efeknya.