Ya, itu mungkin menggunakan XKB. Tidak seperti xmodmap, XKB dapat memetakan ulang kunci Anda untuk masing-masing perangkat.
Catatan:Pastikan Anda memiliki xkbcomp> 1.2.0
Pertama, daftarkan perangkat Anda dengan:
xinput list
Anda akan mendapatkan sesuatu seperti ini:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen Pen stylus id=11 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen Finger touch id=12 [slave pointer (2)]
⎜ ↳ Logitech USB-PS/2 Optical Mouse id=13 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen Pen eraser id=14 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen Finger pad id=15 [slave pointer (2)]
⎜ ↳ GASIA USB KB V11 id=17 [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)]
↳ G19 Gaming Keyboard id=8 [slave keyboard (3)]
↳ G19 Gaming Keyboard id=9 [slave keyboard (3)]
↳ Logitech G19 Gaming Keyboard id=10 [slave keyboard (3)]
↳ GASIA USB KB V11 id=16 [slave keyboard (3)]
Identifikasi string perangkat Anda dan edit skrip shell berikut, ubah baris sed dengan yang sesuai dengan nama perangkat Anda. Kemudian ubah kunci yang perlu dipetakan ulang.
Contoh:Muat xev
dan tekan tombol yang ingin Anda petakan ulang. Misalkan Anda menemukan kode kunci 84. Cari 84 di https://Gist.github.com/zoqaeski/3880640. Nama kuncinya adalah <KP5>
. Kemudian cari kunci yang ingin Anda ganti (di tautan yang sama, lebih jauh di bawah) dan salin apa yang ada di dalam tanda kurung. Ulangi proses untuk semua kunci yang Anda inginkan.
remote_id=$(
xinput list |
sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit
# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control
mkdir -p /tmp/xkb/symbols
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
cat >/tmp/xkb/symbols/custom <<\EOF
xkb_symbols "remote" {
key <KP5> { [ KP_Right, KP_6, U2192, U21D2 ] };
key <I129> { [ KP_Down, KP_2, U2193, U21D3 ] };
key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ] };
key <LFSH> { [ Control_L ] };
};
EOF
# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
# we used above, in this case it's the "remote" definition
# described in the file named "custom" which we specify in
# this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
# keyboard. This includes the file we just made, read in last,
# so as to override any prior definitions. Importantly we
# need to include the directory of the place we placed the file
# to be considered when reading things in.
#
# Also notice that we aren't including exactly the
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
#
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
setxkbmap -device $remote_id -print \
| sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' \
| xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null
Kemudian sumbernya (Anda dapat menambahkannya ke .xinitrc Anda). Semua selesai! Sekarang menekan tombol harus menghasilkan keluaran yang diinginkan, hanya untuk perangkat yang Anda tentukan.
Edit :Baru-baru ini, saya menyadari bahwa, untuk beberapa alasan, konfigurasi baru tidak segera diterapkan. Anda harus menekan tombol di lain Anda terlebih dahulu keyboard, lalu uji tombol yang dikonfigurasi pada keyboard yang dimodifikasi. Saya tidak tahu mengapa ini terjadi, mungkin semacam cache.
Untuk siapa pun yang datang ke sini dari Google dan menginginkan jawaban yang lebih sesuai dengan apa yang awalnya diharapkan oleh penanya, saya mengetahui dua cara untuk memetakan ulang acara di evdev
tingkat sehingga perubahan berlaku untuk semua aplikasi:
-
udev menyediakan API untuk memodifikasi entri basis data perangkat keras yang mengontrol pemetaan antara kode pindaian dan kode kunci. Halaman ArchiWiki ini, yang berisi petunjuk, secara eksplisit menyatakan bahwa ini akan berfungsi untuk input X11 dan konsol.
Intinya adalah Anda membuat entri khusus di
/etc/udev/hwdb.d/
yang terdiri dari pola pencocokan perangkat dan beberapa definisi pemetaan ulang scancode-to-keycode, lalu jalankansystemd-hwdb update
untuk membangun kembali database danudevadm trigger
menerapkannya tanpa reboot. -
Mengingat bahwa Wayland tidak menggunakan subsistem keyboard X11 dan penyusun utama Wayland seperti GNOME Shell dan Weston tidak mengimplementasikan UI untuk mengonfigurasi aspek libinput yang relevan, seseorang menulis daemon bernama evdevremapkeys yang menyelesaikan masalah serupa dengan driver ruang pengguna G15Daemon untuk Logitech Keyboard game G15.
(Itu menelan peristiwa yang ingin dipetakan ulang, jadi tidak ada hal lain yang mendengarkan di perangkat yang dapat melihatnya, lalu memancarkan peristiwa yang diperbaiki melalui
uinput
API untuk membuat perangkat input level kernel dari userspace.)