#!/bin/sh
# Enables Unicode processing in the current console.

# 0. Check whether we're on a console
TTY=`/usr/bin/tty`
case $TTY in
	/dev/console|/dev/tty[0-9]*)
		;;
	*)
		echo "unicode_start skipped on $TTY"
		exit 0
		;;
esac

# 1. The input side: the keyboard driver.

# Set the keyboard driver in Unicode mode. (Default is ASCII mode.)
# This really does nothing with the way normal keys are handled in
# the kernel. All it does is:
# - It is necessary for `dumpkeys' in order to not drop U+XXXX
#   entries from the keymaps.
# - It is necessary for `loadkeys' in order to avoid warnings.
# - Unicode characters typed as Alt-x1 ... Alt-xn (where x1,...,xn
#   are digits on the numeric keypad) will be emitted in UTF-8.

kbd_mode -u

# Change the keyboard mapping in such a way that the non-ASCII keys
# produce UTF-8 encoded multibyte sequences, instead of single bytes
# >= 0x80 in a legacy 8-bit encoding.

# There is no way of reverting the effect of "dumpkeys | loadkeys --unicode",
# the memory of the earlier keymap is lost. Therefore, try
# to save a copy of the original keymap to be able to reload it in unicode_stop.
# (see also http://mail.nl.linux.org/linux-utf8/2003-08/msg00053.html):

test -z "$HOME" -o "/" == "$HOME" && HOME=/root
test -d $HOME/.kbd || mkdir $HOME/.kbd
dumpkeys > $HOME/.kbd/.keymap_sv

# redirect stderr and stdout of loadkeys to /dev/null to avoid the confusing
# "plus before udiaeresis ignored" warnings.

dumpkeys | loadkeys --unicode > /dev/null 2>&1

# 2. The output side: the console screen.

# Tell the console output driver that the bytes arriving are UTF-8
# encoded multibyte sequences.

echo -n -e '\033%G'

# Tell the graphics card how to display Unicode characters not
# contained in the IBM 437 character set (on PCs). The font should
# have a Unicode map attached, or explicitly specified, e.g.,
# by giving `def.uni' as a second argument.

DEFAULT_UNICODE_FONT=LatArCyrHeb-16
# Also drdos8x16 is a good candidate.

# Fonts with 512 glyphs like LatArCyrHeb-16 make it impossible to use bold
# on the console, which makes YaST2 unusable. To be able to use bold,
# only fonts with 256 glyphs can be used. Therefore we prefer
# the font specified in /etc/sysconfig/console. This should be OK because
# the default font written to /etc/sysconfig/console by YaST2
# is currently always a font with 256 glyphs and a Unicode map
# which is suitable for the language used during the installation.

case $# in
	2)
		setfont $1 -u $2
		;;
	1)
		setfont $1
		;;
	0)
		if [ -f /etc/sysconfig/console ] ; then
		    . /etc/sysconfig/console
		fi
		if [ -n "$CONSOLE_FONT" ] ; then
			SETFONT_ARGS="$CONSOLE_FONT"
		    if [ -n "$CONSOLE_UNICODEMAP" ] ; then
			SETFONT_ARGS="$SETFONT_ARGS -u $CONSOLE_UNICODEMAP"
		    fi
		    if [ -n "$CONSOLE_SCREENMAP" ] ; then
			SETFONT_ARGS="$SETFONT_ARGS -m $CONSOLE_SCREENMAP"
		    fi
		    setfont $SETFONT_ARGS
		    if [ -n "$CONSOLE_MAGIC" -a "$CONSOLE_MAGIC" != "none" ] ; then
			echo -en "\033$CONSOLE_MAGIC"
		    fi
		else
		    setfont $DEFAULT_UNICODE_FONT
		fi
		;;
	*)
		echo "usage: unicode_start [font [unicode map]]"
		;;
esac
