#!/bin/bash
# Copyright 2008 Pascal Hauck <pascal.hauck@web.de>

# NEO-Tastaturbelegung

# ======= Installation =======
# Um NEO auf Ihrem System zu (dauerhaft oder testweise) zu installieren, genügt es, dieses Skript auszuführen
# z.B. in der Konsole die folgenden beiden Zeilen eingeben:
# chmod u+x installiere_neo
# ./installiere_neo
# Für die restliche Installation werden mehrere Optionen angeboten.
# Nach der Installation und Eingabe von ›. starte_neo‹ oder nach dem nächsten Login ist:
# • ein Wechsel von NEO zu QWERTZ jederzeit mit ›uiae‹ leicht möglich und
# • ein Wechsel von QWERTZ zu NEO jederzeit mit ›asdf‹ ebenso leicht möglich.

# Wenn NEO nicht automatisch nach dem Login gestartet werden soll, genügt es, vor die Zeile
# asdf			# mit einem # am Zeilenanfang bleibt QWERTZ das Standardlayout, sonst ist es NEO
# in der Datei $HOME/.profile ein # zu setzen
# Alternativ kann das Skript ›installiere_neo‹ ein weiteres Mal aufgerufen werden.
# ==============================


# ======= Deinstallation =======
# Um NEO wieder zu deinstallieren, kann das Skript ›installiere_neo‹ ein weiteres Mal aufgerufen werden.
# ==============================


# ========= Inhalte ============
# Das Ausführen dieses Skripts erzeugt auf einfache Weise eine vollständige und saubere Installation für einen Benutzer eines Linuxsystems.
# Die beinhalteten Komponenten sind:
# • Xmodmap-Tastaturbelegung
# • Textkonsolenbelegung
# • Compose-Erweiterung von NEO
# • die Skripte ›asdf‹, ›uiae‹, um die Belegung zwischen NEO und QWERTZ zu wechseln
# • die Skripte ›num‹ und ›neo‹, um ein Bild der Tastatur zu erzeugen
# • die Referenz
# • die Skripte ›wiemitneo‹ und ›beschreibe‹, um nach Erzeugungsmöglichkeit von Zeichen zu suchen
# • die Konfigurationsdatei neorc.conf
# ==============================

# ======= Bemerkungen ==========
# Es wird immer das Standardverzeichnis $inst_dir verwendet.
# Es gibt keine graphische Installation.
# Dennoch kann dieses Skrip helfen, NEO auf eine einfache Weise zu installieren.
# Dieses Skript wird mit der Zeit verbessert werden.
# ==============================


inst_dir=$HOME/neo


# colours in the Bash
normal="\033[0m"
red="\033[31m"
orange="\033[33m"
green="\033[32m"

# remove the entry in $HOME/.profile
rmfromprofile()
{
	grep -v "\# NEO Tastaturbelegung" $HOME/.profile > $HOME/profile.neo.tmp
	rm /$HOME/.profile
	mv $HOME/profile.neo.tmp $HOME/.profile
}

# create directories, files and entries
create()
{
	if [ -f $2 ]					# if already exists
	then
		echo -e "Die Datei ${red}$2${normal} gibt es bereits – soll die bestehende Datei überschrieben werden? \c"; read -p "[J,N] " -e overwrite
		if [ "$overwrite" = "J" ]		# overwrite?
		then
			echo "Datei $2 wird überschrieben!"
			rm -f $2			# remove if user wants to overwrite
		else
			echo -e "Datei ${red}$2${normal} gibt es schon → Installation abgebrochen"
			exit
		fi
	fi
	echo "Erstelle Datei $2"			# create
	$1 > $2						# call subroutine $1 and write to file $2
}

## show options if NEO is not installed so far
install_options()
{
	echo "Bislang gibt es kein vollständig konfiguriertes NEO auf Ihrem System."
	echo
	echo "Sie haben folgende Möglichkeiten:"
	echo
	echo " [1]  NEO nur testen"
	echo "       Sie haben die Möglichkeit, NEO zu testen, Ihre Standardbelegung (in der Regel QWERTZ) bleibt erhalten."
	echo
	echo
	echo " [2] NEO als Standardbelegung"
	echo "       Mit dieser Option wird NEO die neue Standardbelegung für diesen Benutzer und nach (nicht vor!) dem"
	echo "       Login automatisch aktiviert"
	echo
	echo
	echo -e " Wenn ${green}installiere_neo${normal} ein weiteres Mal aufgerufen wird, haben Sie weitere Optionen – z.B. die Deinstallation von NEO"
	echo

	installoption=""
	while [ ! $installoption ]			# choose between QWERTZ or NEO as standard
	do						# switch with ›asdf‹ and ›uiae‹
		echo
		read -p "Wählen Sie eine Option [1,2]: " -e installoption
	        case $installoption in
                2)
                        echo
                        echo "Nach dem Login wird NEO die Standardbelegung sein."
                        echo -e "Um dies zu ändern, kann ${green}installiere_neo${normal} ein weiteres Mal ausgeführt werden."
			echo -e ${red}
			read -n1 -p "Drücken Sie eine Taste um fortzufahren oder STRG+C zum Abbrechen"
			echo -e ${normal}
                        ;;
                1)
                        echo
                        echo "Das Standardlayout wird nicht verändert."
                        echo -e "Zu NEO kann man jederzeit mit der Abrollbewegung ${green}asdf${normal} wechseln."
			echo -e ${red}
			read -n1 -p "Drücken Sie eine Taste um fortzufahren oder STRG+C zum Abbrechen"
			echo -e ${normal}
                        ;;
                *)
                        echo
                        echo "Bitte wählen Sie die Optionen 1, um NEO zu testen oder 2, um NEO zur Standardbelegung zu machen"
			installoption=""
                        ;;
                esac
	done


	echo
	echo "Installation von NEO mit xmodmap wird gestartet…"
	echo
	echo

# *** main installation process ***
# creating a directory $inst_dir
	if [ -d $inst_dir ]
	then
		echo -e "Das Verzeichnis ${red}$inst_dir${normal} gibt es bereits – wird verwendet…"
	else
		echo -e "Erstelle $inst_dir"
		mkdir $inst_dir
	fi

# creating NEO files in $inst_dir
	create neo_xmodmap $inst_dir/neo_de.xmodmap
	create neo_alternative $inst_dir/neo_de_alternative.xmodmap
	create neo_xprog $inst_dir/neo_de_x-prog.xmodmap
	create neo_console $inst_dir/neo.map
	create neo_asdf $inst_dir/asdf
	chmod u+x $inst_dir/asdf
	create neo_uiae $inst_dir/uiae
	chmod u+x $inst_dir/uiae
	create neo_referenz $inst_dir/neo20.txt
	create neo_neo $inst_dir/neo
	chmod u+x $inst_dir/neo
	create neo_num $inst_dir/num
	chmod u+x $inst_dir/num
	create neo_wiemitneo $inst_dir/wiemitneo
	chmod u+x $inst_dir/wiemitneo
	create neo_beschreibe $inst_dir/beschreibe
	chmod u+x $inst_dir/beschreibe

	echo "Ergänze die Compose-Erweiterung von NEO…"
	create neo_compose $inst_dir/Compose.neo
	if [ -f $HOME/.XCompose ]
	then
		echo -e "Die Datei ${red}$HOME/.XCompose${normal} gibt es bereits – soll die bestehende Datei überschrieben werden? \c"; read -p "[J,N] " -e overwrite
		if [ "$overwrite" = "J" ]		# overwrite?
		then
			echo "Datei $HOME/.XCompose wird überschrieben!"
			cat /usr/share/X11/locale/en_US.UTF-8/Compose $inst_dir/Compose.neo > $HOME/.XCompose
		else
			echo -e "Datei ${red}$HOME/.XCompose${normal} bleibt erhalten, jedoch kann die Compos-Erweiterung von NEO nicht genutzt werden."
		fi
	else
		cat /usr/share/X11/locale/en_US.UTF-8/Compose $inst_dir/Compose.neo > $HOME/.XCompose
	fi

	create neorc $HOME/.neorc

# entry in $HOME/.profile with NEO or QWERTZ as standard keyboard layout after login
	case $installoption in 
	2)
		echo
		echo "Nach dem Login wird NEO die Standardbelegung sein."
		echo -e "Um dies zu ändern, kann ${green}installiere_neo${normal} ein weiteres Mal ausgeführt werden."
		rmfromprofile
		profile_neo >> $HOME/.profile
		;;
	1)
		echo
		echo "Das Standardlayout wird nicht verändert."
		rmfromprofile
		profile_qwertz >> $HOME/.profile
		;;
	esac
}

# remove files for uninstall option
remove()
{
	echo "Entferne $1"
	rm $1 || echo -e "${red}Konnte die Datei $1 nicht entfernen!${normal}"
}

# remove all directories, files and entries made by ›installiere_neo‹
deinstall()
{
	echo
	echo
	rmfromprofile
	remove $HOME/.neorc
	remove $inst_dir/starte_neo
	remove $inst_dir/Compose.neo
	remove $inst_dir/neo20.txt
	remove $inst_dir/beschreibe
	remove $inst_dir/wiemitneo
	remove $inst_dir/num
	remove $inst_dir/neo
	remove $inst_dir/uiae
	remove $inst_dir/asdf
	remove $inst_dir/neo.map
	remove $inst_dir/neo_de_alternative.xmodmap
	remove $inst_dir/neo_de_x-prog.xmodmap
	remove $inst_dir/neo_de.xmodmap
	echo "Entferne $inst_dir/"
	rmdir $inst_dir/ || echo -e "${red}Konnte das Verzeichenis $inst_dir/ nicht entfernen!${normal}"
}

# show options if NEO is already installed
deinstall_options()
{
	echo "Es gibt auf Ihrem System bereits eine Konfiguration für NEO."
	echo
	echo "Sollte NEO nur für diesen Benutzer installiert sein, haben Sie folgende Möglichkeiten:"
	echo
	echo " [1]  NEO zukünftig nicht mehr als Standardbelegung"
	echo -e "       NEO wird nicht länger direkt nach dem Login zur Verfügung stehen, wohl aber nach Eingabe von ${green}adsf${normal}."
	echo
	echo
	echo " [2] NEO vollständig vom System entfernen"
	echo "       Dieso Option entfernt alle zuvor angelegten Verzeichnisse, Datein und Einträge zur NEO-Belegung."
	echo
	echo
	echo -e " Diese Optionen funktionieren nur dann zuverlässig, wenn NEO auch mit ${green}installiere_neo${normal} installiert wurde"
	echo

	deinstalloption=""
	while [ ! $deinstalloption ]					# choose between deleting NEO as standard layout or delete NEO at all
	do								# if deleted as standard layout only, ›asdf‹ is still working
		echo
		read -p "Wählen Sie eine Option [1,2]: " -e deinstalloption
	        case $deinstalloption in
                2)
                        echo
                        echo -e "Alle zuvor von ${green}installiere_neo${normal} vorgenommen Änderungen am System werden gelöscht!"
			echo -e ${red}
			read -n1 -p "Drücken Sie eine Taste um fortzufahren oder STRG+C zum Abbrechen"
			echo -e ${normal}
			cd $inst_dir
			./uiae
			deinstall					# full deinstallation
			echo
			echo -e "Alle von ${green}installiere_neo${normal} gemachten Änderungen an Ihrem System wurden entfernt."
                        ;;
                1)
                        echo
                        echo "NEO wird als Standardbelegung entfernt"
                        echo -e "Zu NEO kann man weiterhin jederzeit mit der Abrollbewegung ${green}asdf${normal} wechseln."
			echo -e ${red}
			read -n1 -p "Drücken Sie eine Taste um fortzufahren oder STRG+C zum Abbrechen"
			echo -e ${normal}
			echo
			rmfromprofile					# alter the entry in $HOME/.profile; first: remove old entry
			profile_qwertz >> $HOME/.profile		# write the new entry
			echo
			echo "Nach dem nächsten Login wird NEO nicht mehr die Standardbelegung sein. "
                        ;;
                *)
                        echo
                        echo "Bitte wählen Sie die Optionen 1, um NEO nicht länger als Standardbelegung zu nutzen"
			echo " oder 2, um NEO vollständig zu entfernen."
			deinstalloption=""
                        ;;
                esac
	done
}
