GNU/Linux >> Belajar Linux >  >> Linux

Cara memetakan ulang kunci di Linux hanya untuk keyboard tertentu

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:

  1. 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 jalankan systemd-hwdb update untuk membangun kembali database dan udevadm trigger menerapkannya tanpa reboot.

  2. 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.)


Linux
  1. Linux – Tombol Remap Keras Keyboard?

  2. Linux – Bagaimana Cara Mendapatkan Kata Tertentu Dan Mengambil Teks?

  3. Cara Mengatur kunci SSH untuk login ssh "tanpa kata sandi" di Linux

  1. Cara menggunakan ekspansi shell untuk menghasilkan token shell di Linux

  2. Cara Setup SSH keys untuk SSH "public/private key" Login Di Linux

  3. Bagaimana Anda membedakan direktori hanya untuk file dari jenis tertentu?

  1. cara mengetahui nomor Interrupt/GPIO untuk pin tertentu di linux

  2. Cara mengatur ID proses di Linux untuk program tertentu

  3. Pada Keyboard Apple di Linux, bagaimana cara membuat tombol Fungsi berfungsi tanpa tombol pengubah fn?