Nachdem ich viel rumgespielt habe, ist es das, was ich jetzt laufen habe. Vielleicht schreibe ich einen kompletten Artikel und veröffentliche den Code in einem Repository, wenn das von Interesse wäre.
Richten Sie einen neuen Regelsatz für udev ein:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
Die Regel soll ein Shell-Skript aufrufen, wenn eine Aktion von einem Gerät mit der angegebenen Kombination aus Anbieter- und Produkt-ID ausgelöst wird.
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
Starten Sie den udev-Dienst nach dem Hinzufügen des neuen Regelsatzes neu:
sudo service udev restart
Hinweis: Ich konnte keine zuverlässigen Ergebnisse erzielen, indem ich spezifischere Übereinstimmungsregeln in dieser Datei angegeben habe. Am wichtigsten ist, dass das Hinzufügen einer ACTION
Übereinstimmungsregel nicht funktioniert hat. Soweit ich das beurteilen kann, wurde das Skript trotzdem ausgelöst. Beim Hinzufügen ACTION=="add"
wird das Skript beim Entfernen des Geräts weiterhin aufgerufen. Sehr seltsam und verwirrend.
Die Aktion, die die udev-Regel ausgelöst hat, steht dem aufgerufenen Skript jedoch zur Verfügung (siehe unten).
Als nächstes das Skript selbst. Nicht ganz. Beachten Sie das wrapper
Suffix im Dateinamen. Dies zeigt an, dass dies nicht das eigentliche Skript ist, sondern ein Wrapper, der das Skript aufruft und im Hintergrund ausführt, damit udev seinen Prozess beenden kann.
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
Die Variable ACTION
enthält die udev-Aktion, die vom Gerät ausgelöst wurde. Es liefert Werte wie add
(Gerät wurde eingesteckt) und remove
(Gerät wurde entfernt). Wir werden diese später verwenden.
~/.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
Ersetzen Sie meinen Benutzernamen durch Ihren, wenn Sie die HOME
Variable setzen ( $(whoami)
funktioniert hier nicht, da dies nicht von Ihrem Benutzer, sondern von aufgerufen wird root
).
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
Zu Testzwecken habe ich einige Zeilen hinzugefügt, die bestimmte Ereignisse in einer Datei in meinem Ausgangsverzeichnis protokollieren, um festzustellen, ob alles funktioniert. Sie können diese sicher entfernen.
Schließlich müssen diese Skripte über Ausführungsberechtigungen verfügen. Es kann auch wichtig sein, zu beachten, dass diese Skripte vom root
Benutzer aufgerufen werden. Seien Sie also vorsichtig, was Sie dort tun.
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh