#!/bin/bash set -euo pipefail # Based on https://aur.archlinux.org/packages/us_da-layout/ script_dir=$(dirname "$0") source "$script_dir/find-xkeyboard-config-dir.sh" evdev_rules="$xkeyboard_config_dir/rules" evdev_xml=$evdev_rules/evdev.xml evdev=$evdev_rules/evdev types_file="$xkeyboard_config_dir/types/complete" 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() { # Remove any potentially outdated entries first unregister register_evdev register_types register_ibus } unregister() { unregister_evdev unregister_types 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) DE deu de_escape_keys German (Neolight + escape keys) EOF read -r -d '' options <<-EOF || true neolight Neolight EOF evdev_xml_tmp="$(mktemp)" awk -v layout="$layout" -v options="$options" \ '{ print } // { print layout } // { print options }' \ "$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 { printing=1 } /BEGIN neolight/ { printing=0 } /END neolight/ { printing=1; next } printing' \ "$evdev_xml" > "$evdev_xml_tmp" \ && set_permissions_and_move "$evdev_xml_tmp" "$evdev_xml" evdev_tmp="$(mktemp)" awk \ 'BEGIN { printing=1 } /BEGIN neolight/ { printing=0 } /END neolight/ { printing=1; next } printing' \ "$evdev" > "$evdev_tmp" \ && set_permissions_and_move "$evdev_tmp" "$evdev" } register_types() { if grep -q neolight "$types_file"; then echo "Neolight already found in $types_file" else echo "Adding neolight to $types_file" value=' include "neolight"' types_file_tmp="$(mktemp)" awk -v value="$value" \ '/};/ { print value } { print }' \ "$types_file" > "$types_file_tmp" \ && set_permissions_and_move "$types_file_tmp" "$types_file" fi } unregister_types() { types_file_tmp="$(mktemp)" awk '!/neolight/' \ "$types_file" > "$types_file_tmp" \ && set_permissions_and_move "$types_file_tmp" "$types_file" } 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 { printing=1 } /BEGIN neolight/ { printing=0 } /END neolight/ { printing=1; next } printing' \ "$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