Saya mencoba memuat tata letak keyboard baru ketika saya mencolokkan keyboard usb tetapi aturan udev saya tidak berfungsi.
SUBSYSTEM == "input", ATTR {idVendor} == "062a", ATTR {idProduct} == "0201", GOTO = "usb_xmodmap_auto" LABEL = "usb_xmodmap_auto" ACTION == "add", RUN + = "/ usr / bin / xmodmap ~ / .usbXmodmap" AKSI == "hapus", RUN + = "/ usr / bin / xmodmap ~ / .pndXmodmap"
Saya telah memuat ulang aturan menggunakan:
> sudo udevadm control --reload-rules
dan dengan me-restart sistem tetapi ketika saya mencolokkan keyboard usb xmodmap asli masih dimuat dan dengan demikian tata letak keyboard salah, tetapi jika saya menjalankan perintah di terminal
> / usr / bin / xmodmap ~ / .usbXmodmapatau
> / usr / bin / xmodmap ~ / .pndXmodmap
mereka bekerja dengan baik.
semoga soneone bisa membantu.
Edit:
hanya untuk membantu saya menjalankan beberapa tes udevadm:
> tes udevadm --action = add /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10
output:
run_command: calling: test udevadm_test: versi 151 Program ini hanya untuk debugging, tidak menjalankan program apa pun, ditentukan oleh kunci RUN. Ini mungkin menunjukkan hasil yang salah, karena beberapa nilai mungkin berbeda, atau tidak tersedia pada simulasi. [...] parse_file: membaca '/etc/udev/rules.d/usb-keyboard.rules' sebagai file aturan udev_rules_new: aturan menggunakan token 100572 byte (8381 * 12 byte), buffer 21523 byte udev_rules_new: indeks sementara digunakan 35380 byte (1769 * 20 byte) udev_device_new_from_syspath: perangkat 0x3b4d8 memiliki devpath '/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10' udev_rules_apply_to_event: RUN '/ sbin / modprobe -b $ env {MODALIAS}' /etc/udev/rules.d/80-drivers.rules# udev_rules_apply_to_event: RUN 'socket: @ / org / freedesktop / hal / udev_event' /etc/udev/rules.d/90-hal.rules: udev_rules_apply_to_event: RUN '/ sbin / modprobe $ env {MODALIAS}' /etc/udev/rules.d/local.rules:31 udev_rules_apply_to_event: RUN 'socket: / org / kernel / udev / monitor' /etc/udev/rules.d/run.rules: udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .usbXmodmap' /etc/udev/rules.d/usb-keyboard.rules:4 udevadm_test: UDEV_LOG = 6 udevadm_test: DEVPATH = / perangkat / platform / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / input / input10 udevadm_test: PRODUCT = 3 / 62a / 201/110 udevadm_test: NAME = "Keyboard yang sesuai dengan USB" udevadm_test: PHYS = "usb-ehci-omap.0-2.3 / input1" udevadm_test: UNIQ = "" udevadm_test: EV == 1f udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0 udevadm_test: REL == 143 udevadm_test: ABS == 1 0 udevadm_test: MSC == 10 udevadm_test: MODALIAS = input: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,77,80,82,83,85,86,87,88,89,8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1, B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100.101.105.106.107.108.109.1010, 10B, 10C, 162.166.16A, 16E, 178.179.117A, 17B, 17C, 17D, 17.18.180.180 18D, 192.193.195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r0,1,6,8, a20, m4, lsfw udevadm_test: ACTION = add udevadm_test: SUBSYSTEM = input udevadm_test: run: '/ sbin / modprobe -b input: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,80,82,83,85,85,86,87,88,89,89 , 8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A8, A9, AB, AC, AD, AE, B1 , B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100,101,105,106,107,108,109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D, 17D , 17F, 180.181.182.185C, 18D, 192.193.195.1A0.1A1.1A2.1A3.1A4.1A5.1A6.1A7.1A8.1A9.1AA, 1AB, 1AC, 1AD, 1AE, 1B0.1B1.1B7, r0.1 , 6,8, a20, m4, lsfw ' udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: '/ sbin / modprobe input: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,77,80,82,83,85,86,87,88,89,8A , 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1, B2 , B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100,101,105,106,107,108,109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D, 17F , 180.181.182.185.18C, 18D, 192.193.195.1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r0,1,6 , 8, a20, m4, lsfw ' udevadm_test: run: 'socket: / org / kernel / udev / monitor' udevadm_test: run: '/ usr / bin / xmodmap ~ / .usbXmodmap'
dan
> tes udevadm --action = hapus /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10
output:
run_command: calling: test udevadm_test: versi 151 Program ini hanya untuk debugging, tidak menjalankan program apa pun, ditentukan oleh kunci RUN. Ini mungkin menunjukkan hasil yang salah, karena beberapa nilai mungkin berbeda, atau tidak tersedia pada simulasi. [...] parse_file: membaca '/etc/udev/rules.d/usb-keyboard.rules' sebagai file aturan udev_rules_new: aturan menggunakan token 100572 byte (8381 * 12 byte), buffer 21523 byte udev_rules_new: indeks sementara digunakan 35380 byte (1769 * 20 byte) udev_device_new_from_syspath: perangkat 0x3b4d8 memiliki devpath '/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10' udev_rules_apply_to_event: RUN 'socket: @ / org / freedesktop / hal / udev_event' /etc/udev/rules.d/90-hal.rules: udev_rules_apply_to_event: RUN 'socket: / org / kernel / udev / monitor' /etc/udev/rules.d/run.rules: udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .pndXmodmap' /etc/udev/rules.d/usb-keyboard.rules 5-10 udevadm_test: UDEV_LOG = 6 udevadm_test: DEVPATH = / perangkat / platform / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / input / input10 udevadm_test: PRODUCT = 3 / 62a / 201/110 udevadm_test: NAME = "Keyboard yang sesuai dengan USB" udevadm_test: PHYS = "usb-ehci-omap.0-2.3 / input1" udevadm_test: UNIQ = "" udevadm_test: EV == 1f udevadm_test: KEY == 837fff 2c3027 bf004444 0 0 1fe3 c04 a27c000 267bfa d941dfed 9e0000 0 0 0 udevadm_test: REL == 143 udevadm_test: ABS == 1 0 udevadm_test: MSC == 10 udevadm_test: MODALIAS = input: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,77,80,82,83,85,86,87,88,89,8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1, B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100.101.105.106.107.108.109.1010, 10B, 10C, 162.166.16A, 16E, 178.179.117A, 17B, 17C, 17D, 17.18.180.180 18D, 192.193.195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r0,1,6,8, a20, m4, lsfw udevadm_test: ACTION = hapus udevadm_test: SUBSYSTEM = input udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: 'socket: / org / kernel / udev / monitor' udevadm_test: run: '/ usr / bin / xmodmap ~ / .pndXmodmap'
yang tampaknya menunjukkan itu harus berfungsi, tetapi tidak berharap ini membantu mendapatkan jawaban.
Jawaban:
Saya menemukan cara untuk mengatasi hal ini, meskipun sedikit berantakan.
Saya sampai pada titik yang persis sama hari ini dalam mencoba mengatur dua keyboard dengan udev, setxkbmap, dan xinput --list dan agar mereka dapat bekerja dengan hotplugging usb. Saya bertukar tombol di sekitar, tidak mengubah tata letak, tetapi semuanya sama, setelah Anda mengidentifikasi papan ketik di hotplug dan secara kondisional dapat memanggil setxkbmap, maka Anda harus dapat mengatur bahasa hanya papan ketik yang telah Anda tentukan . Daftar tata letak keyboard dapat ditemukan di sini
ls -l /usr/share/kbd/keymaps/i386/
dan Anda dapat menemukan nama perangkat Anda untuk dihubungixinput -list
.rizumu
dengan nama pengguna Anda, karena saya menemukan itu tidak mungkin cara untuk melakukan ini tanpa eksplisit.your
nama keyboard.lsusb
untuk menemukan ID Perangkat Keras yang perlu Anda atur dalam aturan udev. Keyboard das saya terlihat seperti iniBus 002 Device 009: ID 04d9:2013 Holtek Semiconductor, Inc.
Saya pertama kali mengatur aturan udev untuk autodetct keyboard adalah dengan membuat aturan udev:
Dalam file
/etc/udev/rules.d/00-usb-keyboards.rules
:Saya memiliki dua file ~ / bin / kbd dan ~ / bin / kbd_udev. Pastikan mereka memiliki izin yang tepat
chmod 755 ~/bin/kbd*
The
~/bin/kbd_udev
Script berisi:Dan Anda akan melihat bahwa yang dilakukannya hanyalah panggilan
~/bin/kbd
di latar belakang, sehingga udev dapat menyelesaikan prosesnya dan mengaktifkan keyboard. Di dalam~/bin/kbd
script kita tidur sebentar, karena kita perlu menunggu sampai keyboard diaktifkan sehingga kita bisa mendapatkan id perangkat menggunakan xinput. Untuk mencapai hal ini saya telah menetapkan beberapa variabel dan diekspor mereka sehingga setxkbmap XInput dapat melakukan pekerjaan mereka:DISPLAY
,XAUTHORITY
,HOME
, dan satudaskb_id
untuk id dari daskeyboard saya:sumber
notify-send "USB Keyboard is plugged in and ready for use now." -i gtk-dialog-info -t 1000 -u normal
). Karena saya tidak tahu banyak tentang scripting, saya mencoba memasukkannya sebelum atau setelah "fi" tetapi dalam kedua kasus pesan notifikasi terus muncul berulang-ulang :-(OWNER
untuk perangkat ini?xset r rate 200 30
garis?xset
tidak tersedia di instalasi Ubuntu 17.04 saya.xmodmap $HOME/.Xmodmap
menggunakan skrip analog dengan "/ home / rizumu / bin / kbd" Anda. Kenapa bisa begitu?Jika Anda menjalankan GNOME maka Anda harus menonaktifkan plugin manajemen keyboardnya agar tidak menimpa perubahan tata letak Anda.
Jalankan perintah yang sama lagi untuk mengaktifkannya sesuai keinginan.
sumber
dconf
bawah/org/gnome/settings-daemon/plugins/keyboard/active
.gsettings set org.gnome.settings-daemon.plugins.keyboard active false
Ini tidak berfungsi karena
udev
danxmodmap
tidak memiliki akses ke tampilan X11 Anda. Bahkan,udev
bahkan tidak tahu apakah ada yang menampilkan X11 aktif.sumber
Bagaimana dengan konfigurasi X.Org? Dari Gentoo Wiki: X.Org/Input_drivers - udev :
ArchWiki menunjukkan menggunakan sintaks yang sama di xorg.conf tetapi mencatat bahwa "saat ini Anda harus membuat file konfigurasi terpisah, seperti /etc/X11/xorg.conf.d/90-keyboard-layouts.conf". Saya menggunakan Arch dan mengkonfigurasi keyboard USB saya sendiri di /etc/X11/xorg.conf.d/vim 10-evdev.conf yang ada. Bekerja untuk saya.
@rizumu: Kludge yang pintar, terima kasih telah berbagi.
sumber
Bergantung pada distro Anda, Anda mungkin sudah memiliki aturan udev untuk keyboard di /lib/udev/rules.d/64-xorg-xkb.rules. Di Ubuntu, ini mengimpor / etc / default / keyboard, yang memiliki opsi kira-kira seperti ini:
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
Untuk pengaturan saya, saya menemukan bahwa aturan bawaan ini dijalankan setelah aturan udev kustom saya, dan mengesampingkan pengaturan saya. Alih-alih, saya mengubah XKBOPTIONS di / etc / default / keyboard menjadi:
XKBOPTIONS="-option ctrl:nocaps"
Untuk mendapatkan perilaku "Caps Lock is Control" yang saya inginkan di semua keyboard.
sumber
XBKOPTIONS="ctrl:nocaps"
Untuk menjawab pertanyaan Anda tentang mengakses tampilan yang sedang berjalan, Anda dapat mengekspor variabel DISPLAY yang sesuai dalam skrip, dengan asumsi bahwa izin untuk tampilan diatur dengan benar. (
man xset
untuk izin tampilan.)Dalam banyak kasus yang biasa Anda hanya dapat
export DISPLAY=:0
untuk perintah, karena itulah tampilan pertama pada sistem pengguna tunggal. Mungkin paling mudah untuk menjalankan skrip daripada xmodmap secara langsung, karena ini akan memungkinkan Anda untuk memiliki kontrol lebih besar terhadap variabel lingkungan dan sisanya. (Jadi, ganti "/ usr / bin / xmodmap ~ / .usbXmodmap" dalam aturan Anda dengan "/usr/local/bin/keyboard_plug.sh" dan letakkan perintah yang sesuai dalam skrip tersebut bersama dengan variabel DISPLAY.)Seperti yang disebutkan di atas, meskipun, jika Anda mengasumsikan DISPLAY =: 0 maka Anda mungkin mengalami masalah di kemudian hari jika Anda memiliki beberapa pengguna atau tampilan. Anda dapat menulis skrip untuk mendeteksi tampilan yang sesuai, tetapi dalam hal ini Anda melakukannya sendiri (sejauh menyangkut jawaban ini). :)
sumber
Saya rasa saya menemukan cara yang lebih bersih untuk mengkonfigurasi ini, yang tidak memerlukan hack X11 khusus.
Gagasan di balik ini adalah bahwa
udev
hanya akan mendeteksi input keyboard baru dan membuat symlink untuk setiap tata letak, kemudianinotify
akan melihat tata letak baru di userspace.aturan udev
Dengan aturan ini, saya memiliki direktori di bawah dev (
/dev/input/by-layout
) untuk mengawasi perubahan skrip userspace.Skrip Userspace untuk KDE
Misalnya, ketika menggunakan KDE saya menjalankan skrip ini (otomatis):
Ini bekerja seperti pesona bagiku. Untuk mengubah tata letak sistem (yang tidak saya butuhkan saat ini), skrip serupa yang digunakan
loadkeys
dapat di-demonisasi menggunakan skrip init sistem.sumber
inotifywait
untuk menjalankan skrip pengaturan pada perubahan apa pun/dev/input
, karena skrip itu sendiri idempoten.Karena saya tidak bisa membuat peretasan untuk membuat aturan udev bekerja, saya menulis skrip Python kecil
pyudev
untuk memantau masukan acara.Saya kemudian menggunakan file unit pengguna systemd ini untuk membuatnya tetap berjalan (
systemctl --user enable name_of_service_file
):The
inotifywait
solusi dari @ giosh94mhz adalah sedikit lebih sederhana, dan menghindari ketergantungan padapyudev
. Namun, untuk beberapa alasan saya menemukaninotify
acara tersebut tidak dipicu selama 10-20 detik setelah keyboard saya terhubung.sumber