많은 것을 둘러 본 후에, 이것은 내가 지금 달리고있는 것입니다. 아마도 완전한 종류의 기사를 작성하고 관심있는 저장소에 코드를 게시 할 것입니다.
다음과 같이 udev에 대한 새 규칙 세트를 설정하십시오.
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
벤더와 제품 ID의 주어진 조합을 가진 장치에 의해 어떤 동작이 트리거 될 때마다 규칙은 쉘 스크립트를 호출해야합니다.
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