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 <phcoder@gmail.com>
+
+ * 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 <phcoder@gmail.com>
* po/README: Add de_CH and en@quot to po/LINGUAS generation command.
#include <grub/charset.h>
#include <grub/unicode.h>
#include <grub/fontformat.h>
+#include <grub/env.h>
GRUB_MOD_LICENSE ("GPLv3+");
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;
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);
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)
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.
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) ;;
GRUB_DEVICE_BOOT \
GRUB_DEVICE_BOOT_UUID \
GRUB_FS \
- GRUB_FONT_PATH \
+ GRUB_FONT \
GRUB_PRELOAD_MODULES \
GRUB_PREFIX
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