बहुत कुछ करने के बाद, मैं अब इसके लिए दौड़ रहा हूं। हो सकता है कि मैं एक तरह का पूरा लेख लिखूं और एक रिपॉजिटरी के भीतर कोड प्रकाशित कर दूं, अगर वह रुचि का होगा।
Udev के लिए एक नया नियम सेट करें जैसे:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
नियम को शेल स्क्रिप्ट को कॉल करने के लिए माना जाता है, जब भी किसी उपकरण को विक्रेता और उत्पाद आईडी के संयोजन के साथ कुछ कार्रवाई शुरू होती है।
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
नया नियम सेट जोड़ने के बाद, udev सेवा को फिर से शुरू करें:
sudo service udev restart
नोट: मैं उस फ़ाइल में अधिक विशिष्ट मिलान नियम प्रदान करके विश्वसनीय परिणाम प्राप्त करने में सक्षम नहीं था। सबसे महत्वपूर्ण बात, एक ACTION
मिलान नियम जोड़ने से काम नहीं चला। जहाँ तक मैं बता सकता हूँ, पटकथा को वैसे भी ट्रिगर किया गया था। जोड़ते समयACTION=="add"
, तो स्क्रिप्ट को डिवाइस को हटाने के बाद भी बुलाया जाएगा। बहुत अजीब और भ्रमित करने वाला।
हालाँकि , udev नियम को ट्रिगर करने वाली क्रिया को नीचे दी गई स्क्रिप्ट के अनुसार उपलब्ध स्क्रिप्ट में उपलब्ध किया जाएगा।
इसके बाद, स्क्रिप्ट ही। खैर, बिल्कुल नहीं। wrapper
फ़ाइल नाम में प्रत्यय नोट करें। यह इंगित करता है कि यह वास्तविक स्क्रिप्ट नहीं है बल्कि एक आवरण है जो स्क्रिप्ट को कॉल करता है और इसे पृष्ठभूमि में निष्पादित करता है ताकि udev इस प्रक्रिया को समाप्त कर सके।
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
चर ACTION
में डिवाइस द्वारा ट्रिगर की गई udev कार्रवाई शामिल है। यह मानों को पैदावार देता है जैसे add
(डिवाइस प्लग किया गया था) और remove
(डिवाइस को हटा दिया गया था)। हम बाद में इनका उपयोग करेंगे।
~/.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
चर सेट करते समय मेरे उपयोगकर्ता नाम को अपने साथ बदलें ( $(whoami)
यहां काम नहीं करेगा, क्योंकि यह आपके उपयोगकर्ता द्वारा नहीं बल्कि द्वारा कहा जाएगा root
)।
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
परीक्षण के उद्देश्य के लिए, मैंने कुछ पंक्तियाँ जोड़ीं जो कुछ घटनाओं को मेरे घर निर्देशिका में एक फ़ाइल में लॉग करती हैं यह देखने के लिए कि क्या सब कुछ काम करता है। आप इन्हें आसानी से हटा सकते हैं।
अंत में, इन लिपियों के लिए निष्पादन की अनुमति होना आवश्यक है। यह भी ध्यान रखना महत्वपूर्ण है कि इन लिपियों को root
उपयोगकर्ता द्वारा बुलाया जाएगा , इसलिए सावधान रहें कि आप वहां क्या करते हैं।
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh