Setelah banyak mengutak-atik, inilah yang saya jalankan sekarang. Mungkin saya akan menulis artikel yang lengkap dan menerbitkan kode dalam repositori, jika itu menarik.
Siapkan aturan baru yang ditetapkan untuk udev seperti itu:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
Aturan seharusnya memanggil skrip shell setiap kali beberapa tindakan dipicu oleh perangkat dengan kombinasi yang diberikan vendor dan ID produk.
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
Setelah menambahkan set aturan baru, restart layanan udev:
sudo service udev restart
Catatan: Saya tidak dapat mencapai hasil yang dapat diandalkan dengan memberikan aturan pencocokan yang lebih spesifik dalam file itu. Paling signifikan, menambahkan ACTION
aturan yang cocok tidak berhasil. Sejauh yang saya tahu, skrip itu dipicu pula. Saat menambahkan ACTION=="add"
, skrip masih akan dipanggil saat melepas perangkat. Sangat aneh dan membingungkan.
Namun tindakan yang memicu aturan udev akan tersedia untuk skrip yang dipanggil seperti yang ditunjukkan di bawah ini.
Selanjutnya, skrip itu sendiri. Ya tidak cukup. Perhatikan wrapper
akhiran dalam nama file. Ini menunjukkan bahwa ini bukan skrip aktual tetapi pembungkus yang memanggil skrip dan menjalankannya di latar belakang sehingga udev dapat menyelesaikan prosesnya.
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
Variabel ACTION
berisi tindakan udev yang dipicu oleh perangkat. Ini menghasilkan nilai seperti add
(perangkat dicolokkan) dan remove
(perangkat dihapus). Kami akan menggunakannya nanti.
~/.bin/switch-kb-layout.sh
:
#!/bin/sh
sleep 1
# Some environment variables that need to be set in order to run `setxkbmap`
DISPLAY=":0.0"
HOME=/home/phil
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
udev_action=$1
log_file="$HOME/switch-kb-layout.log"
if [ "${udev_action}" != "add" ] && [ "${udev_action}" != "remove" ]; then
echo "Other action. Aborting." >> $log_file
exit 1
fi
internal_kb_layout="de"
internal_kb_variant=""
external_kb_layout="us"
external_kb_variant="altgr-intl"
kb_layout=""
kb_variant=""
if [ "${udev_action}" = "add" ]; then
kb_layout=$external_kb_layout
kb_variant=$external_kb_variant
elif [ "${udev_action}" = "remove" ]; then
kb_layout=$internal_kb_layout
kb_variant=$internal_kb_variant
fi
setxkbmap -layout "${kb_layout}"
echo "set layout:" "$kb_layout" >> $log_file
if [ ! -z "${kb_variant}" ]; then
setxkbmap -variant "${kb_variant}"
echo "set variant:" "$kb_variant" >> $log_file
fi
Ganti nama pengguna saya dengan milik Anda saat mengatur HOME
variabel ( $(whoami)
tidak akan berfungsi di sini, karena ini tidak akan dipanggil oleh pengguna Anda tetapi oleh root
).
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
Untuk tujuan pengujian, saya menambahkan beberapa baris yang mencatat peristiwa tertentu ke file di direktori home saya untuk melihat apakah semuanya berfungsi. Anda dapat menghapus ini dengan hemat.
Akhirnya, skrip ini harus memiliki izin eksekusi. Mungkin juga penting untuk dicatat bahwa skrip ini akan dipanggil oleh root
pengguna, jadi berhati-hatilah dengan apa yang Anda lakukan di sana.
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh