[sisyphus] Q: new /sbin/setsysfont works for you?
Ivan Zakharyaschev
=?iso-8859-1?q?imz_=CE=C1_altlinux=2Eru?=
Пт Фев 7 21:12:34 MSK 2003
Hello!
Вашему вниманию предлагается скрипт /sbin/setsysfont, который
должен попасть в следующие выпуски initscripts. (Он используется
при загрузке системы, чтобы настроить шрифты в linux-консоли для
работы с основным языком системы.)
Если не сложно, потестируйте его, пожалуйста, у себя: всё ли
нормально с русским и другими языками в linux-консоли в Вашей
конфигурации при использовании нового скрипта.
Не надо загружать рассылку большим количеством отзывов. Если всё
хорошо, то можно сообщить об этом мне лично (в sisyphus@ писать
не надо). Если раньше было плохо, а теперь стало хорошо, то это
тем более интересно! -- но написать об этом всё равно лучше мне
лично. А если что-то не работает или не понятно, то тогда
эффективнее написать об этом в sisyphus@ и попробовать вместе
понять, в чём дело.
Раньше были проблемы, например, когда /usr монтируется позже.
(См. No. 0001048 & 0002083 на bugs.altlinux.ru.) Ещё из
нововведний: раздельная загрузка шрифта и ACM (это независмые
вещи -- и если одно не получается, другое всё равно может
пригодиться.)
--
С наилучшими пожеланиями,
Иван Захарьящев, Москва
----------- следующая часть -----------
#!/bin/sh
# ALT's /sbin/setsysfont.
# Agrees with RH's initscripts-7.06-1.
# Last change: by imz на altlinux.ru on 2003 Feb 7.
# Source library functions
. /etc/init.d/functions
EXECPATH=(/bin /usr/bin)
# inspired by FindFile() form /etc/init.d/functions (initscripts-5.49-ipl49mdk)
FindExec()
{
local n f d
for n in "$@"; do
for d in "${EXECPATH[@]}"; do
f="$d/$n"
if [ -x "$f" ]; then
echo "$f"
return 0
fi
done
done
return 1
}
addLoadableData() {
local option="$1" name="$2" type
case "$option" in
--font) type=psf ;;
*) type="${option#--}" ;;
esac
if [ -n "$name" ]; then
args[${#args[@]}]="$option"
local found
if found="$(FindFile "/etc/sysconfig/console/$name.$type")"; then
args[${#args[@]}]="$found"
else
args[${#args[@]}]="$name"
fi
fi
# An alternative to FindFile() and the corresponding readbility test could be
# a test performed by consolechars themselves, like this:
#
# "$CONSOLECHARS" --no-act "$option" "$f"
#
# But I don't think such complexity is reasonable here.
# imz на altlinux.ru, Feb 2003.
}
if [ "$LANG" = POSIX -o "$LANGUAGE" = POSIX ]; then
SourceIfNotEmpty /etc/sysconfig/i18n
fi
# Our parameters:
readonly SYSFONT UNIMAP SYSFONTACM
readonly \
CONSOLECHARS="$(FindExec consolechars)" \
SETFONT="$(FindExec setfont)"
if [ -z "$CONSOLECHARS" -a -z "$SETFONT" ]; then
echo "${0##*/}: cannot set font because no tools found." >&2
exit 1
fi
let 'RETVAL = 0'
############### Set font (+ the map for its encoding) #################
if [ -n "$CONSOLECHARS" ]; then
args=()
addLoadableData --font "$SYSFONT"
addLoadableData --sfm "$UNIMAP"
"$CONSOLECHARS" "$@" "${args[@]}"
else # if [ -n "$SETFONT" ]; then
if [ -n "$SYSFONT" ]; then
"$SETFONT" "$SYSFONT" ${UNIMAP:+-u "$UNIMAP"}
fi
fi || let 'RETVAL |= 1'
# Font set. If not, RETVAL & 1.
############## Set ACM ################
# for newer fonts and ACMs it's value is independent of the system font:
# stage 1: application --> ACM (charmap -> Unicode) --> Unicode data -->
# stage 2: --> Unicode data --> SFM (Unicode -> font encoding) --> data
# encoded corresponding to the console font.
#
# Perhaps this should be done in a separate script.
# Another enhancement would be to fall back on $(locale charmap)
# (or its lower-case variant) -- but the utilities are in /usr/bin/;
# something like this is done only for the Unicode case now.
# We examine only LANG here. What about LC_CTYPE, LC_ALL, LANGUAGE
# -- they can also indicate a Unicode console.
case "$LANG" in
*.utf8|*.UTF-8)
# In this case, there is no ACM: applications output data
# already in Unicode; the first stage is not needed.
# The font and SFM has been set already;
# unicode_start will use the current settings
unicode_start || let 'RETVAL |= 2'
exit $RETVAL
;;
esac
if [ -n "$SYSFONTACM" ]; then
if [ -n "$CONSOLECHARS" ]; then
args=()
addLoadableData --acm "$SYSFONTACM"
"$CONSOLECHARS" "$@" "${args[@]}"
else # if [ -n "$SETFONT" ]; then
"$SETFONT" -m "$SYSFONTACM"
echo -ne '\e(K' > /dev/console
fi
fi || let 'RETVAL |= 2'
# ACM set. If not, RETVAL & 2.
exit $RETVAL
Подробная информация о списке рассылки Sisyphus