diff --git a/ChangeLog b/ChangeLog index 31962c3ba..35ca74fd7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2012-02-24 Vladimir Serbinenko + + * grub-core/font/font.c (grub_font_load): Add support for default + path for fonts ($prefix/fonts). + * grub-core/kern/corecmd.c (grub_core_cmd_insmod): Unify condition + for checking if string is a path. + * grub-core/normal/main.c (features): Add feature_default_font_path. + * util/grub-mkconfig.in: Skip mangling of GRUB_FONT into GRUB_FONT_PATH. + * util/grub.d/00_header.in: Use default directory if possible. + * util/grub-install.in: Install unicode.pf2. + 2012-02-24 Vladimir Serbinenko * po/README: Add de_CH and en@quot to po/LINGUAS generation command. diff --git a/grub-core/font/font.c b/grub-core/font/font.c index e0597ea45..93fbb710f 100644 --- a/grub-core/font/font.c +++ b/grub-core/font/font.c @@ -29,6 +29,7 @@ #include #include #include +#include GRUB_MOD_LICENSE ("GPLv3+"); @@ -433,7 +434,30 @@ grub_font_load (const char *filename) grub_printf ("add_font(%s)\n", filename); #endif - file = grub_buffile_open (filename, 1024); + if (filename[0] == '(' || filename[0] == '/' || filename[0] == '+') + file = grub_buffile_open (filename, 1024); + else + { + const char *prefix = grub_env_get ("prefix"); + char *fullname, *ptr; + if (!prefix) + { + grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("variable `%s' isn't set"), + "prefix"); + goto fail; + } + fullname = grub_malloc (grub_strlen (prefix) + grub_strlen (filename) + 1 + + sizeof ("/fonts/") + sizeof (".pf2")); + if (!fullname) + goto fail; + ptr = grub_stpcpy (fullname, prefix); + ptr = grub_stpcpy (ptr, "/fonts/"); + ptr = grub_stpcpy (ptr, filename); + ptr = grub_stpcpy (ptr, ".pf2"); + *ptr = 0; + file = grub_buffile_open (fullname, 1024); + grub_free (fullname); + } if (!file) goto fail; diff --git a/grub-core/kern/corecmd.c b/grub-core/kern/corecmd.c index b94f199a5..eec575c05 100644 --- a/grub-core/kern/corecmd.c +++ b/grub-core/kern/corecmd.c @@ -79,17 +79,15 @@ static grub_err_t grub_core_cmd_insmod (struct grub_command *cmd __attribute__ ((unused)), int argc, char *argv[]) { - char *p; grub_dl_t mod; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); - p = grub_strchr (argv[0], '/'); - if (! p) - mod = grub_dl_load (argv[0]); - else + if (argv[0][0] == '/' || argv[0][0] == '(' || argv[0][0] == '+') mod = grub_dl_load_file (argv[0]); + else + mod = grub_dl_load (argv[0]); if (mod) grub_dl_ref (mod); diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c index 707917013..ceeaa794d 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -474,7 +474,8 @@ static grub_command_t cmd_clear; static void (*grub_xputs_saved) (const char *str); static const char *features[] = { - "feature_chainloader_bpb", "feature_ntldr", "feature_platform_search_hint" + "feature_chainloader_bpb", "feature_ntldr", "feature_platform_search_hint", + "feature_default_font_path" }; GRUB_MOD_INIT(normal) diff --git a/util/grub-install.in b/util/grub-install.in index c76a029bd..cbb37ead2 100644 --- a/util/grub-install.in +++ b/util/grub-install.in @@ -451,6 +451,11 @@ if test -d "${pkgdatadir}"/themes/starfield; then cp "${pkgdatadir}"/themes/starfield/* "${grubdir}"/themes/starfield fi +if test -f "${pkgdatadir}"/unicode.pf2; then + mkdir -p "${grubdir}"/fonts + cp "${pkgdatadir}"/unicode.pf2 "${grubdir}"/fonts +fi + is_path_readable_by_grub "${grubdir}/${target_cpu}-$platform" || (echo "${grubdir}" not readable 1>&2 ; exit 1) # Write device to a variable so we don't have to traverse /dev every time. diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in index 9c405053f..198bd37a9 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -156,41 +156,6 @@ if [ "x${GRUB_TERMINAL_OUTPUT}" = "x" ]; then termoutdefault=1; fi -for x in ${GRUB_TERMINAL_OUTPUT}; do - if [ "x${x}" = "xgfxterm" ]; then - if [ -n "$GRUB_FONT" ] ; then - if is_path_readable_by_grub ${GRUB_FONT} > /dev/null ; then - GRUB_FONT_PATH=${GRUB_FONT} - else - echo "No such font or not readable by grub: ${GRUB_FONT}" >&2 - exit 1 - fi - else - for dir in ${pkgdatadir} ${GRUB_PREFIX} /usr/share/grub ; do - for basename in unicode unifont ascii; do - path="${dir}/${basename}.pf2" - if is_path_readable_by_grub ${path} > /dev/null ; then - GRUB_FONT_PATH=${path} - else - continue - fi - if [ "${basename}" = "ascii" ] ; then - # make sure all our children behave in conformance with ascii.. - export LANG=C - fi - break 2 - done - done - fi - if [ -z "${GRUB_FONT_PATH}" ] ; then - if [ "x$termoutdefault" != "x1" ]; then - gettext "No font for video terminal found." >&2; echo >&2 ; exit 1 - fi - GRUB_TERMINAL_OUTPUT= - fi - fi -done - for x in ${GRUB_TERMINAL_OUTPUT}; do case "x${x}" in xgfxterm) ;; @@ -208,7 +173,7 @@ export GRUB_DEVICE \ GRUB_DEVICE_BOOT \ GRUB_DEVICE_BOOT_UUID \ GRUB_FS \ - GRUB_FONT_PATH \ + GRUB_FONT \ GRUB_PRELOAD_MODULES \ GRUB_PREFIX diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in index 781d7d47e..e47d5ba17 100644 --- a/util/grub.d/00_header.in +++ b/util/grub.d/00_header.in @@ -124,11 +124,47 @@ if [ "x$serial" = x1 ]; then fi if [ "x$gfxterm" = x1 ]; then - # Make the font accessible - prepare_grub_to_access_device `${grub_probe} --target=device "${GRUB_FONT_PATH}"` + if [ -n "$GRUB_FONT" ] ; then + # Make the font accessible + prepare_grub_to_access_device `${grub_probe} --target=device "${GRUB_FONT}"` + cat << EOF +if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT}"` ; then +EOF + else + for dir in ${pkgdatadir} ${GRUB_PREFIX} /usr/share/grub ; do + for basename in unicode unifont ascii; do + path="${dir}/${basename}.pf2" + if is_path_readable_by_grub ${path} > /dev/null ; then + font_path=${path} + else + continue + fi + break 2 + done + done + if [ -n "${font_path}" ] ; then + cat << EOF +if [ x\$feature_default_font_path = xy ] ; then + font=unicode +else +EOF + + # Make the font accessible + prepare_grub_to_access_device `${grub_probe} --target=device "${font_path}"` + cat << EOF + font="`make_system_path_relative_to_its_root "${font_path}"`" +fi + +if loadfont \$font ; then +EOF + else + cat << EOF +if loadfont unicode ; then +EOF + fi + fi cat << EOF -if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT_PATH}"` ; then set gfxmode=${GRUB_GFXMODE} load_video insmod gfxterm