#!/bin/sh
# Copyright 2008 Bernd Steinhauser <berniyh@exherbo.org>
# Copyright 2008 Benjamin Kellermann
# Copyright 2008 Pascal Hauck
# Copyright 2008 Erik Streb del Toro
# Distributed under the terms of the GNU General Public License v3

# colour definitions
normal="\033[0m"
red="\033[31m"
orange="\033[33m"
green="\033[32m"

if [ "foo`echo -e bar`" = "foobar" ];then
  # GNU echo
  ECHO_e="echo -e"
else
  # POSIX echo
  ECHO_e="echo"
fi

# Default values
STD_X_VARIANTE=${STD_X_VARIANTE:-xkbmap}
STD_XKBMAP=${STD_XKBMAP:-de}
STD_XKBVARIANT=${STD_XKBVARIANT:-nodeadkeys}
STD_XMODMAP=${STD_XMODMAP:-""}
STD_CONSOLE_KEYMAP="${STD_CONSOLE_KEYMAP:-de-latin1-nodeadkeys}"
NUM_LOCK_STATUS=${NUM_LOCK_STATUS:-on}

die() {
	$ECHO_e "${red}$@${normal}" >&2
	$ECHO_e "${red}Die Belegung konnte nicht geändert werden.${normal}" >&2
	exit 1
}

set_xmodmap() {
	if [ -f "$@" ]; then
		xmodmap "$@" || die "Fehler beim Laden der Xmodmap $@."
	else
		die "Die Xmodmap-Datei ${orange}$@${red} gibt es nicht." 
	fi
}

set_xkbmap() {
	setxkbmap "$@" || die "Die xkbmap ${orange}$@${red} wurde nicht gefunden."
}

set_keymap() {
	if [ "${EUID}" = 0 ]; then
		loadkeys "$@" || die "Fehler beim Laden der Keymap ${orange}$@${red}." 
	else
		sudo loadkeys "$@" || die "Fehler bei der Verwendung von ${orange}sudo${red}, um die Belegung zu ändern." 
	fi
}

help() {
cat <<HELP
Aufruf: $0 [-q] [Standard-X-Variante]
Aktiviert die Standard-Tastaturbelegung.

  NEO-X-Variante:
  xkmbap	in den meisten Fällen richtig (Standardeinstellung)
  xmodmap	nur sinnvoll, wenn eine eigene Xmodmap als Standardbelegung verwendet wird

  Das Skript erkennt, falls sich der Benutzer nur auf einer Textkonsole befindet 
  und ändert auch dort die Belegung (hierfür sind allerdings Rootrechte erforderlich!)

  -q, --quiet		gibt – abgesehen von Fehlern – keine Meldungen aus

Homepage: http://neo-layout.org/
HELP
exit 0
}

if [ -f "${NEO_CONFIG}" ]; then
	. "${NEO_CONFIG}" || die "Fehler beim Verwenden der Konfigurationsdatei ${NEO_CONFIG}"
elif [ -f "${HOME}"/.neorc ]; then
	. "${HOME}"/.neorc || die "Fehler beim Verwenden der Konfigurationsdatei ${HOME}/.neorc"
elif [ -f /etc/neo.conf ]; then
	. /etc/neo.conf || die "Fehler beim Verwenden der Konfigurationsdatei /etc/neo.conf"
else
	$ECHO_e "${red}Keine Konfigurationsdatei für NEO gefunden.\nDas Verwenden der Standardwerte kann fehlschlagen!${normal}" >&2
fi

if [ -n "$SSH_CONNECTION" ]; then
	die "In einer ssh-session kann die Belegung nicht geändert werden."
fi

while [ ! -z "$1" ]; do
	case $1 in
		-h | --help )
			help
			;;
		-q | --quiet )
			quiet=1
			;;
		* )
			STD_X_VARIANTE=${1-$STD_X_VARIANTE}
			shift $#
			;;
	esac
	shift
done

if [ -z ${DISPLAY} ]; then
	set_keymap "${STD_CONSOLE_KEYMAP}"

	if [ "${NUM_LOCK_STATUS}" = "on" ]; then
		setleds -num || $ECHO_e "${orange}Fehler beim setzen des Status von NumLock.${normal}" >&2
	else
		setleds +num || $ECHO_e "${orange}Fehler beim setzen des Status von NumLock.${normal}" >&2
	fi

else
	for modifier in 51 94; do
		xset r ${modifier} || $ECHO_e "${orange}Fehler beim Wiederherstellen von Autorepeat beim Modifier ${modifier}.${normal}" >&2
	done
	for deadkey in 21 35 49; do
		xset r ${deadkey} || $ECHO_e "${orange}Fehler beim Wiederherstellen von Autorepead bei der toten Taste ${deakey}.${normal}" >&2
	done


	case "${STD_X_VARIANTE}" in
		xkbmap)
			[ $quiet ] || echo "Die Standardbelegung wird geladen…"
			set_xkbmap "${STD_XKBMAP}" "${STD_XKBVARIANT}"
			;;
		xmodmap)
			if [ "${STD_XMODMAP}" ]; then
				[ $quiet ] || echo "Die Standard-Xmodmap wird geladen…"
				set_xmodmap "${STD_XMODMAP}"
			else
				$ECHO_e "${red}Es wurde keine Standard-Xmodmap definiert.${normal}" >&2
				die "In der Regel ist ${green}uiae${red} ohne weitere Angaben erfolgreich."
			fi
			;;
		*)
			die "${orange}${STD_X_VARIANTE}${red} ist eine unbekannte X-Variante der NEO-Belegung."
			;;
	esac

	if [ "${NUM_LOCK_STATUS}" = "on" ]; then
		numlockx on || $ECHO_e "${orange}Fehler beim setzen des Status von NumLock.${normal}" >&2
	else
		numlockx off || $ECHO_e "${orange}Fehler beim setzen des Status von NumLock.${normal}" >&2
	fi
fi

if [ ! "$quiet" ]; then
	echo
	echo "Die Tastaturbelegung wurde auf die Standardbelegung geändert."
	$ECHO_e "Durch ${green}asdf${normal} kehrt man wieder zur NEO-Belegung zurück."
fi
