#!/bin/sh
# written by Tobias Powalowski <tpowa@archlinux.org>

ANSWER="/tmp/.km"
TITLE="Arch Linux Keymap And Font Setting"
BASEDIR="/usr/share/kbd"

abort()
{
	dodialog yesno "Abort Keymap And Font Setting?" 6 40 || return 0
	[ -e /tmp/.km ] && rm -f /tmp/.km
	[ -e /tmp/.keymap ] && rm -f /tmp/.keymap
	[ -e /tmp/.font ] && rm -f /tmp/.font
        [ -e /tmp/.km-running ] && rm /tmp/.km-running
	clear
	exit 0
}

dodialog()
{
	# use this for msgbox, inputbox, yesno, infobox
	#
	# dodialog <boxtype> <text> [height] [width] [other]
	# 26/3/06: added an option so that if [other] is default=no 
	#	   the dialog will default to no
	# the new dialog's auto-sizing is pretty dumb, we can't trust it
	height=12
	width=65
	if [ "$3" != "" ]; then
		height=$3
	fi
	if [ "$4" != "" ]; then
		width=$4
	fi
	if [ "$5" == "default=no"  ]; then
		dialog --defaultno --backtitle "$TITLE" --aspect 15 --$1 "$2" $height $width 
		
	else
		dialog --backtitle "$TITLE" --aspect 15 --$1 "$2" $height $width $5
	fi
}

domenu()
{
	menutype=$1 ; shift
	text=$1     ; shift
	height=$1   ; shift
	width=$1    ; shift
	mheight=$1  ; shift
	
	dialog --cancel-label "Skip" --$menutype "$text" $height $width $mheight $*
}


dokeymap() {
	echo "Scanning for keymaps..."
	KEYMAPS=
	for i in $(find $BASEDIR/keymaps -follow -name "*.gz" | sed 's|^.*/||g' | sort); do
		KEYMAPS="$KEYMAPS $i -"
	done
	domenu menu "Select A Keymap" 22 60 16 $KEYMAPS 2>$ANSWER
	keymap=$(cat $ANSWER)
	echo $keymap > /tmp/.keymap
	if [ "$keymap" ]; then
		echo "Loading keymap: $keymap"
		#loadkeys -q $BASEDIR/keymaps/$keymap
		loadkeys -q $keymap
	fi
}

doconsolefont() {
	echo "Scanning for fonts..."
	FONTS=
	# skip .cp.gz and partialfonts files for now see bug #6112, #6111
	for i in $(find $BASEDIR/consolefonts -maxdepth 1 ! -name '*.cp.gz' -name "*.gz"  | sed 's|^.*/||g' | sort); do
		FONTS="$FONTS $i -"
	done
	domenu menu "Select A Console Font" 22 60 16 $FONTS 2>$ANSWER
	font=$(cat $ANSWER)
	echo $font > /tmp/.font
	if [ "$font" ]; then
		echo "Loading font: $font"
		for i in $(seq 1 6); do
			if [ -d /dev/vc ]; then
				setfont $BASEDIR/consolefonts/$font -C /dev/vc/${i}
			else
				setfont $BASEDIR/consolefonts/$font -C /dev/tty${i}
			fi
		done
		[ -e /dev/ttys0 ] &&  setfont $BASEDIR/consolefonts/$font -C /dev/ttyS0
	fi
}

mainmenu() {
	if [ -n "$S_NEXTITEM" ]; then
		DEFAULT="--default-item $S_NEXTITEM"
	else
		DEFAULT=""
	fi
	dialog $DEFAULT --backtitle "$TITLE" --title " MAIN MENU " \
		--menu "Use the UP and DOWN arrows to navigate menus. Use TAB to switch between buttons and ENTER to select." 15 55 8 \
		"1" "Set Keymap" \
		"2" "Set Consolefont" \
		"3" "Exit" 2>$ANSWER
	case $(cat $ANSWER) in
		"1")
			dokeymap
			;;
		"2")
			doconsolefont
			;;
		"3")
			[ -e /tmp/.km-running ] && rm /tmp/.km-running
			clear
			exit 0 ;;
		*)
			abort ;;
	esac
}

: >/tmp/.keymap
: >/tmp/.font
: >/tmp/.km

if [ ! -d $BASEDIR/keymaps ]; then
	echo "Cannot load keymaps, as none were found in $BASEDIR/keymaps" >&2
	exit 1
fi

if [ ! -d $BASEDIR/consolefonts ]; then
	echo "Cannot load consolefonts, as none were found in $BASEDIR/consolefonts" >&2
fi

if [ ! $(which loadkeys) ]; then
	echo "'loadkeys' binary not found!" >&2
	exit 1
fi


if [ ! $(which setfont) ]; then
	echo "'setfont' binary not found!" >&2
	exit 1
fi

if [ -e /tmp/.km-running ]; then
	echo "km already runs on a different console!"
	echo "Please remove /tmp/.km-running first to launch tz!"
	exit 1
fi 
: >/tmp/.km-running

while $(/bin/true); do
	mainmenu
done

clear
exit 0

