nixos: Add support for scalable fonts in Grub menus (#26227)

The default font is unreadably small on some hidpi displays. This
makes it possible to specify a TrueType or OpenType font at any point
size, and it will automatically be converted to the format the Grub
uses.
This commit is contained in:
Benjamin Staffin 2017-06-10 09:53:24 -04:00 committed by GitHub
parent 1fe951816c
commit 700e22f7bf
2 changed files with 34 additions and 2 deletions

View File

@ -64,11 +64,21 @@ let
)) + ":" + (makeSearchPathOutput "bin" "sbin" [ )) + ":" + (makeSearchPathOutput "bin" "sbin" [
pkgs.mdadm pkgs.utillinux pkgs.mdadm pkgs.utillinux
]); ]);
font = if lib.last (lib.splitString "." cfg.font) == "pf2"
then cfg.font
else "${convertedFont}";
}); });
bootDeviceCounters = fold (device: attr: attr // { "${device}" = (attr."${device}" or 0) + 1; }) {} bootDeviceCounters = fold (device: attr: attr // { "${device}" = (attr."${device}" or 0) + 1; }) {}
(concatMap (args: args.devices) cfg.mirroredBoots); (concatMap (args: args.devices) cfg.mirroredBoots);
convertedFont = (pkgs.runCommand "grub-font-converted.pf2" {}
(builtins.concatStringsSep " "
([ "${realGrub}/bin/grub-mkfont"
cfg.font
"--output" "$out"
] ++ (optional (cfg.fontSize!=null) "--size ${toString cfg.fontSize}")))
);
in in
{ {
@ -276,7 +286,7 @@ in
extraInitrd = mkOption { extraInitrd = mkOption {
type = types.nullOr types.path; type = types.nullOr types.path;
default = null; default = null;
example = "/boot/extra_initrafms.gz"; example = "/boot/extra_initramfs.gz";
description = '' description = ''
The path to a second initramfs to be supplied to the kernel. The path to a second initramfs to be supplied to the kernel.
This ramfs will not be copied to the store, so that it can This ramfs will not be copied to the store, so that it can
@ -305,6 +315,24 @@ in
''; '';
}; };
font = mkOption {
type = types.nullOr types.path;
default = "${realGrub}/share/grub/unicode.pf2";
description = ''
Path to a TrueType, OpenType, or pf2 font to be used by Grub.
'';
};
fontSize = mkOption {
type = types.nullOr types.int;
example = literalExample 16;
default = null;
description = ''
Font size for the grub menu. Ignored unless <literal>font</literal>
is set to a ttf or otf font.
'';
};
gfxmodeEfi = mkOption { gfxmodeEfi = mkOption {
default = "auto"; default = "auto";
example = "1024x768"; example = "1024x768";

View File

@ -67,6 +67,7 @@ my $gfxmodeEfi = get("gfxmodeEfi");
my $gfxmodeBios = get("gfxmodeBios"); my $gfxmodeBios = get("gfxmodeBios");
my $bootloaderId = get("bootloaderId"); my $bootloaderId = get("bootloaderId");
my $forceInstall = get("forceInstall"); my $forceInstall = get("forceInstall");
my $font = get("font");
$ENV{'PATH'} = get("path"); $ENV{'PATH'} = get("path");
die "unsupported GRUB version\n" if $grubVersion != 1 && $grubVersion != 2; die "unsupported GRUB version\n" if $grubVersion != 1 && $grubVersion != 2;
@ -281,7 +282,7 @@ else {
insmod vbe insmod vbe
fi fi
insmod font insmod font
if loadfont " . $grubBoot->path . "/grub/fonts/unicode.pf2; then if loadfont " . $grubBoot->path . "/converted-font.pf2; then
insmod gfxterm insmod gfxterm
if [ \"\${grub_platform}\" = \"efi\" ]; then if [ \"\${grub_platform}\" = \"efi\" ]; then
set gfxmode=$gfxmodeEfi set gfxmode=$gfxmodeEfi
@ -294,6 +295,9 @@ else {
fi fi
"; ";
if ($font) {
copy $font, "$bootPath/converted-font.pf2" or die "cannot copy $font to $bootPath\n";
}
if ($splashImage) { if ($splashImage) {
# FIXME: GRUB 1.97 doesn't resize the background image if it # FIXME: GRUB 1.97 doesn't resize the background image if it
# doesn't match the video resolution. # doesn't match the video resolution.