Çok uğraştıktan sonra, şimdilik bu var. Belki bir tür makale yazacağım ve ilgimi çekerse kodu bir depoda yayınlayacağım.
Udev için şu şekilde yeni bir kural seti oluşturun:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
Kural, verilen satıcı ve ürün kimliği kombinasyonuna sahip bir cihaz tarafından bazı eylemler tetiklendiğinde bir kabuk komut dosyası çağırması gerekir.
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
Yeni kural kümesini ekledikten sonra udev hizmetini yeniden başlatın:
sudo service udev restart
Not: Bu dosyada daha spesifik eşleme kuralları sağlayarak güvenilir sonuçlar elde edemedim. En önemlisi, ACTION
eşleşen bir kural eklemek işe yaramadı. Bildiğim kadarıyla, senaryo yine de tetiklendi. Ekleme ACTION=="add"
sırasında, aygıt kaldırıldıktan sonra komut dosyası çağrılır. Çok garip ve kafa karıştırıcı.
Ancak udev kuralını tetikleyen eylem, çağrılan komut dosyası için aşağıda gösterildiği gibi kullanılabilir.
Sonra, komut dosyasının kendisi. Pek iyi değil. wrapper
Dosya adındaki soneki not edin . Bu, bunun gerçek komut dosyası değil, komut dosyasını çağıran ve arkaplanda yürüten bir sarmalayıcı olduğunu gösterir, böylece udev işlemi tamamlayabilir.
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
Değişken ACTION
, cihaz tarafından tetiklenen udev işlemini içerir. add
(Cihaz takıldı) ve remove
(cihaz çıkarıldı) gibi değerler verir . Bunları daha sonra kullanacağız.
~/.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
HOME
Değişkeni ayarlarken kullanıcı adımı sizinkiyle değiştirin ( $(whoami)
burada kullanılamaz, çünkü bu sizin kullanıcınız tarafından çağrılmayacaktır root
).
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
Test amacıyla, her şeyin işe yarayıp yaramadığını görmek için ana dizindeki bir dosyaya belirli olayları kaydeden bazı satırlar ekledim. Bunları güvenle kaldırabilirsiniz.
Son olarak, bu komut dosyalarının yürütme izinlerine sahip olması gerekir. Ayrıca, bu komut dosyalarının root
kullanıcı tarafından çağrılacağını unutmayın, bu yüzden orada ne yaptığınıza dikkat edin.
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh