Після того, як я багато обернувся, я зараз бігаю. Можливо, я напишу повну статтю сортів і опублікую код у сховищі, якщо це буде цікаво.
Налаштуйте новий набір правил для 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