#!/bin/bash
set -euo pipefail
# Based on https://aur.archlinux.org/packages/us_da-layout/
evdev_rules=/usr/share/X11/xkb/rules
evdev_xml=$evdev_rules/evdev.xml
evdev=$evdev_rules/evdev
ibus_file=/usr/share/ibus/component/simple.xml
set_permissions_and_move() {
tmp_file="$1"
dest_file="$2"
chown --reference="$dest_file" "$tmp_file"
chmod --reference="$dest_file" "$tmp_file"
mv "$tmp_file" "$dest_file"
}
register() {
register_evdev
register_ibus
}
unregister() {
unregister_evdev
unregister_ibus
}
register_evdev() {
if grep -q neolight "$evdev_xml"; then
echo "Neolight already found in $evdev_xml"
else
echo "Adding neolight to $evdev_xml"
read -r -d '' layout <<-EOF || true
neolight
de
German (Neolight)
deu
de_escape_keys
German (Neolight, additional escape keys)
EOF
evdev_xml_tmp="$(mktemp)"
awk -v layout="$layout" \
'{ print }
// { print layout }' \
"$evdev_xml" > "$evdev_xml_tmp" \
&& set_permissions_and_move "$evdev_xml_tmp" "$evdev_xml"
fi
if grep -q neolight "$evdev"; then
echo "Neolight already found in $evdev"
else
echo "Adding neolight to $evdev"
evdev_tmp="$(mktemp)"
cat "$evdev" > "$evdev_tmp" || true
cat <<-EOF >> "$evdev_tmp"
// BEGIN neolight
! option = symbols
neolight = +neolight(layers)
neolight:escape_keys = +neolight(layers)+neolight(escape_keys)
neolight:jp = +neolight(jp)
// END neolight
EOF
set_permissions_and_move "$evdev_tmp" "$evdev"
fi
}
unregister_evdev() {
evdev_xml_tmp="$(mktemp)"
awk \
'BEGIN { f=1 }
/BEGIN neolight/ { f=0 }
/END neolight/ { f=1; next }
f' \
"$evdev_xml" > "$evdev_xml_tmp" \
&& set_permissions_and_move "$evdev_xml_tmp" "$evdev_xml"
evdev_tmp="$(mktemp)"
awk \
'BEGIN { f=1 }
/BEGIN neolight/ { f=0 }
/END neolight/ { f=1; next }
f' \
"$evdev" > "$evdev_tmp" \
&& set_permissions_and_move "$evdev_tmp" "$evdev"
}
register_ibus() {
if [[ ! -f "$ibus_file" ]]; then
echo "No ibus file found. Skipping."
return
elif grep -q neolight "$ibus_file"; then
echo "Neolight already found in $ibus_file"
else
echo "Adding neolight to $ibus_file"
read -r -d '' engines <<-EOF || true
xkb:de:neolight:deu
de
neolight
German (Neolight)
German (Neolight)
ibus-keyboard
1
xkb:de:neolight_escape_keys:deu
de
neolight
de_escape_keys
German (Neolight, additional escape keys)
German (Neolight, additional escape keys)
ibus-keyboard
1
EOF
ibus_tmp="$(mktemp)"
awk -v engines="$engines" \
'{ print }
// { print engines }' \
"$ibus_file" > "$ibus_tmp" \
&& set_permissions_and_move "$ibus_tmp" "$ibus_file"
fi
}
unregister_ibus() {
[[ ! -f "$ibus_file" ]] \
&& return
ibus_tmp="$(mktemp)"
awk \
'BEGIN { f=1 }
/BEGIN neolight/ { f=0 }
/END neolight/ { f=1; next }
f' \
"$ibus_file" > "$ibus_tmp" \
&& set_permissions_and_move "$ibus_tmp" "$ibus_file"
}
case "${1:-}" in
"")
register;;
--unregister)
unregister;;
-h|--help|*)
echo "Usage: register-neolight.sh [--unregister]";;
esac