หลังจากเล่นซอไปเยอะแล้วนี่คือสิ่งที่ฉันต้องทำตอนนี้ บางทีฉันอาจจะเขียนบทความที่แปลกประหลาดและเผยแพร่รหัสภายในที่เก็บถ้ามันน่าสนใจ
ตั้งค่ากฎใหม่ตั้งไว้สำหรับ 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
คำต่อท้ายในชื่อไฟล์ สิ่งนี้บ่งชี้ว่านี่ไม่ใช่สคริปต์จริง แต่เป็น 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